
Immer wenn ich zusammen mit dem Ausführungsbefehl dieses Makefiles eine Version erwähne, sollte diese Version in der Variable VERSION gespeichert werden. Wenn keine Version erwähnt wird, sollte der Standardwert verwendet werden.
Dies ist mein Makefile
export $(BUILDVERSION) = $2
VERS = VABCDE.00.00A002
$(info BUILDVERSION is "$(BUILDVERSION)")
$(info vers is "$(VERS)")
ifneq ($(BUILDVERSION),undefined)
VERSION := $(VERS)
endif
ifneq ($(BUILDVERSION),undefined)
VERSION := $(BUILDVERSION)
endif
$(info VERSION is $(VERSION))
FALL 1: Ich erhalte diese Ausgabe, wenn ich ein Argument für die Ausführung einschließe
BUILDVERSION is "VABCDE.00.00A001"
vers is VABCDE.00.00A002
VERSION is "VABCDE.00.00A001"
FALL 2: Ich erhalte diesen Fehler, wenn ich kein Argument für die Ausführung einschließe
Makefile:1: *** empty variable name. Stop.
Makefile:1: *** empty variable name. Stop.
Kann mir bitte jemand helfen, den Fehler in meinem Code herauszufinden?
Antwort1
Ich bin nicht sicher, ich verstehe die Frage.
Wenn Ihre Aufgabe darin besteht, eine Versionsnummer von außerhalb anzugeben make
und den Standardwert zu verwenden, wenn in der Befehlszeile keine Version angegeben wurde, makefile
sollte das folgendermaßen aussehen:
VERS = VABCDE.00.00A002
$(info BUILDVERSION is "$(BUILDVERSION)")
$(info vers is "$(VERS)")
ifdef BUILDVERSION
VERSION := $(BUILDVERSION)
else
VERSION := $(VERS)
endif
$(info VERSION is $(VERSION))
Und Sie würden es aufrufen mit:
make BUILDVERSION="not-default-version"
Antwort2
export $(BUILDVERSION) = $2
tl;dr; GNU make ist nicht bash.
Das $(BUILDVERSION)
würde nur dann zu irgendetwas erweitert werden, wenn Sie es make
als aufrufen würden make BUILDVERSION=something
, was dazu führen würde, dass diese Zeile a) something
alsfunktionsähnliches Makrowelches sich zu seinem zweiten Argument erweitert, wenn es als verwendet wird $(call something, ...)
, und b) exportiert einleerUmgebungsvariable mit dem Namen something
der von Make Rules ausgeführten Befehle.
Wenn BUILDVERSION
es nicht definiert ist oder als leere Zeichenfolge definiert ist, wird dieser empty variable name
Fehler angezeigt.
$ make -f - <<'EOT' BUILDVERSION=something
export $(BUILDVERSION) = $2
all:; set | grep ^something; echo XXX $(call something,first,second)
EOT
set | grep ^something; echo XXX second
something=''
XXX second
$2
tutnichtErweitern Sie auf das zweite Argument, das in der Befehlszeile von make übergeben wird, weil … make nicht Bash ist.