make ejecutar directorios con compilar como comando makefile gnu-make

ejecutar - makefile con directorios



¿Cambiar una variable de creación y llamar a otra regla desde una receta en el mismo Makefile? (2)

Ya he visto ¿Cómo llamar manualmente a otro objetivo desde un objetivo de marca? , pero mi pregunta es un poco diferente; Considera este ejemplo (nota, stackoverflow.com cambia las pestañas a espacios en la pantalla; pero las pestañas se conservan en la fuente, si intentas editar):

TEXENGINE=pdflatex pdflatex: echo the engine is $(TEXENGINE) lualatex: TEXENGINE=lualatex echo Here I want to call the pdflatex rule, to check $(TEXENGINE) there!

Aquí, si ejecuto el destino predeterminado ( pdflatex ), obtengo el resultado esperado:

$ make pdflatex echo the engine is pdflatex the engine is pdflatex

Pero, con el objetivo lualatex , quiero:

  • cambia la variable make TEXENGINE a lualatex , y luego
  • llame al mismo código que en pdflatex (que lo usa).

¿Cómo podría hacer eso?

Claramente, en mi regla lualatex ni siquiera logro cambiar la variable TEXENGINE , porque lo consigo cuando lo intento:

$ make lualatex TEXENGINE=lualatex echo Here I want to call the pdflatex rule, to check pdflatex there! Here I want to call the pdflatex rule, to check pdflatex there!

... así que realmente me gustaría saber si algo como esto es posible en Makefiles.


Bueno, me las arreglé para llegar a una especie de solución alternativa, pero no lo entiendo muy bien, por lo que una respuesta más aprendida será apreciada. Para mí aquí, estos enlaces ayudaron:

Así que aquí está el ejemplo modificado: aparentemente, para llamar a una regla desde una regla después (no como un requisito previo, sino como un requisito de publicación ), solo puedo recursivamente llamar a make , mientras tengo el nuevo valor de variable especificado en su línea de comando:

TEXENGINE=pdflatex pdflatex: echo the engine is $(TEXENGINE) lualatex: echo Here I want to call the pdflatex rule, to check $(TEXENGINE) there! $(MAKE) TEXENGINE=lualatex pdflatex

La salida es algo más detallada de lo que me gustaría, pero funciona:

$ make lualatex echo Here I want to call the pdflatex rule, to check pdflatex there! Here I want to call the pdflatex rule, to check pdflatex there! make TEXENGINE=lualatex pdflatex make[1]: Entering directory `/tmp'' echo the engine is lualatex the engine is lualatex make[1]: Leaving directory `/tmp''

... que es lo que quería puramente desde el punto de vista de la interacción de línea de comandos, pero sé que no es la mejor solución (vea el comentario de @JonathanWakely a continuación)


Utilice una variable específica del objetivo

Hay una característica especial más de las variables específicas del objetivo: cuando define una variable específica del objetivo, el valor de la variable también está vigente para todos los requisitos previos de este objetivo y todos sus requisitos previos, etc. (a menos que esos requisitos previos anulen esa variable con su propio valor variable específico del objetivo).

TEXENGINE=pdflatex pdflatex: echo the engine is $(TEXENGINE) lualatex: TEXENGINE=lualatex lualatex: pdflatex echo Here I want to call the pdflatex rule, to check $(TEXENGINE) there!

La salida es:

$ make pdflatex echo the engine is pdflatex the engine is pdflatex $ make lualatex echo the engine is lualatex the engine is lualatex echo Here I want to call the pdflatex rule, to check lualatex there! Here I want to call the pdflatex rule, to check lualatex there!