6 Stimmen

Warum betrachtet make ein Ziel ohne Rezept nicht als veraltet, wenn es durch eine PHONY-Abhängigkeit aktualisiert wird?

.PHONY: b
c: a
    @touch c
    @echo "Changed"
a: b
b:
    @date +%s > a

Wenn make mit der Beispieldatei ausgeführt wird, wird "Changed" beim ersten Mal gedruckt, aber "Changed" wird erst bei der dritten, fünften, usw. Ausführung gedruckt. Das liegt daran, dass make nicht zu erkennen scheint, dass die Ausführung des Rezepts für Ziel "b" a aktualisiert.

Wenn Sie die Regel mit "a" als Ziel in ein leeres Rezept ändern, wird bei jedem Durchlauf von make "Changed" gedruckt (wie Sie es erwarten würden - wobei falsche Ziele immer als "veraltet" gelten). z.B..

a: b ;

Make sollte die implizite Regelsuche für PHONY-Ziele überspringen, aber "a" ist nicht PHONY. Wenn keine implizite Regel für "a" gefunden wird, ist es dann richtig, dass make nicht berücksichtigt, dass "a" durch seine PHONY-Abhängigkeit "b" verändert worden sein könnte?

2voto

Beta Punkte 91455

Make kann die Auswirkungen von Befehlen nicht analysieren, so dass es in der Verantwortung des Benutzers liegt, die Regeln korrekt zu organisieren.

Betrachten wir einen etwas anderen Fall:

d: c b
c: a
    @touch c
    @echo "Changed"
a:
b:
    @date +%s > a

Dies hat das gleiche Verhalten wie Ihr Beispiel; es gibt keine Möglichkeit, dass Make wissen könnte, dass c "wirklich" hängt ab von b . Der Autor des Makefiles ist schuld.

Jetzt sollte es so geschrieben werden:

c: a
        @touch c
        @echo "Changed"

.PHONY: a
a:
        @date +%s > a

Les a Regel ändert die Datei a (und PHONY ist nur dazu da, die a Regel zu laufen). Auf diese Weise können Sie make mitteilen, dass die @date ... Befehl modifiziert a . Dieses Makefile funktioniert korrekt.

Ihr Beispiel liegt in der Mitte zwischen diesen beiden. Wenn eine Regel eine Datei ändert, die das Ziel einer anderen Regel ist, ist das Makefile schlecht organisiert, und Make ist nicht schuld. Ja, Make könnte annehmen, dass ein Ziel, das von einer PHONY Regel kann aktualisiert worden sein wenn diese Regel ausgeführt wird, aber es könnte genauso gut angenommen werden, dass jedes Ziel kann aktualisiert worden sein, wenn eine Regel ausgeführt wird . Und wenn Make so paranoid wäre, wäre es nicht sehr effizient.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X