2010-01-23 17 views

Respuesta

19

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.

+2

Nota, el '$ (shell ...)' se ejecuta incluso cuando make tiene la opción -n, --just-print, --dry-run, --recon. – thejoshwolfe

+0

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

9

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 
+2

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

2

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..." 
Cuestiones relacionadas