So vermeiden Sie den Fehler „leerer Variablenname“ im Makefile

So vermeiden Sie den Fehler „leerer Variablenname“ im Makefile

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 makeund den Standardwert zu verwenden, wenn in der Befehlszeile keine Version angegeben wurde, makefilesollte 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 makeals aufrufen würden make BUILDVERSION=something, was dazu führen würde, dass diese Zeile a) somethingalsfunktionsähnliches Makrowelches sich zu seinem zweiten Argument erweitert, wenn es als verwendet wird $(call something, ...), und b) exportiert einleerUmgebungsvariable mit dem Namen somethingder von Make Rules ausgeführten Befehle.

Wenn BUILDVERSIONes nicht definiert ist oder als leere Zeichenfolge definiert ist, wird dieser empty variable nameFehler 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

$2tutnichtErweitern Sie auf das zweite Argument, das in der Befehlszeile von make übergeben wird, weil … make nicht Bash ist.

verwandte Informationen