2010-03-03 7 views
3

Dans un makefile, je construis tous mes fichiers .o dans un build répertoire:Makefile Créer annuaires et de répertoires dépendances

program: class1.o class2.o class3.o 
    g++ $(BUILDDIR)class1.o $(BUILDDIR)class2.o $(BUILDDIR)class3.o -o [email protected] 

Ce serait cool de générer $(BUILDDIR)class1.o $(BUILDDIR)class2.o $(BUILDDIR)class3.o de la liste des dépendances ...

Je sais que $^ me donnerait la liste de toutes les dépendances, séparées par des espaces, mais je ne peux pas traiter avec le sous-répertoire.

Est-ce possible? Si j'ai program: class1.o class2.o class3.o configure, puis-je exclure configure de la liste?

Merci :)

Edit: solutions de Michael fonctionne bien, mais faire cela, make ne trouve pas les dépendances et doit tout construire à chaque fois ... est-ce pas là une façon plus simple, lors de règles implicites comme program: class1.o class2.o class3.o, pour lui dire de mettre les binaires dans un répertoire construire?

+0

Est-ce que cela fonctionne? g ++ $ (^:% = $ (BUILDDIR)%) -o $ @ –

Répondre

5

Du haut de ma tête

g++ $(addprefix $(BUILDDIR), $^) -o [email protected] 

devrait le faire. Le Make manual a une liste de ces fonctions dans la section 8.3.

+0

Merci! Je vais avoir un regard plus attentif sur le manuel :) – Klaus

+2

Oui ... ne me sens pas trop mal de l'avoir raté. Comme la plupart des documentations GNU, je trouve que le manuel Make est bien organisé pour les personnes qui savent déjà tout, et qui ont juste besoin de chercher l'orthographe exacte ou quoi que ce soit. Si vous n'êtes pas sûr de ce que quelque chose est appelé, il n'est vraiment pas possible de le trouver dans le manuel GNU sans avoir lu le tout. –

+0

J'ai utilisé ceci pour le problème inverse: J'ai une liste de fichiers locaux, et j'ai besoin d'ajouter un chemin de répertoire à eux, et utilisé le tout dans une dépendance. – mgold

5

Vous avez atteint deux (ou peut-être trois) des gros défauts de Make. Il est bon d'utiliser les fichiers il pour faire des fichiers ici, mais pas l'inverse, et il devient confus si une règle fait quelque chose d'autre que la cible exacte (et ses variables automatiques devraient fonctionner dans les conditions préalables, mais ils ne font pas » t). Heureusement, nous pouvons contourner ces problèmes. Make ne trouve pas les conditions préalables lorsque vous utilisez la solution de Michael Kohne car elle recherche class1.o, pas $ (BUILDDIR) class1.o. (Et si vous lui dites simplement de regarder $ (BUILDDIR) en utilisant VPATH, vous pouvez rencontrer d'autres problèmes.)

La solution la plus simple et la plus grossière (que je recommande si vous n'avez pas trop d'expérience) est la force brute:

 
NAMES = class1 class2 
OBJECTS = $(patsubst %,$(BUILDDIR)%.o,$(NAMES)) 

program: $(OBJECTS) configure 
    g++ $(OBJECTS) -o [email protected] 

$(OBJECTS):$(BUILDDIR)%.o:%.cc 
    g++ -c $^ -o [email protected] 

Il existe des solutions plus élégantes utilisant des techniques plus avancées, mais cela devrait être fait pour l'instant.

Questions connexes