2009-09-09 15 views
16

¿Cómo obtener el nombre del archivo MAKE en el archivo MAKE?Obtener el nombre del archivo MAKE del archivo MAKE

Gracias.

Nota:

que necesitaría que debido a que me gustaría que mi makefile para llamar a sí mismo, pero el makefile no es llamado Makefile, así que me gustaría escribir algo como esto:

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

¿Puedo preguntar por qué lo necesitas? – erelender

Respuesta

10
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.

+1

¡Esta solución no funciona si comprueba el nombre del archivo MAKE después de haber incluido otro archivo MAKE! (comentario copiado) –

+0

Funciona si corrige la primera línea: es "$ (palabras" en lugar de "($ palabras", y hay un ")" que falta al final de la línea. Si las corrige , Aceptaré la respuesta. – hcs42

+0

"¡Esta solución no funciona si se marca el nombre del archivo makefile después de haber incluido otro archivo MAKE!" Esto no es un gran problema. Puedo escribir las dos primeras líneas de este código al principio de my Makefile, que establece la variable WHERE_ART_THOU correctamente. Luego puedo usar esa variable en cualquier lugar del Makefile, contendrá el nombre de mi Makefile correctamente. – hcs42

3

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

+0

Para GNU Make only - no va a funcionar con make que no sea GNU, en general. –

+1

¡Esta solución no funciona si comprueba el nombre del archivo MAKE después de haber incluido otro archivo MAKE! –

7

(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 :-)

2

Quería hacer algo similar (para hacer eco del contenido del 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 limitada comprensión de la marca.

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 

Gracias a todos en esta página.

1

día G,

Si hace una copia de su archivo MAKE original, makefile_test decir, a continuación, introduzca el comando:

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

que evaluará el makefile y su entorno de realizar, pero no ejecutar cualquiera de los comandos. Si busca en el archivo de salida las referencias a makefile_test, le mostrará qué se establece en el entorno de make y dónde se establece ese valor.

N.B. ¡Esto puede generar mucha información! Y no agregue el modificador -d (depuración) que generará toneladas de salida adicional sobre el proceso de decisión de make, pero con información mínima adicional sobre el env de make.

HTH

1

Esto devuelve el nombre de la primera Makefile llamada, es decir, el uno en la parte inferior de la pila de llamadas:

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

Cuando se utiliza en situaciones de no-cross-recursivas (por ejemplo para makedepend), es solo el nombre del archivo MAKE actual.

Cuestiones relacionadas