Estoy usando Makefiles.Forzar Makefile para ejecutar script antes de construir objetivos
Sin embargo, hay un comando (script zsh) que quiero ejecutar antes de que se ejecute cualquier objetivo. ¿Cómo hago esto?
Gracias!
Estoy usando Makefiles.Forzar Makefile para ejecutar script antes de construir objetivos
Sin embargo, hay un comando (script zsh) que quiero ejecutar antes de que se ejecute cualquier objetivo. ¿Cómo hago esto?
Gracias!
Existen varias técnicas para tener código ejecutado antes de que los objetivos son construido. Cuál elegir debería depender un poco de exactamente lo que quiere hacer y por qué quiere hacerlo. (¿Qué hace el script zsh? ¿Por qué tiene que ejecutarlo?)
Puede hacer lo que le sugiera @John; colocando el script zsh como la primera dependencia. Luego debe marcar el objetivo zsh
como .PHONY
a menos que realmente genere un archivo llamado zsh
.
Otra solución (en GNU hacer, por lo menos) es invocar la función $(shell ...)
como parte de una asignación de variables:
ZSH_RESULT:=$(shell zsh myscript.zsh)
Esto ejecutará la secuencia de comandos tan pronto como el makefile se analiza, y antes de todos los destinos se ejecutan. También ejecutará la secuencia de comandos si invoca el archivo MAKE recursivamente.
Sólo asegúrese de que una dependencia de uno de los otros objetivos
foo.obj : zsh foo.c
rule for compileing foo.c
zsh:
rule for running zsh script.
o, alternativamente, a que su primer objetivo dependen de él
goal: zsh foo.exe
El problema con la primera solución aquí es que obligará a 'foo.obj' a reconstruirse cada vez, incluso si' foo.c' no se ha actualizado. El problema con el segundo es que ahora no puedes llamar a tu archivo MAKE con múltiples objetivos. –
Solución para preprocesamiento y posprocesamiento en makefiles utilizando MAKECMDGOALS y reglas de dos puntos.
MAKECMDGOALS son los objetivos enumerados en la línea de comandos.
El primer paso es obtener el primer y último objetivo de la línea de comandos, o, si no hay objetivos en la lista, use el destino predeterminado.
ifneq ($(MAKECMDGOALS),)
FIRST_GOAL := $(word 1, $(MAKECMDGOALS))
LAST_GOAL := $(word $(words $(MAKECMDGOALS)), $(MAKECMDGOALS))
else
FIRST_GOAL := all
LAST_GOAL := all
endif
Las reglas de dos puntos permiten que varias recetas para el mismo objetivo se ejecuten en orden. Tendrás que cambiar todos los objetivos de línea de comando para duplicar las reglas de dos puntos.
#Dummy rule to set the default
.PHONY: all
all ::
#Preprocessing
$(FIRST_GOAL) ::
echo "Starting make..."
all :: normal_prerequistes
normal_recipe
other_stuff
#Postprocessing
$(LAST_GOAL) ::
echo "All done..."
Nota, el '$ (shell ...)' se ejecuta incluso cuando make tiene la opción -n, --just-print, --dry-run, --recon. – thejoshwolfe
Buena respuesta. ¿Hay alguna forma de ejecutar un comando al salir de make? Publicó una pregunta aquí: http://stackoverflow.com/questions/20582006/force-makefile-to-execute-script-after-building-any-target-just-before-exiting – PonyEars