GNU Make et toutes les dépendances

Le
TSalm
Bonjour,

Je démarre un makefile avec GNU Make
De la même façon qu'il existe la variable $^ qui retourne les dépendances
directes, existe t-il une variable de la sorte pour lister toutes les
dépendances et sous-dépendances (récursivement) ?

D'avance merci pour votre aide,
-TSalm
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Michael DOUBEZ
Le #20653651
TSalm a écrit :
Je démarre un makefile avec GNU Make
De la même façon qu'il existe la variable $^ qui retourne les
dépendances directes, existe t-il une variable de la sorte pour lister
toutes les dépendances et sous-dépendances (récursivement) ?



Pas à ma connaissance.

Et je ne vois pas d'utilité à le faire.

--
Michael
TSalm
Le #20653771
Le Sat, 28 Nov 2009 23:49:06 +0100, Michael DOUBEZ

TSalm a écrit :
Je démarre un makefile avec GNU Make
De la même façon qu'il existe la variable $^ qui retourne les
dépendances directes, existe t-il une variable de la sorte pour lister
toutes les dépendances et sous-dépendances (récursivement) ?



Pas à ma connaissance.

Et je ne vois pas d'utilité à le faire.




Pas d'utilité ? C'est peut-être alors qu'il y a quelquechose qui m'échappe.
J'ai fait quelquechose comme ceci (j'épargne certains détails superflus ) :

============= Makefile ================= mon_obj1.o:
$(CPP) $(CPPFLAGS) -c $*.cpp -o $@

mon_obj2.o: mon_obj1.o
$(CPP) $(CPPFLAGS) -c $*.cpp -o $@

mon_obj3.o: mon_obj2.o
$(CPP) $(CPPFLAGS) -c $*.cpp -o $@

mon_exe_final: mon_obj3.o
$(CPP) $(LDFLAGS) $??? -o $@
=============================================
Je voudrais que <<$???>> soit remplacer par tous les objets dont
Ainsi, si je devais ajouter une autre dépendance dans exemple, elle serait répercutée dans mon_exe_final sans effort inutile de
ma part.

Je n'ai pas pris la bonne direction ?
espie
Le #20655011
In article
============= Makefile ================= >mon_obj1.o:
$(CPP) $(CPPFLAGS) -c $*.cpp -o $@

mon_obj2.o: mon_obj1.o
$(CPP) $(CPPFLAGS) -c $*.cpp -o $@

mon_obj3.o: mon_obj2.o
$(CPP) $(CPPFLAGS) -c $*.cpp -o $@

mon_exe_final: mon_obj3.o
$(CPP) $(LDFLAGS) $??? -o $@
============================================= >
Je voudrais que <<$???>> soit remplacer par tous les objets dont
Ainsi, si je devais ajouter une autre dépendance dans exemple, elle serait répercutée dans mon_exe_final sans effort inutile de
ma part.

Je n'ai pas pris la bonne direction ?



Okay, tu n'as a peu pres rien compris, helas.

Les *dependances* deja. Il n'y a aucune raison que mon_obj2.o depende de
mon_obj1.o. Par contre, toutes les raisons qu'il depende de mon_obj2.cpp

Les noms de variables ensuite. CPPFLAGS, traditionnellement, c'est pour le
preprocesseur. Et CPP aussi. On utilise CXXFLAGS et CXX pour le nom du
compilo. Egalement, il *faut* repasser CXXFLAGS a l'editeur de liens.

Ton Makefile ressemblerait a ca en vrai:

OBJS = mon_obj1.o mon_obj2.o mon_obj3.o

mon_exe_final: $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) $(OBJS) -o $@

mon_obj1.o: mon_obj1.cpp
$(CXX) $(CXXFLAGS) -c $*.cpp

mon_obj2.o: mon_obj2.cpp
$(CXX) $(CXXFLAGS) -c $*.cpp

