Ist es möglich, mit GNU Make Variablen außerhalb von Regeln anzuzeigen?
Betrachten Sie das folgende Makefile:
x = foo bar baz
ifdef x
@echo $(x)
endif
Das führt zuMakefile:4: *** commands commence before first target. Stop.
Wenn ich jedoch eine Regel hinzufüge, funktioniert es:
x = foo bar baz
ifdef x
t:
@echo $(x)
endif
Ist es wirklich notwendig, Regeln für die Ausgabe von Variablen zum Debuggen usw. hinzuzufügen?
Bonus:
ifdef
Warum führt die Entfernung von zu Makefile:3: *** missing separator. Stop.
?
x = foo bar baz
@echo $(x)
Antwort1
ähm, möglich, aber nutzlos.
Sie müssen verstehen, dass ein Makefile nicht wie ein Shell-Skript ist. Ein Makefile gibt Ziele an und was getan werden muss, um diese Ziele zu erreichen. Wenn Sie das im Hinterkopf behalten, wird die Ausführung eines falschen Befehls im Makefile zu einem konzeptionellen Problem. Wann wird dieser Befehl ausgeführt? Es gibt kein Ziel, das diesen Befehl auslösen würde.
Sie könnten:
MY_VAR := $(shell ls)
all:
@echo MY_VAR IS $(MY_VAR)
Beachten Sie, dass ich GNU angenommen habe make
. Dies wird ls
für Sie ausgeführt und legt die Ausgabe in ab MY_VAR
. Aber das ist ein Hack, den man vermeiden sollte.
Sie können auch ein zusätzliches Ziel versuchen
extra:
@echo $(x)
und fügen Sie dies als Voraussetzung für alle anderen Ziele hinzu.
Was den Bonus betrifft: Es liegt daran, dass die Zeile @echo $(x)
kein Trennzeichen hat. An dieser Stelle in der Datei make
würde man ein Ziel mit einem erwarten, :
und in dieser Zeile steht keins :
. (Es gibt natürlich auch andere Möglichkeiten, wie eine neue Variablenzuweisung usw.)
Antwort2
GNU make
verfügt über eine Funktion, die genau dies ermöglicht, und sie heißt $(info ....)
.
Sie können die folgende Zeile außerhalb von a platzieren rule
und GNU make führt sie aus:
$(info variable x = $x))
Und wenn Sie feststellen, dass Sie diese Art von Aufgabe wiederholt ausführen müssen, können Sie sie in eine abstrahieren macro
und bei Bedarf jederzeit wieder aufrufen:
make -f - <<\eof
dumpvar = $(info variable `$1' value is >>>$($1)<<<)
ssl_enable = NO
$(call dumpvar,ssl_enable)
.PHONY: all
all:;@:
eof
Auf Stout wird Folgendes angezeigt:
variable `ssl_enable' value is >>>NO<<<