2010-03-20 6 views
7

J'ai un makefile avec quelque chose comme les objectifs suivants:makefile: exécuter une cible d'une autre cible, plus les commandes supplémentaires

 
install: 
    do a whole bunch of stuff to install 

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

J'essaie de ne pas répéter les commandes de la cible install et faire dist exécuter install avant de exécuter ses propres commandes.

L'appel make dist exécute en effet toutes les commandes de la cible install mais s'arrête juste et n'exécute pas ses propres commandes, par ex. le cp.

Ai-je raté quelque chose?

+0

Normalement, la règle « installer » dépendrait de « tous » ou à peu près, et « tous » ferait le « tas de choses à construire », laissant« installer »pour faire le« tas de choses à installer ». –

+0

@Jonathan Oui, c'est en fait ce qu'il fait. Je vais modifier cela. – cschol

Répondre

9

essayez d'ajouter cette ligne dans votre makefile

.PHONY: installer dist

+0

C'était tout. Pouvez-vous expliquer pourquoi cela est nécessaire? Merci. – cschol

+0

Le répertoire d'installation s'appelait-il 'install' (ou peut-être 'dist')? Cela a tendance à confondre les choses. La notation '.PHONY' (une extension GNU Make) signifie en gros que la 'cible' doit être traitée comme étant obsolète. –

+6

Pour approfondir ce que Jonathan a dit à propos de .PHONY, pensez-y comme ceci: Make suppose que toutes les cibles sont des fichiers réels et vérifie s'il peut trouver le fichier, s'il ne peut pas être considéré obsolète et la règle réalisé. .PHONY dit que ce n'est pas vraiment un fichier, alors ne le cherchez pas et n'essayez pas de le faire correspondre à des patterns/rules et bien sûr s'il y a vraiment un fichier/répertoire appelé, ne prenez pas ce fichier pour être la cible, en traitant potentiellement la cible comme étant à jour. http://www.gnu.org/s/hello/manual/make/Phony-Targets.html – jhabbott

Questions connexes