.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

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.


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 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.