[Makefile] comment générer dynamiquement les dépendances

comment générer dynamiquement les dépendances [Makefile] - C++ - Programmation

Marsh Posté le 19-04-2003 à 16:08:06    

c'est bien cool, gcc -MM, mais comment qu'on fait pour que ça se fasse tout seul. J'ai la flemme de lire le man de make, mais je me doute qu'il doit suffire de rediriger le résultat de gcc -MM dans un fichier et apres de l'inclure dans le Makefile (doit bien y a voir une commande pour rajouter des regles dynamiquements.
 
quelqu'un à un Makefile déjà tout pret à me montrer?  :jap:

Reply

Marsh Posté le 19-04-2003 à 16:08:06   

Reply

Marsh Posté le 19-04-2003 à 23:51:14    

UP!

Reply

Marsh Posté le 21-04-2003 à 16:07:36    

voici mon makefile de mon projet (cf code dans le topic que je viens de faire remonter) :
 


all : main clean
 
main : main.o lire.o ecrire.o boolean.h divers.h
        gcc -g main.o lire.o ecrire.o -o indexit
 
main.o : main.c lire.h boolean.h divers.h  
        gcc -g -c main.c
 
ecrire.o : ecrire.c ecrire.h boolean.h divers.h
        gcc -g -c ecrire.c  
 
lire.o : lire.c lire.h boolean.h divers.h
        gcc -g -c lire.c
 
clean : main
        rm *.o
 


 
les premières et dernières lignes sont facultatives, elles servent juste à effacer les fichiers intermédiaires du compilateur.


Message édité par ceyquem le 21-04-2003 à 16:09:57
Reply

Marsh Posté le 21-04-2003 à 16:14:05    

:heink: je crois que t'as pas compris, je parle de faire des Makefile autrement plus compliqué que le tien.
 
le tien est le Makefile de base: écriture explicite de toutes les règles, de toutes les cibles, aucun symbols, etc. Je crois que t'as pas le niveau en ce qui concerne les Makefile.
 
BTW, ton Makefile est bizarre: pour nettoyer, il faut d'abord tout construire. Super ton flag g, mais tu pense qu'il serait bien d'afficher quelque warning à la compilation, plutot que d'essayer de resoudre les erreurs en debuggant?
 
dans tous les cas -Wall -Wshadow
si C ANSI -ansi -pedantic
si C99 -std=c99

Reply

Marsh Posté le 21-04-2003 à 16:38:15    

je [:drapo], je suis également interressé par le mécanisme


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 21-04-2003 à 19:46:57    

voici ce que j utilise :)
 

Code :
  1. Serveur: Serveur.o Affichage.o CalculateurGeneral.o SimulateurLocal.o Ascenseur.o List/List.o Common.o
  2. $(CC) $(DIR) $+ -o $@
  3. %.o: %.c Header.h
  4. $(CC) $(DIR) -c $< -o $@

Reply

Marsh Posté le 21-04-2003 à 19:50:55    

Slvn a écrit :

voici ce que j utilise :)


 
Mais ça sous-entend que tout fichier .cpp ne dépend que d'un seul gros fichier .h. Si c'est utilisable pour un petit projet, je me vois pas faire ça sur un gros machin.


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 21-04-2003 à 20:01:54    

bah c le principe, un fichier ne depends que de son header, et eventuelle;ent d un header plus general/
 
je vois pas ton pb en fait, t aurais voulu mettre quoi comme ligne

Reply

Marsh Posté le 21-04-2003 à 21:14:48    

++Taz a écrit :


quelqu'un à un Makefile déjà tout pret à me montrer?  :jap:  


 
A l'ancienne: man makedepend (ce qui est chiant c'est que ce programme fait partie de X11)
 
A la gnu: avec autofuck.. tu peux aussi récuperer le script depcomp qui fait partie d'automake, l'avantage c'est qu'il sait générer les dependances avec un certain nombre de compilateurs:
 

plop.o: plop.C
        source='./plop.C' object='plop.o' libtool=no \
depfile='.deps/plop.Plo' tmpdepfile='.deps/plop.TPlo' \
depmode=gcc3 /bin/sh depcomp \
g++ -c plop.C -o plop.o
 
include .deps/plop.Plo

 
 
bien sûr faut avoir un plop.Plo vide le premier coup, et les dépendances utilisées par make sont toujours celles de la compil précedente. mais comme c'est ce qu'utilise automake je pense qu'il n'y a pas de meilleure solution à base de makefiles.

Reply

Marsh Posté le 21-04-2003 à 21:21:53    

:sweat: y a vraiment personne qui sait comment récupérer simplement des tas de  
truc.o : truc.c dawa. h .... machin.h
 
