Ist es möglich, mit GNU Make Variablen außerhalb von Regeln anzuzeigen?

Ist es möglich, mit GNU Make Variablen außerhalb von Regeln anzuzeigen?

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:

ifdefWarum 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 lsfü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 makewü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 makeverfü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 ruleund 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 macround 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<<<

verwandte Informationen