.PHONY alle Regeln in GNU machen Datei?

16

Liege ich falsch in meiner Interpretation, dass ich im Grunde genommen erst die Regeln aufstellen sollte, bevor alle Regeln aufstellen:

.PHONY: all of my rules

all:
    echo "Executing all ..."

of:
    echo "Executing of ..."

my:
    echo "Executing my ..."

rules:
    echo "Executing rules ..."

Gibt es jemals einen Fall, in dem Sie dieser Formel nicht folgen möchten?

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

Tarabyte
quelle

Antworten:

23

Clark Grubbs Makefile - Styleguide empfiehlt Folgendes :

  • Alle gefälschten Ziele sollten deklariert werden, indem sie zu den Voraussetzungen von .PHONY gemacht werden.
  • Fügen Sie jedes falsche Ziel als Voraussetzung für .PHONY unmittelbar vor der Zieldeklaration hinzu, anstatt alle falschen Ziele an einem einzigen Ort aufzulisten.
  • Es sollten keine Dateiziele Voraussetzungen von .PHONY sein.
  • Gefälschte Ziele sollten keine Voraussetzungen für Dateiziele sein.

Für Ihr Beispiel würde dies bedeuten:

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

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

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

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

Es PHONYsind mehrere Ziele zulässig. Siehe auch diese Stapelüberlauf-Frage: "Ist es möglich, mehrere .PHONY-Ziele in einem Gnu-Makefile zu haben?"

Auch wenn dies nicht direkt in Ihrer Frage erwähnt wird, muss darauf geachtet werden, dass PHONYin Ihrem Projekt kein Ziel mit dem gleichen Namen einer tatsächlichen Eingabe- oder Zwischendatei vorhanden ist. Wenn Ihr Projekt beispielsweise hypothetisch eine Quellcodedatei mit dem Namen rules(ohne Suffix) hat, kann die Aufnahme dieser Zeichenfolge in ein PHONYZiel das erwartete makeVerhalten beeinträchtigen.

bnewbold
quelle
1
Hervorragender Anteil am Styleguide. Danke.
Tarabyte
2

Ich halte es für eine gute Praxis, diese zu befolgen, aber das Fragmentieren und Platzieren der Fragmente auch nach vollständigen Regelrezepten funktioniert auch bei meinem gmake (3.81):

Z.B:

#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
quelle