2012-07-20 7 views
7

Ich verstehe immer noch nicht, warum "falsche" Regeln in Makefiles haben ".PHONY" als Ziel. Es wäre viel logischer als Voraussetzung.Warum .PHONY: Ziel und nicht Ziel: .PHONY?

Muss ich näher darauf eingehen? Wenn A von B abhängt und B ist falsch, dann ist A auch falsch. So ist das Abhängigkeitsdiagramm .PHONYBA überraschend im Vergleich zu .PHONYBA. (Ein weiteres Argument ist, dass eine Implementierung von make muss das .PHONY Ziel ganz besondere handhaben.)

Während diese Kritik eher theoretisch erscheinen mag (zu sinnlos) - „da macht so alt ist, seine Syntax ist hier zu bleiben“. Aber ich bin keine Syntaxänderung vorschlägt, gibt es eine Alternative:

mit GNU Make (zumindest) die folgende Makefile erklärt ein Schwindler target_A:

target_A: _PHONY 
     touch target_A 

_PHONY: 
     #noop 

Frage 1: Diese so ist einfach und sauber, sicherlich bin ich nicht der erste Erfinder. In der Tat, warum hat make angesichts dieser Alternative jemals die spezielle Syntax benötigt?

Es scheint mir, dass dies würde auch ganz gut Fragen über wildcards in phony targets lösen, und könnte sogar shed some light on .PHONY's meaning, wenn Anfänger bezweifeln.

Frage 2: Können Sie an einen Umstand denken, bei dem dieser Ansatz unterlegen ist? (? Ist make .PHONY irgendwelcher Aufruf)

(Ich sollte erwähnen, dass, während ich andere make s aufgerufen haben, GNU Make ist die einzige Implementierung, die ich einige Erfahrung mit -. Lesen und Schreiben von Makefiles)

+0

(sollte RTFM haben) Das GNU Make-Handbuch tatsächlich [erwähnt dieses Rezept] (http://www.gnu.org/software/make/manual/html_node/Force-Targets.html#Force-Targets) als weniger effizient, aber portabler. Ich vermute, dass die Geschwindigkeitsgewinne vernachlässigbar sind. Dies deutet auf eine negative Antwort auf Frage 2 hin. (?) – tiwo

Antwort

3

Ein großes Problem bei der Verwendung von target_A: .PHONY ist, dass es viel schwieriger macht, viele eingebaute Variablen von make zu verwenden. Nehmen Sie dieses gemeinsame Rezept als Beispiel:

%.a: $(OBJ_FILES) 
    $(LD) $(LFLAGS) -o [email protected] $^ 

Die $^ Variable zieht in alles, die als Voraussetzung aufgeführt ist. Wenn dort auch .PHONY aufgeführt wäre, würde es an den Linker in der Befehlszeile übergeben, was wahrscheinlich nichts Gutes bewirken würde. Die Verwendung von Meta-Zielen wie .PHONY als Voraussetzungen macht diese eingebauten Variablen wesentlich weniger nützlich, da sie jedes Mal, wenn sie verwendet werden, viel zusätzliche Verarbeitung wie $(filter-out .PHONY,$^) erfordern. Die Beziehung umzukehren und statt dessen das Ziel .PHONY zu machen, ist etwas peinlich, um über Abhängigkeitsbäume nachzudenken, aber es räumt den Rest des Makefiles auf.

+0

Oh, ich verstehe. Und das Vorhandensein von [anderen "speziellen" Zielen] (http://www.gnu.org/software/make/manual/html_node/Special-Targets.html # Special-Targets) - einschließlich einiger, die nicht gut (semantisch) in den Abhängigkeitsgraphen überhaupt passen - scheint den "warum ist das so speziell" -Abwurf zu mildern. – tiwo