Como evitar o erro nome da variável vazia no Makefile

Como evitar o erro nome da variável vazia no Makefile

Sempre que eu mencionar alguma versão junto com o comando de execução deste makefile essa versão deverá ser armazenada na variável VERSION, caso nenhuma versão seja mencionada o valor padrão deverá ser tomado.

Este é o meu 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))

CASO 1: estou recebendo esta saída quando incluo argumento para execução

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

CASO 2: Estou recebendo este erro quando não incluo argumento para execução

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

Alguém poderia me ajudar a descobrir o que há de errado com meu código!

Responder1

Não tenho certeza, entendi a pergunta.

Se sua tarefa é fornecer um número de versão de fora makee usar o valor padrão se nenhuma versão foi fornecida na linha de comando. Então o makefiledeverá ficar assim:

VERS = VABCDE.00.00A002

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

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

$(info    VERSION is $(VERSION))

E você chamaria isso com:

make BUILDVERSION="not-default-version"

Responder2

export $(BUILDVERSION) = $2

dr; GNU make não é bash.

O $(BUILDVERSION)só se expandiria para qualquer coisa se você invocasse makeas make BUILDVERSION=something, o que fará com que essa linha a) defina somethingcomo amacro semelhante a uma funçãoque se expandirá para seu segundo argumento quando usado como $(call something, ...), e b) exportará umvaziovariável de ambiente nomeada somethingpara os comandos executados a partir de regras make.

Se BUILDVERSIONnão estiver definido ou estiver definido como uma string vazia, você receberá esse empty variable nameerro.

$ 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

$2faznãoexpanda para o segundo argumento passado na linha de comando do make, porque ... make não é bash.

informação relacionada