Forum Programmation.c++ makefile pour code divisé en modules

Posté par  .
Étiquettes : aucune
0
6
déc.
2006
Bonjour,

J'ai développé un code depuis un certain temps mais avec tous les fichiers *.h et *.cc dans le même répertoire.

Je cherche à diviser mon code en module, c'est-à-dire à mettre dans chaque répertoire(ou module) les fichiers correspondants (*.hh et *.cc).

Je dois ainsi réécrire le Makefile mais j'avoue ne pas être un spécialiste.
Est-ce que qqn peut me donner des conseils et les règles pour compiler chaque module ( avoir un Makefile par module: que dois-je mettre dans ce Makefile) et puis pour compiler l'intégralité du projet et créer mon exécutable (Makefile à la racine du projet: que dois-mettre dedans)??

Merci d'avance,

Xavier
  • # Un makefile par répertoire.

    Posté par  . Évalué à 2.

    Bonjour,

    Le bon sens nous pousse à utiliser un Makefile par répertoire, sauf cas particuliers où il n'y a rien à compiler ou à traiter d'une manière générale dans ces dépôts.

    Ensuite, on compile en général toutes les sources et ressources d'un même module en un seul *.o local, puis le Makefile du premier niveau les assemble tous avec le main pour former l'exécutable final.

    Après, cela dépend un peu de ton niveau en matière de Makefile. Tu n'es pas obligé d'utiliser de règles implicites ou autres optimisations dans le genre, mais il faut au minimum écrire correctement ses dépendances (tout l'intérêt d'un Makefile).

    http://www.google.fr/search?hl=fr&q=Makefile&btnG=Re(...)
    • [^] # Re: Un makefile par répertoire.

      Posté par  . Évalué à 1.

      D'abord merci de ta réponse,
      c'est ce que j'avais commencé à faire: un makefile par répertoire.
      Donc je dois compiler l'ensemble des .cc de chaque répertoire dans les Makefiles associés aux différents répertoires.
      Mais quand dans un fichier, j'ai un include d' un fichier qui se trouve dans un autre répertoire, je dois définir des dépendances.

      Peux-tu m'indiquer un cours ou site internet où je pourrai avoir des infos plus précises sur les makefiles??

      Merci,
      • [^] # Re: Un makefile par répertoire.

        Posté par  . Évalué à 1.

        les includes ne sont pas relatifs vraiment au makefile mais au compilateur, il faut lui indiquer le bon chemin avec l'option -I

        exemple
        gcc -I ../include_mon_brol -o hello hello.c

        Tu peux aussi déclarer des variables dans ton makefile ;-)
    • [^] # Recursive make considered harmful

      Posté par  . Évalué à 3.

      Le bon sens nous pousse à utiliser un Makefile par répertoire, sauf cas particuliers où il n'y a rien à compiler ou à traiter d'une manière générale dans ces dépôts.

      Ensuite, on compile en général toutes les sources et ressources d'un même module en un seul *.o local, puis le Makefile du premier niveau les assemble tous avec le main pour former l'exécutable final.

      Sauf quand les dépendances sont plus complexes que ça...
      http://www.canb.auug.org.au/~millerp/rmch/recu-make-cons-har(...) explique (en anglais) pourquoi les "make" récursifs posent problème, et y propose une solution non-récursive simple à mettre en oeuvre.
    • [^] # Re: Un makefile par répertoire.

      Posté par  . Évalué à 3.


      Le bon sens nous pousse à utiliser un Makefile par répertoire


      Hmm... Par ici le bon sens nous pousserait plutot a avoir un Makefile par projet. Les targets s'ecrivent assez simplement comme ca:

      SRCS=liquides/lait.c liquides/eau.c solides/farine.c solides/sucre.c
      OBJS=$(SRCS:.c=.o)
      # ajoute les CFLAGS qui vont bien pour les include paths

      libgateau.a: $(OBJS)
      ar rcv libgateau.a $(OBJS)

      Avec des regles par defaut pour transformer un .c en .o, cette ligne suffit a compiler tous les sources en objet puis les assembler en libgateau.a. Peu importe que les sources viennent de plusieurs repertoires comme on peut le voir.

      Ajoute une target par librairie, puis les lignes qui vont bien pour compiler les executables.

      Avoir plusieurs Makefiles dans un projet fait du sens si tu as des libs externes (que tu n'as pas developpees). Dans ce cas tu as envie de les garder les plus proches possible de la distribution initiale.

      Ce n'est qu'un exemple a adapter a tes sources. De maniere generale, moins tu as de Makefiles et mieux tu t'en porteras. Si tu as un jour d'autres plateformes a supporter qui necessitent une intervention sur le Makefile tu seras content d'en avoir moins a supporter.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.