Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

GNU Make et toutes les dépendances

4 réponses
Avatar
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

4 réponses

Avatar
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.

--
Michael
Avatar
TSalm
Le Sat, 28 Nov 2009 23:49:06 +0100, Michael DOUBEZ
a écrit:

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
<<mon_exe_final>> dépends, c'est à dire <<mon_obj1.o>>, <<mon_obj2.o>> et
<<mon_obj3.o>>.
Ainsi, si je devais ajouter une autre dépendance dans <<mon_obj2.o>> par
exemple, elle serait répercutée dans mon_exe_final sans effort inutile de
ma part.

Je n'ai pas pris la bonne direction ?
Avatar
espie
In article , TSalm wrote:
============= 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
<<mon_exe_final>> dépends, c'est à dire <<mon_obj1.o>>, <<mon_obj2.o>> et
<<mon_obj3.o>>.
Ainsi, si je devais ajouter une autre dépendance dans <<mon_obj2.o>> par
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...
Avatar
TSalm
Le Sun, 29 Nov 2009 07:18:39 +0100, Marc Espie a écrit:

In article , TSalm wrote:
============= 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
<<mon_exe_final>> dépends, c'est à dire <<mon_obj1.o>>, <<mon_obj2.o>>
et
<<mon_obj3.o>>.
Ainsi, si je devais ajouter une autre dépendance dans <<mon_obj2.o>> par
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 <<mon_obj2.hpp>> et
<<mon_obj1.hpp>>.

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.