Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

GNU Make et toutes les dépendances

0 views
Skip to first unread message

TSalm

unread,
Nov 27, 2009, 6:32:46 PM11/27/09
to
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

Michael DOUBEZ

unread,
Nov 28, 2009, 5:49:06 PM11/28/09
to
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

unread,
Nov 28, 2009, 6:02:37 PM11/28/09
to
Le Sat, 28 Nov 2009 23:49:06 +0100, Michael DOUBEZ
<michael...@free.fr> a ᅵcrit:

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 ?

Marc Espie

unread,
Nov 29, 2009, 1:18:39 AM11/29/09
to
In article <op.u34nmnk2k9rspk@papillon>, TSalm <ts...@free.fr> 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...

TSalm

unread,
Nov 29, 2009, 3:44:18 PM11/29/09
to
Le Sun, 29 Nov 2009 07:18:39 +0100, Marc Espie <es...@lain.home> a ᅵcrit:

> In article <op.u34nmnk2k9rspk@papillon>, TSalm <ts...@free.fr> 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>>.

Merci pour ces explications.

0 new messages