2010-08-16 5 views
54

Je pense que c'est une question qui a été posée plusieurs fois mais je ne peux pas trouver le juste façon de le faire.Sous-répertoires et Makefiles

J'ai la structure suivante:

project/ 
project/Makefile 
project/code 
project/code/*.cc 
project/code/Makefile 

Quand je suis dans le répertoire projet/code 'et appelle « faire project_code » mon code compile correctement.

Je voudrais le faire quand je suis dans 'projet /', en appelant simplement "make projet_code" comme si j'étais dans 'projet/code'. Le makefile 'project/Makefile' contiendra d'autres règles (comme 'install') et quelques règles à compiler comme si j'étais dans 'project/code'. Et pour cela, je demande votre aide ... Merci.

Répondre

78

La façon la plus simple est de faire:

CODE_DIR = code 

.PHONY: project_code 

project_code: 
     $(MAKE) -C $(CODE_DIR) 

La règle .PHONY signifie que project_code n'est pas un fichier qui doit être construit, et l'indicateur -C indique un changement de répertoire (équivalent à exécuter cd code avant d'appeler make). Vous pouvez utiliser la même approche pour appeler d'autres cibles dans le Makefile code.

Par exemple:

clean: 
     $(MAKE) -C $(CODE_DIR) clean 
+0

Merci, ça marche! Une dernière chose: est-ce que $ (MAKE) est toujours défini? –

+0

Sous GNU Make, oui. –

+2

est $ (MAKE) une référence à une variable que vous avez définie? Ou est-ce une fonction intégrée qui est toujours là? – mtmurdock

0

Essayez de mettre cette règle dans le projet/Makefile quelque chose comme ça (pour GNU make):

 
.PHONY: project_code 
project_code: 
     cd code && make 
+14

* Cela fonctionne pas * comme il est écrit, car par défaut dans GNU make, chaque ligne d'un corps de règle est exécutée dans un autre shell. Donc, le cd va se produire, mais le shell qui l'a exécuté va immédiatement quitter; alors 'make' sera exécuté séparément. En fait, je crois que cela mettra dans une boucle de récursion infinie. Cependant, si vous changez le code en 'cd code && make', cela fonctionnera comme prévu. –

+4

Edité après 4 ans pour correspondre à la suggestion –

+2

@EmanueleCipolla Pouce après quatre autres années pour saluer l'esprit. – h9uest