Puede imprimir variables a medida que se lee el archivo MAKE (suponiendo que GNU crea como ha etiquetado esta pregunta apropiadamente) utilizando este método (con una variable llamada "var"):
$(info $$var is [${var}])
Puede agregar esta construcción a cualquier receta para ver qué marca pasará al shell:
.PHONY: all
all: ; $(info $$var is [${var}])echo Hello world
Ahora, lo que sucede aquí es que make almacena la receta completa ( $(info $$var is [${var}])echo Hello world
) como una sola variable expandida recursivamente. Cuando make decide ejecutar la receta (por ejemplo, cuando le dice que cree all
), expande la variable y luego pasa cada línea resultante por separado al shell.
Entonces, en doloroso detalle:
- Se expande
$(info $$var is [${var}])echo Hello world
- Para hacer esto primero se expande
$(info $$var is [${var}])
$$
se convierte en literal $
${var}
se convierte :-)
(decir)
- El efecto secundario es que
$var is [:-)]
aparece en la salida estándar
- La expansión del
$(info...)
aunque está vacía
- Make se queda con
echo Hello world
echo Hello world
Primero haga impresiones en stdout para hacerle saber lo que le pedirá al shell que haga
- El caparazón se imprime
Hello world
en stdout.
Según el manual de GNU Make y también señalado por 'bobbogo' en la respuesta a continuación, puede usar información / advertencia / error para mostrar el texto.
Para imprimir variables,
'error' pararía el maquillaje ejecución, después de mostrar la cadena de error
fuente
de un "Mr. Make post" https://www.cmcrossroads.com/article/printing-value-makefile-variable
Agregue la siguiente regla a su Makefile:
Luego, si desea averiguar el valor de una variable de archivo MAKE, simplemente:
y volverá:
fuente
Si simplemente quiere algo de salida, desea usarlo
$(info)
solo. Puede hacerlo en cualquier lugar de un Makefile, y se mostrará cuando se evalúe esa línea:Saldrá
VAR="<value of VAR>"
cada vez que realice procesos de esa línea. Este comportamiento depende mucho de la posición, por lo que debe asegurarse de que la$(info)
expansión ocurra DESPUÉS de que todo lo que podría modificar$(VAR)
ya haya sucedido.Una opción más genérica es crear una regla especial para imprimir el valor de una variable. En términos generales, las reglas se ejecutan después de que se asignan las variables, por lo que esto le mostrará el valor que realmente se está utilizando. (Sin embargo, es posible que una regla cambie una variable ). Un buen formato ayudará a aclarar en qué se establece una variable, y la
$(flavor)
función le dirá qué tipo de variable es algo. Entonces en esta regla:$*
se expande hasta el tallo que el%
patrón coincide con la regla.$($*)
se expande al valor de la variable cuyo nombre está dado por$*
.[
y]
delinean claramente la expansión variable. También puede usar"
y /"
o similar.$(flavor $*)
te dice qué tipo de variable es. NOTA:$(flavor)
toma un nombre de variable , y no su expansión. Entonces, si dicesmake print-LDFLAGS
, obtienes$(flavor LDFLAGS)
, que es lo que quieres.$(info text)
proporciona salida Realice impresionestext
en su stdout como efecto secundario de la expansión. La expansión de$(info)
aunque está vacía. Puede pensarlo así@echo
, pero lo más importante es que no usa el shell, por lo que no tiene que preocuparse por las reglas de cotización del shell.@true
está ahí solo para proporcionar un comando para la regla. Sin eso, make también saldráprint-blah is up to date
. Creo que@true
deja más claro que está destinado a ser un no-op.Al ejecutarlo, obtienes
fuente
@echo $ (NDK_PROJECT_PATH) es la buena manera de hacerlo. No creo que el error provenga de allí. En general, este error aparece cuando escribes mal la intención: creo que tienes espacios donde deberías tener una pestaña.
fuente
Todas las versiones de
make
requieren que las líneas de comando estén sangradas con una TAB (no espacio) como primer carácter de la línea. Si nos mostró la regla completa en lugar de solo las dos líneas en cuestión, podríamos dar una respuesta más clara, pero debería ser algo como:donde el primer carácter en la segunda línea debe ser TAB.
fuente
Correr
make -n
; te muestra el valor de la variable ..Makefile ...
Mando:
Salida:
fuente
--just-print
en lugar de ejecuciónEsto
makefile
generará el mensaje de error 'separador faltante':Hay una pestaña antes del
@echo "All done"
(aunque ladone:
regla y la acción son en gran medida superfluas), pero no antes del@echo PATH=$(PATH)
.El problema es que el inicio de línea
all
debe tener dos puntos:
o un igual=
para indicar que es una línea objetivo o una línea macro, y no tiene ninguna, por lo que falta el separador.La acción que hace eco del valor de una variable debe estar asociada con un objetivo, posiblemente un objetivo ficticio o PHONEY. Y esa línea objetivo debe tener dos puntos. Si agrega un
:
afterall
en el ejemplomakefile
y reemplaza los espacios en blanco en la siguiente línea por una pestaña, funcionará de manera sensata.Probablemente tenga un problema análogo cerca de la línea 102 en el original
makefile
. Si mostraste 5 líneas en blanco y sin comentarios antes de las operaciones de eco que están fallando, probablemente sería posible finalizar el diagnóstico. Sin embargo, dado que la pregunta se hizo en mayo de 2013, es poco probable que la divisiónmakefile
aún esté disponible ahora (agosto de 2014), por lo que esta respuesta no se puede validar formalmente. Solo se puede usar para ilustrar una forma plausible de cómo ocurrió el problema.fuente
No es necesario modificar el Makefile.
fuente
El problema es que echo solo funciona bajo un bloque de ejecución. es decir, cualquier cosa después de "xx:"
Por lo tanto, cualquier cosa por encima del primer bloque de ejecución es solo inicialización, por lo que no se puede usar ningún comando de ejecución.
Así que crea un bloc de ejecución
fuente
Esto se puede hacer de forma genérica y puede ser muy útil al depurar un archivo MAKE complejo. Siguiendo la misma técnica que se describe en otra respuesta , puede insertar lo siguiente en cualquier archivo MAKE:
Luego puede simplemente "hacer imprimir" para volcar el valor de cualquier variable:
fuente
Puede crear una regla vars en su archivo make, como esta:
Aquí hay algunas formas más robustas de volcar todas las variables: gnu make: enumera los valores de todas las variables (o "macros") en una ejecución particular .
fuente
Si no desea modificar el Makefile en sí, puede usarlo
--eval
para agregar un nuevo objetivo y luego ejecutar el nuevo objetivo, p. Ej.make --eval='print-tests: @echo TESTS $(TESTS) ' print-tests
Puede insertar el carácter TAB requerido en la línea de comando usando
CTRL-V, TAB
ejemplo Makefile desde arriba:
fuente
make: *** missing separator. Stop.
make --eval='print-tests: ; @echo TESTS $(TESTS)' print-tests
si usa android make (mka)
@echo $(NDK_PROJECT_PATH)
no funcionará y le da un error,*** missing separator. Stop."
use esta respuesta si está tratando de imprimir variables en android makeeso funcionó para mí
fuente
Por lo general, hago eco de un error si quería ver el valor de la variable (solo si desea ver el valor. Se detendrá la ejecución).
fuente