run phony makefile

phony - Obteniendo el nombre del makefile del makefile



makefile windows (6)

¿Cómo obtener el nombre del makefile en el makefile?

Gracias.

Nota:

Lo necesitaría porque me gustaría que mi makefile se llame a sí mismo, pero el makefile no se llama Makefile, así que me gustaría escribir algo como esto:

target: ($MAKE) -f ($MAKEFILENAME) other_target


(Si tiene alguna pregunta, consulte el manual GNU make sorprendentemente escrito. Pero recuerde que, al igual que Makefile, este manual debe leerse completamente antes de poner los conceptos en práctica).

No pude averiguar cómo se hace fácilmente. Por lo que entiendo, tendrás que hacer un trabajo manual.

Más adelante describiré cómo se podría hacer y mostraré los scripts que introducen la variable current_makefile . Pero me gustaría enfatizar un concepto importante en primer lugar.

Debe comprender que si tenemos algún tipo de variable current_makefile , que se expande al nombre de makefile actual, entonces tendrá que cambiar durante el proceso de lectura de los makefiles. Eso significa que se debe utilizar dentro del contexto de expansión "inmediata" , es decir, dentro de los comandos que se ejecutan durante la lectura del archivo make. Sin embargo, la mayoría de los comandos se ejecutan después de leer 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 expandirá al nombre del archivo de la raíz 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 tiene una expansión diferida. Así que, si tienes la regla

rule: echo In makefile $(current_makefile): echo Making target $@

siempre imprimirá el nombre del makefile raíz. En cambio, para forzar la expansión inmediata, tendrá que crear otra variable con el nombre específico de makefile (es decir, los nombres de dichas variables deberían ser diferentes en cada makefile ):

this_makefile_unique_name := $(current_makefile) rule: echo In makefile $(current_makefile): echo Making target $@

o utilice eval :.

define make_rule rule: echo In makefile $(1): echo Making target $$@ $(eval $(call make_rule,$(current_makefile)))

Si desea usar el nombre del makefile actual solo para fines de depuración, considere funciones especiales de depuración, como advertencia o información :.

$(warning We''re in makefile $(current_makefile))

Estas funciones utilizan la expansión "inmediata" e imprimirán el valor correcto.

¿Cómo definir tal $ (current_makefile)?

Tienes que mantener manualmente la pila de inclusiones de makefile. Cuando incluye un makefile, su nombre se coloca en la parte superior de la pila; cuando regresa del archivo makefile incluido al archivo externo, el nombre de arriba se extrae de la pila. Esto se logra al insertar llamadas especiales al principio y al final de makefile:

# Beginning of makefile $(eval $(makefile_names_push)) #... makefile text $(warning $(current_makefile)) #... $(eval $(makefile_names_pop)) #End of file

Ahora define las funciones al comienzo de tu 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 la llamada de la lastword con la función incorporada :.

#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 son enlaces simbólicos a un makefile, las reglas de estos makefiles dependen de sus nombres. Pero se puede lograr dentro de un makefile y para cada técnica de evaluación descrita en el manual. Así que mi publicación fue una completa pérdida de tiempo, aunque me divertí un poco :-)


Dia de dia

Si hace una copia de su archivo make original, diga makefile_test y luego ingrese el comando:

make -np -f makefile_test 2>&1 | tee output

Eso evaluará el makefile y su entorno make pero no ejecutará ninguno de los comandos. Examinar el archivo de salida en busca de referencias a makefile_test le mostrará qué está configurado en el entorno de make y dónde se está estableciendo ese valor.

NB Esto puede generar mucha información! Y no agregue el modificador -d (depuración) que generará toneladas de resultados adicionales sobre el proceso de decisión de make, sino una mínima información adicional sobre env de make.

HTH


Esto devuelve el nombre del primer Makefile llamado, es decir, el que está en la parte inferior de la pila de llamadas:

MAKEFILE_JUSTNAME := $(firstword $(MAKEFILE_LIST)) MAKEFILE_COMPLETE := $(CURDIR)/$(MAKEFILE_JUSTNAME)

Cuando se utiliza en situaciones no recursivas cruzadas (por ejemplo, para makedepend), es solo el nombre del archivo make actual.


Quería hacer algo similar (para hacerme eco del contenido de Makefile) cuando uso Make para administrar tareas simples repetitivas. Encontré esta página y descubrí que era exactamente lo que buscaba y realmente útil para mi comprensión limitada de make.

Mi resultado después de leer esta página:

# Makefile - ''make'' and ''make help'' now echo the makefile. help: cat $(lastword $(MAKEFILE_LIST)) start: sudo -u www /path/to/webapp/myhttpd restart stop: sudo kill `cat /path/to/webapp/data/httpd.pid`


Una rápida excursión a Google sugiere que this sitio tiene la respuesta.


location = $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) WHERE_ART_THOU := $(location) $(warning $(WHERE_ART_THOU))

También creo que esto es específico de GNU, pero no estoy muy seguro.