.PHONY toutes les règles dans GNU font un fichier?

17

Est-ce que je me trompe dans mon interprétation que je devrais simplement mettre d'abord avant de faire des règles:

.PHONY: all of my rules

all:
    echo "Executing all ..."

of:
    echo "Executing of ..."

my:
    echo "Executing my ..."

rules:
    echo "Executing rules ..."

Y a-t-il jamais un cas où vous ne voudriez pas suivre cette «formule»?

http://www.gnu.org/software/make/manual/make.html#Phony-Targets

tarabyte
la source

Réponses:

23

Le guide de style de Makefile de Clark Grubb recommande que:

  • Toutes les cibles bidon doivent être déclarées en faisant des prérequis de .PHONY.
  • ajoutez chaque cible bidon comme condition préalable à .PHONY immédiatement avant la déclaration de cible, plutôt que de répertorier toutes les cibles bidon en un seul endroit.
  • Aucune cible de fichier ne doit être un prérequis de .PHONY.
  • les cibles bidon ne doivent pas être des prérequis des cibles de fichiers.

Pour votre exemple, cela signifierait:

.PHONY: all
all:
    echo "Executing all ..."

.PHONY: of
of:
    echo "Executing of ..."

.PHONY: my
my:
    echo "Executing my ..."

.PHONY: rules
rules:
    echo "Executing rules ..."

Plusieurs PHONYcibles sont autorisées; voir aussi cette question Stack Overflow: "Est-il possible d'avoir plusieurs cibles .PHONY dans un makefile gnu?"

De plus, bien que cela ne soit pas mentionné directement dans votre question, il faut veiller à ne pas avoir une PHONYcible avec le même nom d'une entrée réelle ou des fichiers intermédiaires dans votre projet. Par exemple, si votre projet avait hypothétiquement un fichier de code source nommé rules(sans suffixe), l'inclusion de cette chaîne dans une PHONYcible pourrait briser le makecomportement attendu .

bnewbold
la source
1
excellente part sur le guide de style. Merci.
tarabyte
2

Je pense que c'est une bonne pratique à suivre, mais la fragmenter et mettre les fragments même après des recettes de règles complètes fonctionne aussi sur mon gmake (3.81):

Par exemple:

#Makefile
all:
   @echo hello world
.PHONY: all

CMD:

$ touch all
$ make all    #this would be a no-op if all weren't a phoney target
  hello world 
PSkocik
la source