???
 
edit: typo


Message édité par Taz le 21-04-2003 à 21:51:57
Reply

Marsh Posté le 21-04-2003 à 21:21:53   

Reply

Marsh Posté le 21-04-2003 à 21:49:00    

je capte pas bien tes dependance...
un .o ne depend aue d un seul .c et eventullement de plusieurs .h

Reply

Marsh Posté le 21-04-2003 à 21:52:11    

Slvn a écrit :

je capte pas bien tes dependance...
un .o ne depend aue d un seul .c et eventullement de plusieurs .h

edit   [:tomtom75]

Reply

Marsh Posté le 21-04-2003 à 21:56:46    

yep, on est d accord,  
bah utilse la regle que j ai mise plus haut...

Reply

Marsh Posté le 21-04-2003 à 21:58:37    

Slvn a écrit :

yep, on est d accord,  
bah utilse la regle que j ai mise plus haut...

:non:. edit je vois pas ou t'as vu qu'un fichier ne dépendé que de son header associé, ou alors c'est que tu positionne mal tes #include


Message édité par Taz le 21-04-2003 à 22:01:00
Reply

Marsh Posté le 21-04-2003 à 22:14:40    

les headers on s en fout dnas le make file je pense  
=> t as aucun traitement a faire, et si y en a vraiment besoin, GCC te le dira
(pas entiermeent vrai, y a tjrs moyen de contre dire ce que je dis)
 
si tu veux qq chose de generique, faut que l architecture de ton programme soit generique elle aussi pour faire qq chose de general.
 

Reply

Marsh Posté le 21-04-2003 à 22:15:40    

ben non on s'en fout pas. si les headers changent, la cible doit etre reconstruite


Message édité par Taz le 21-04-2003 à 22:15:57
Reply

Marsh Posté le 21-04-2003 à 22:29:13    

Pour chaque cible ".o", il faut générer un fichier ".d" en utilisant l'option ad hoc du compilo utilisé.
 
Avec gnu make, il est possible de foutre un fichier .d dans la partie dépendance d'une règle... et donc quand gmake vérifie les dépendances il examine tous les headers effectivement inclus dans le source.
 
Exemple : kernel linux, cf make dep.


Message édité par schnapsmann le 21-04-2003 à 22:29:49

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 21-04-2003 à 22:30:09    

ben je check

Reply

Marsh Posté le 21-04-2003 à 22:50:48    

yep c est vria quand les header change au temps pour moi :)
 
en fait il faut le mettre la :
 

Code :
  1. Serveur: Serveur.o Affichage.o CalculateurGeneral.o SimulateurLocal.o Ascenseur.o List/List.o Common.o
  2.    $(CC) $(DIR) $+ -o $@
  3.  
  4.   %.o: %.c Header.h Hedar2.h autreheader.h etc,
  5.    $(CC) $(DIR) -c $< -o $@

Reply

Marsh Posté le 21-04-2003 à 22:54:44    

toi t'as vraiment rien compris   [:tomtom75]  
 
une regle  
 
%.o : %.c
 
sera toujours utiliser par défaut si aucune autre n'est trouvé, c'est à dire que si tu as la cible
 
truc.o: truc.c truc.h dawa.h
 
c'est cette reglèe qui est utilisé.
 
pour avoir toutes les regles, il suffit de faire gcc -MM et de copier ces regles dans son Makefile. le but de ce topic, c'est d'automatiser ce traitement.

Reply

Marsh Posté le 21-04-2003 à 23:02:25    

Dans le manuel de gmake (le gros truc en LaTeX), ils utilisent (et conseillent) un truc à base de gcc -M | sed ungrosScriptQuiTue > unMakefilePartielParCible
et ils incluent tous les makefiles dans le gros makefile.
 
Je l'ai utilisé mais que en copier-coller-adapté.

Reply

Marsh Posté le 21-04-2003 à 23:09:30    

ok, connaissait pas gcc -MM,
 
mains ca l air 'dangereux de faire ca...
si ton projet est divise en module, tu fais des includes des makefile de chaque module...mais pas un truc tout autatise sans aucune structure.
 

Reply

Marsh Posté le 21-04-2003 à 23:17:40    

Slvn a écrit :

ok, connaissait pas gcc -MM,
 
mains ca l air 'dangereux de faire ca...
si ton projet est divise en module, tu fais des includes des makefile de chaque module...mais pas un truc tout autatise sans aucune structure.
 
 


 
 [:fear] c'est quoi ce post


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 23-04-2003 à 23:13:41    

http://www.delorie.com/gnu/docs/make/make_43.html
 
je retombe la dessus par hasard :pfff:


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed