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
alualatex
, 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:
- Establecer una variable dentro de una regla
- make: regla call call
- Pasando variables adicionales desde la línea de comandos para hacer
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!