¿Es posible mostrar variables fuera de las reglas usando GNU Make?

¿Es posible mostrar variables fuera de las reglas usando GNU Make?

¿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 ifdefresultado 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á lspor 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, makese 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 maketiene una función para hacer exactamente eso y se llama $(info ....).

Podrías colocar la siguiente línea fuera de a ruley GNU make la ejecutará:

$(info variable x = $x))

Y si te encuentras haciendo este tipo de tarea repetidamente, puedes abstraerla en a macroy 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<<<

información relacionada