Cómo evitar el error de nombre de variable vacío en Makefile

Cómo evitar el error de nombre de variable vacío en Makefile

Siempre que menciono cualquier versión junto con el comando de ejecución de este archivo MAKE, esa versión debe almacenarse en la variable VERSIÓN, si no se menciona ninguna versión, se debe tomar el valor predeterminado.

Este es mi 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: Obtengo este resultado cuando incluyo un argumento para la ejecución

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

CASO 2: Recibo este error cuando no incluyo el argumento para la ejecución

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

¿Alguien podría ayudarme a encontrar el problema con mi código?

Respuesta1

No estoy seguro, entiendo la pregunta.

Si su tarea es proporcionar un número de versión desde fuera makey utilizar el valor predeterminado si no se proporcionó ninguna versión en la línea de comando. Entonces makefiledebería verse así:

VERS = VABCDE.00.00A002

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

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

$(info    VERSION is $(VERSION))

Y lo llamarías con:

make BUILDVERSION="not-default-version"

Respuesta2

export $(BUILDVERSION) = $2

tl;dr; La creación de GNU no es bash.

Solo se $(BUILDVERSION)expandiría a cualquier cosa si lo invocara makecomo make BUILDVERSION=something, lo que hará que esa línea a) se defina somethingcomomacro similar a una funciónque se expandirá a su segundo argumento cuando se use como $(call something, ...), y b) exportar unvacíoVariable de entorno nombrada somethingpara los comandos que se ejecutan desde las reglas de creación.

Si BUILDVERSIONno está definido o está definido en una cadena vacía, obtendrá ese empty variable nameerror.

$ 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

$2hacenoexpanda al segundo argumento pasado en la línea de comando de make, porque... make no es bash.

información relacionada