Как избежать ошибки пустого имени переменной в Makefile

Как избежать ошибки пустого имени переменной в Makefile

Всякий раз, когда я упоминаю какую-либо версию вместе с командой выполнения этого make-файла, эта версия должна быть сохранена в переменной VERSION; если версия не указана, следует взять значение по умолчанию.

Это мой 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))

СЛУЧАЙ 1: Я получаю этот вывод, когда включаю аргумент для выполнения

BUILDVERSION is "VABCDE.00.00A001"
vers is VABCDE.00.00A002
VERSION is "VABCDE.00.00A001"

СЛУЧАЙ 2: Я получаю эту ошибку, когда не включаю аргумент для выполнения

Makefile:1: *** empty variable name.  Stop.
Makefile:1: *** empty variable name.  Stop.

Может ли кто-нибудь помочь мне найти ошибку в моем коде!

решение1

Я не уверен, я понял вопрос.

Если ваша задача — предоставить номер версии извне makeи использовать значение по умолчанию, если версия не была предоставлена ​​в командной строке. Тогда это makefileдолжно выглядеть так:

VERS = VABCDE.00.00A002

$(info    BUILDVERSION is "$(BUILDVERSION)")
$(info    vers is "$(VERS)")

ifdef BUILDVERSION
        VERSION := $(BUILDVERSION)
else
        VERSION := $(VERS)
endif

$(info    VERSION is $(VERSION))

И вы бы вызвали его с помощью:

make BUILDVERSION="not-default-version"

решение2

export $(BUILDVERSION) = $2

tl;dr; GNU make — это не bash.

Будет $(BUILDVERSION)расширяться во что-либо только если вы вызовете makeкак make BUILDVERSION=something, что приведет к тому, что эта строка будет а) определена somethingкакмакрос, подобный функциикоторый будет расширяться до своего второго аргумента при использовании в качестве $(call something, ...), и б) экспортироватьпустойпеременная окружения, названная somethingв честь команд, запускаемых из правил make.

Если BUILDVERSIONне определено или определено как пустая строка, вы получите эту empty variable nameошибку.

$ 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делаетнетрасширить до второго аргумента, переданного в командной строке make, потому что ... make — это не bash.

Связанный контент