¿Es posible mostrar variables fuera de las reglas usando GNU Make?
Considere el siguiente Makefile:
x = foo bar baz
ifdef x
@echo $(x)
endif
Esto resulta enMakefile:4: *** commands commence before first target. Stop.
Sin embargo, si agrego una regla, funciona:
x = foo bar baz
ifdef x
t:
@echo $(x)
endif
¿Es realmente necesario agregar reglas para generar variables para depuración, etc.?
Prima:
¿Por qué la eliminación del ifdef
resultado produce Makefile:3: *** missing separator. Stop.
?
x = foo bar baz
@echo $(x)
Respuesta1
Ehm, posible, pero inútil.
Debes entender que un Makefile no es como un script de shell. Un Makefile especifica los objetivos y lo que se debe hacer para crearlos. Si tienes esto en cuenta, la ejecución de un comando falso en el Makefile se convierte en un problema conceptual. ¿Cuándo se ejecutará ese comando? No hay ningún objetivo que pueda activar ese comando.
Tú podrías:
MY_VAR := $(shell ls)
all:
@echo MY_VAR IS $(MY_VAR)
Tenga en cuenta que asumí GNU make
. Esto se ejecutará ls
por usted y colocará la salida en formato MY_VAR
. Pero ese es un truco que debería evitarse.
También puedes probar con un objetivo extra.
extra:
@echo $(x)
y agréguelo como requisito previo para todos los demás objetivos.
En cuanto al bono: se debe a que la línea @echo $(x)
no tiene separador. En este punto del archivo, make
se esperaría un objetivo con a :
y no hay ninguno :
en esa línea. (hay otras posibilidades, como una nueva asignación de variable, etc., por supuesto)
Respuesta2
GNU make
tiene una función para hacer exactamente eso y se llama $(info ....)
.
Podrías colocar la siguiente línea fuera de a rule
y GNU make la ejecutará:
$(info variable x = $x))
Y si te encuentras haciendo este tipo de tarea repetidamente, puedes abstraerla en a macro
y llamarla donde sea necesario:
make -f - <<\eof
dumpvar = $(info variable `$1' value is >>>$($1)<<<)
ssl_enable = NO
$(call dumpvar,ssl_enable)
.PHONY: all
all:;@:
eof
Mostrará lo siguiente en stout:
variable `ssl_enable' value is >>>NO<<<