[ make ] pb assez avancé de génération automatique....

pb assez avancé de génération automatique.... [ make ] - Divers - Programmation

Marsh Posté le 16-03-2005 à 11:16:07    

bonjour,
je suis en train de travailler sur un remplacement de autoconf/automake basé sur les features de gnu make....
je cherche à pousser un peu plus loin la simplification du makefile.....
pour cela je cherche à effectuer le comportement suivant :
 
dans le makefile "projet"

Code :
  1. include makefile.conf
  2. mylib.so : $(mylibsources:%.c=%.o)


 
dans le makefile.conf

Code :
  1. %.so : %.o
  2.   cmd1
  3.   cmd2
  4.   ....


 
donc dans le makefile projet : un target sans règle  
et dans le makefile de configuration : une target générique qui doit être appelée en lieu et place de celle du makefile projet
 
je sais ceci ne marche pas
en effet la règel du makefile.conf construit un .so à partir d'un seul .o
 
 
quelqu'un m'a parlé d'utiliser un truc comme cela :
makefile projet

Code :
  1. listelib= libmylib1 libmylib2
  2. sources_libmylib1 = 1.c 2.c 3.c
  3. sources_libmylib2 = a.c b.c d.c


 
dans makefile de conf

Code :
  1. $(listelib:%=%.so) : $($(@:%=sources_%):%=%.o)
  2.   cmd1
  3.   cmd2
  4.   cmd3


 
je ne suis pas sur que cela marchera..... :pt1cable:  
en particulier est-il possible de d'accéder à $@ dans la liste des prequis?
 
y aurait'il pas une manière plus simple?  :love:


Message édité par cityhunterxyz le 16-03-2005 à 15:00:26
Reply

Marsh Posté le 16-03-2005 à 11:16:07   

Reply

Marsh Posté le 16-03-2005 à 15:00:47    

up ^_^

Reply

Marsh Posté le 17-03-2005 à 09:52:55    

Code :
  1. .PHONY : all
  2. listelib = libmylib1 libmylib2
  3. libmylib1 = 1.c 2.c 3.c
  4. libmylib2 = a.c b.c d.c
  5. all : $(listelib:%=%.so)
  6. %.c :
  7. @touch $@
  8. %.o : %.c
  9. @echo compile $<
  10. $(listelib:%=%.so) : $(foreach lib,$(listelib),$($(lib):%.c=%.o))
  11. @echo "$@ : $($(@:%.so=%):%.c=%.o)"


 
here is the solution ^_^
note about the use of foreach and that the .so target has a dependency upon all librairies .o
I know this is not good since linkage will be performed for every lib each time a .o is updated  :pfff:  
but $@ variables aren't accessible in prerequis
 
oups c'est un forum français ^_^ désolé....... déformation de passe temps  :whistle:  :lol:  :pt1cable:

Reply

Marsh Posté le 17-03-2005 à 16:20:49    

wa merci cityhunterxyz pour ce tip
tu peux obtenir le mm résultat de manière plus "clean" en utilisant un méchanisme similaire à la section "automatique dependency tracking" de l'info page
 

Code :
  1. .PHONY : all
  2. listelib = libmylib1.so libmylib2.so
  3. libmylib1 = 1.c 2.c 3.c
  4. libmylib2 = a.c b.c d.c
  5. all : $(listelib)
  6. include $(listelib:%.so=%.so.d)
  7. %.c :
  8. @touch $@
  9. %.o : %.c
  10. @echo compile $<
  11. %.so.d :
  12. echo '$(@:%.so.d=%.so) : $($(@:%.so.d=%):%.c=%.o)' > $@
  13. echo ' echo hello world' >> $@


 
 :heink: g du  :pt1cable:  parceque je me réponds à moi mm..... :lol:

Reply

Marsh Posté le 17-03-2005 à 16:27:50    

[:dao]


---------------
"Il n’y a rien de noble à être supérieur à vos semblables. La vraie noblesse est d’être supérieur à celui que vous avez été auparavant."
Reply

Sujets relatifs:

Leave a Replay

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