2010-03-20 17 views
7

tengo un makefile con algo parecido a los siguientes objetivos:makefile: ejecutar un objetivo de otro objetivo, más comandos adicionales

 
install: 
    do a whole bunch of stuff to install 

dist: install 
    cp README.txt $(INSTALL_DIR) 
    zip $(INSTALL_DIR) 

Estoy tratando de no repetir los comandos de la meta install y hacer dist ejecutar install antes ejecutando sus propios comandos.

Llamando make dist efectivamente ejecuta todos los comandos desde el destino install pero luego simplemente se detiene y no ejecuta sus propios comandos, p. el cp.

¿Echo de menos algo?

+0

Normalmente, su 'instalar' regla dependerá de 'todos' o por ahí, y 'toda' haría el 'montón entero de cosas para construir ', dejando' instalar 'para hacer' todo el montón de cosas para instalar '. –

+0

@Jonathan Sí, eso es realmente lo que está haciendo. Voy a editar eso. – cschol

Respuesta

9

tratar de añadir esta línea en su archivo MAKE

.PHONY: instalar dist

+0

Eso fue todo. ¿Puedes explicar por qué esto es necesario? Gracias. – cschol

+0

¿El directorio de instalación se llamaba 'install' (o quizás 'dist')? Eso tiende a confundir las cosas. La notación '.PHONY' (una extensión GNU Make) significa aproximadamente que el 'objetivo' debe tratarse como siempre desactualizado. –

+6

Para explicar lo que dijo Jonathan sobre .PHONY, piense en esto de la siguiente manera: Make supone que todos los destinos son archivos reales y busca si puede encontrar el archivo; si no puede, el archivo se considera desactualizado y la regla ejecutado. .PHONY dice que no es realmente un archivo, así que no lo busques o trates de combinarlo con ningún patrón/regla y, por supuesto, si realmente hay un archivo/directorio llamado así, no tomes ese archivo para que sea el objetivo, potencialmente tratando el objetivo como actualizado. http://www.gnu.org/s/hello/manual/make/Phony-Targets.html – jhabbott

Cuestiones relacionadas