mon_obj3.o: mon_obj3.cpp
$(CXX) $(CXXFLAGS) -c $*.cpp

Et en pratique, on peut faire plus court avec utilisation de suffix rules.
Normalement, make connaitra meme .cpp -> .o, mais s'il faut lui dire:

.SUFFIXES: .cpp .o

.cpp.o:
$(CXX) $(CXXFLAGS) -c $*.cpp

OBJS = mon_obj1.o mon_obj2.o mon_obj3.o

mon_exe_final: $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) $(OBJS) -o $@


A ca, il faut eventuellement rajouter tes dependances sur des .hpp, par
exemple:

mon_obj1.o mon_obj2.o: mon_obj1.hpp

en supposant que mon_obj1 et mon_obj2 utilisent tous les deux le fichier
d'entetes en question.
Note que c'est juste une ligne de dependances, les regles de prod existent
deja, pas besoin d'y toucher...
TSalm
Le #20659891
Le Sun, 29 Nov 2009 07:18:39 +0100, Marc Espie
In article
============= Makefile ================= >> mon_obj1.o:
$(CPP) $(CPPFLAGS) -c $*.cpp -o $@

mon_obj2.o: mon_obj1.o
$(CPP) $(CPPFLAGS) -c $*.cpp -o $@

mon_obj3.o: mon_obj2.o
$(CPP) $(CPPFLAGS) -c $*.cpp -o $@

mon_exe_final: mon_obj3.o
$(CPP) $(LDFLAGS) $??? -o $@
============================================= >>
Je voudrais que <<$???>> soit remplacer par tous les objets dont
et
Ainsi, si je devais ajouter une autre dépendance dans exemple, elle serait répercutée dans mon_exe_final sans effort inutile
de
ma part.

Je n'ai pas pris la bonne direction ?



Okay, tu n'as a peu pres rien compris, helas.


Ah? Ok c'est toujours sympa à entendre :-)


Les *dependances* deja. Il n'y a aucune raison que mon_obj2.o depende de
mon_obj1.o. Par contre, toutes les raisons qu'il depende de mon_obj2.cpp



Et si je comprends, il est dépendant aussi de
Les noms de variables ensuite. CPPFLAGS, traditionnellement, c'est pour
le
preprocesseur. Et CPP aussi. On utilise CXXFLAGS et CXX pour le nom du
compilo. Egalement, il *faut* repasser CXXFLAGS a l'editeur de liens.

Ton Makefile ressemblerait a ca en vrai:

OBJS = mon_obj1.o mon_obj2.o mon_obj3.o

mon_exe_final: $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) $(OBJS) -o $@

mon_obj1.o: mon_obj1.cpp
$(CXX) $(CXXFLAGS) -c $*.cpp

mon_obj2.o: mon_obj2.cpp
$(CXX) $(CXXFLAGS) -c $*.cpp

mon_obj3.o: mon_obj3.cpp
$(CXX) $(CXXFLAGS) -c $*.cpp

Et en pratique, on peut faire plus court avec utilisation de suffix
rules.
Normalement, make connaitra meme .cpp -> .o, mais s'il faut lui dire:

.SUFFIXES: .cpp .o

.cpp.o:
$(CXX) $(CXXFLAGS) -c $*.cpp

OBJS = mon_obj1.o mon_obj2.o mon_obj3.o

mon_exe_final: $(OBJS)
$(CXX) $(CXXFLAGS) $(LDFLAGS) $(OBJS) -o $@


A ca, il faut eventuellement rajouter tes dependances sur des .hpp, par
exemple:

mon_obj1.o mon_obj2.o: mon_obj1.hpp

en supposant que mon_obj1 et mon_obj2 utilisent tous les deux le fichier
d'entetes en question.
Note que c'est juste une ligne de dependances, les regles de prod
existent
deja, pas besoin d'y toucher...



Merci pour ces explications.
Publicité
Poster une réponse
Anonyme