(Si tiene alguna pregunta, consulte el GNU make manual, escrito asombrosamente. Pero recuerde que, al igual que Makefile, este manual debe leerse por completo antes de poner en práctica los conceptos).
No pude entender cómo se hace fácilmente. Por lo que yo entiendo, tendrás que hacer un trabajo manual.
Más adelante describiré cómo se podría hacer y mostraría los scripts que introducen la variable current_makefile
. Pero me gustaría hacer hincapié en un concepto importante en primer lugar.
Debe comprender que si tuviéramos algún tipo de variable current_makefile
, que se expande al nombre del archivo MAKE actual, entonces deberá cambiar durante el proceso de lectura de los archivos MAKE. Esto significa que se debe utilizar dentro del contexto de expansión "inmediata" - es decir, dentro de los comandos que se ejecutan durante leyendo el archivo MAKE. La mayoría de los comandos, sin embargo, se ejecutan después de que se leen los archivos make. Por lo tanto, algunos comandos imprimirán el valor correcto sin problemas, mientras que en ciertos lugares, donde se usa la expansión "diferida", siempre se ampliará al nombre de archivo raíz.
Si desea usar esta variable dentro del texto de la regla, por ejemplo, tendrá que hacer trucos, porque el texto de la regla siempre ha pospuesto la expansión. Por lo tanto, si tiene la regla
rule:
echo In makefile $(current_makefile):
echo Making target [email protected]
siempre imprimirá el nombre del archivo MAKE raíz. En cambio, para forzar la expansión inmediata, tendrá que crear otra variable con el nombre de archivo MAKE-específica (es decir nombres de estas variables deben ser diferentes en cada makefile):
this_makefile_unique_name := $(current_makefile)
rule:
echo In makefile $(current_makefile):
echo Making target [email protected]
o utilizar eval :.
define make_rule
rule:
echo In makefile $(1):
echo Making target [email protected]
$(eval $(call make_rule,$(current_makefile)))
Si desea utilizar el nombre de archivo MAKE actual para fines de depuración solamente, consideran las funciones de depuración especiales, como advertencia o información :.
$(warning We're in makefile $(current_makefile))
Estas funciones usan expansión "inmediata" e imprimirán el valor correcto.
cómo definir un $ tales (current_makefile)?
Debe mantener manualmente la pila de inclusiones de archivos MAKE. Cuando incluye un archivo MAKE, su nombre se coloca en la parte superior de la pila; cuando regrese del archivo MAKE incluido al exterior, el nombre más alto saldrá de la pila. Esto se logra mediante la inserción de llamadas especiales al principio y al final del makefile:
# Beginning of makefile
$(eval $(makefile_names_push))
#... makefile text
$(warning $(current_makefile))
#...
$(eval $(makefile_names_pop))
#End of file
Ahora definen las funciones en el comienzo de su makefile raíz.
lastword=$(word $(words $(1)),$(1))
define makefile_names_push
current_makefile := $$(CURDIR)/$$(call lastword,$$(MAKEFILE_LIST))
makefile_stack :=$$(makefile_stack) $$(current_makefile)
endef
define makefile_names_pop
makefile_stack := $$(filter-out $$(current_makefile),$$(makefile_stack))
current_makefile := $$(call lastword,$$(makefile_stack))
endef
Si está seguro de que su marca es lo suficientemente nueva (versión 3.81+), reemplace lastword
llamada con función interna :.
#inctead of $$(call lastword,$$(MAKEFILE_LIST))
$$(lastword $$(MAKEFILE_LIST))
es útil?
Totalmente inútil. Un único uso que podría ser útil aquí es hacer 100 makefiles que sean enlaces simbólicos a un archivo MAKE, las reglas en estos archivos MAKE según sus nombres. Pero se puede lograr dentro de una técnica de makefile y foreach-eval descrita en el manual. Así que mi publicación fue una completa pérdida de tiempo, aunque me divertí un poco :-)
¿Puedo preguntar por qué lo necesitas? – erelender