.PHONY tutte le regole in GNU creano file?


17

Sbaglio nella mia interpretazione che in sostanza dovrei semplicemente mettere prima di tutto le regole:

.PHONY: all of my rules

all:
    echo "Executing all ..."

of:
    echo "Executing of ..."

my:
    echo "Executing my ..."

rules:
    echo "Executing rules ..."

C'è mai un caso in cui non vorresti seguire questa "formula"?

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

Risposte:


23

La guida allo stile Makefile di Clark Grubb raccomanda che:

  • Tutti i bersagli falsi dovrebbero essere dichiarati rendendoli prerequisiti di .PHONY.
  • aggiungere ogni target falso come prerequisito di .PHONY immediatamente prima della dichiarazione target, anziché elencare tutti i target fasulli in un unico posto.
  • Nessun target di file dovrebbe essere un prerequisito di .PHONY.
  • i target fasulli non dovrebbero essere prerequisiti per i target dei file.

Per il tuo esempio, ciò significherebbe:

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

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

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

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

Sono PHONYammessi più obiettivi; vedi anche questa domanda Stack Overflow: "È possibile avere più target .PHONY in un makefile gnu?"

Inoltre, sebbene ciò non sia menzionato direttamente nella tua domanda, devi fare attenzione a non avere una PHONYdestinazione con lo stesso nome di un input effettivo o file intermedi nel tuo progetto. Ad esempio, se il tuo progetto ipoteticamente avesse un file di codice sorgente denominato rules(senza suffisso), l'inclusione di quella stringa in una PHONYdestinazione potrebbe compromettere il makecomportamento previsto .


1
ottima condivisione sulla guida di stile. grazie.
Tarabyte,

2

Penso che sia una buona pratica da seguire ma frammentarlo e mettere i frammenti anche dopo che le ricette con regole complete funzionano anche sul mio gmake (3.81):

Per esempio:

#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 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.