IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Systèmes de compilation Discussion :

Makefile / Liste des dépendances


Sujet :

Systèmes de compilation

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Makefile / Liste des dépendances
    Bonjour,

    Cette question concerne les makefile. Je n'ai pas trouvé de forum associé et comme il s'agit de compiler du C, je poste sur le forum C.

    j'ai besoin de compiler un .c plusieurs fois en changeant un flag de compilation à chaque fois. Je voudrais donc générer plusieurs .o différent à partir d'un seul .c.
    Je voulais stocker ces différents .o dans des directory différents. Par exemple, toto.c donnerait DIR1/toto.o DIR2/toto.o DIR3/toto.o etc...

    Mon générateur de makefile (mkmf) me génère la ligne suivante
    toto.o: toto.h unautreinclude1.h unautreinclude2.h unautreinclude3.h ...

    Je voudrais donc écrire moi-même dans le makefile une ligne qui signifierait que DIR1/toto.o a les même dependences que toto.o. Comme ça, lorsque je rajoute un include dans toto.c, mon générateur de makefile (mkmf) me réécrit la ligne qui donne les dépendances de toto.o, et ça update automatiquement les dépendances des DIR*/toto.o

    Je n'ai pas trouvé comment écrire une telle ligne. Est-ce possible?
    Et sinon, y a-t-il un autre solution pour avoir plusieurs .o alors que le générateur de makefile, qui me maintient à jour mes dépendances, ne veut que me générer les dépendances d'un simple "toto.o" contenu dans le même directory que le .c?

    Merci d'avance

  2. #2
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    39
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 39
    Points : 34
    Points
    34
    Par défaut
    Pourquoi plusieurs .o


    pas tout compris

  3. #3
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par kazuo0
    pas tout compris
    On n'est jamais oblige de repondre...

    Sinon, puisque les seuls changements sont les options de compilation et le repertoire cible, je ne ferais qu'un seul Makefile, avec une seule cible toto.o et une seule liste de dependances. Les flags et les repertoires qui changent seront obtenus par un include mk_setup dans le Makefile principal. Pour modifier le contenu de ce mk_setup, un petit script de compilation pourrait suffire.

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Mais... mon problème est que si j'utilise un mk_setup, qui me positionne par exemple la variable $(DESTINATION), dans mon makefile, j'ai toujours la ligne

    toto.o: toto.h include1.h include2.h include3.h

    et pas la ligne

    $(DESTINATION)/toto.o: toto.h include1.h include2.h include3.h

    puisque cette ligne est générée par mon générateur de makefile. (j'ai pas envie de scanner moi-même mes .c pour creer la liste des dépendances, et la maintenir à jour, alors que c'est sensé être fait par un mkmf ou automake).

    et du coup il me reste toujours le problème: comment lui dire que $(DESTINATION)/toto.o a les même dépendances que toto.o (qui, en l'occurence, n'existe pas, mais ça on s'en moque).

  5. #5
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Ben tu crees ton toto.o puis tu le deplaces dans ${DESTINATION} apres sa creation. Si tu veux faire cela proprement, tu crees un repertoire de compilation temporaire.

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Désolé, je pense que ma question est très mal posée. Mais suite à ta dernière réponse, je pense pouvoir mieux poser mon problème.

    Si je fais ce que tu dis, le make ne va jamais comparer les dates des fichiers $(DESTINATION)/toto.o et les .h pour savoir s'il doit recompiler $(DESTINATION)/toto.o

    En gros, le makefile qui marcherait serait celui contenant les lignes:

    DIR1/toto.o: toto.h incluce1.h include2.h include3.h
    DIR2/toto.o: toto.h incluce1.h include2.h include3.h

    Ainsi, il comparerait les date de DIR1/toto.o et des .h pour savoir s'il doit recompiler DIR1/toto.o, et il comparerait les dates de DIR2/toto.o et des .h pour savoir s'il doit recompiler DIR2/toto.o

    Seulement voila, la liste des includes est générée de la façon suivante:
    toto.o: toto.h incluce1.h include2.h include3.h (sans DIR* devant)

    Si je suis ta solution:
    je lance le make la dessus avec certains flags, il me génère toto.o dans le directory courant, puis je le copie dans DIR1.
    Ensuite je relance le make avec d'autres flags pour faire le toto.o du DIR2, mais comme toto.o (celui qui est dans le directory courant) a été recompilé au coup d'avant pour le DIR1, il me dit qu'il est à jour et ne le recompile pas avec les autres flags.

    Ta solution est en fait de le déplacer, pas de le copier. Mais dans ce cas, si je demande plusieurs fois DIR1/toto.o, il me recompile à chaque fois le tot.o du directory courant puisqu'il est supprimé à chaque fois, et ne s'aperçoit pas qu'il n'y a rien à faire, tout est déjà à jour.

    Du coup, je voudrais ajouter des lignes du genre
    DIR1/toto.o: <même dépendances que le toto.o de base>
    pour qu'il sache que DIR1/toto.o dépend de include2.h (par exemple) et qu'il le recompile quand include2.h est modifié.

    Si je pouvais ajouter une telle ligne, quand j'ajoute un include dans toto.c, mkmf me regénère la ligne qui donne les dépendances de toto.o (celui sans directory), et les dépendance des DIR*/toto.o s'en trouve automatiquement corrigées.

  7. #7
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Ca va devenir inutilement compliqué. Pour rester simple, il faut un Makefile qui prenne en compte ce qui change dans les differents builds (flags et repertoires) et qui ne liste chaque cible qu'une fois, avec le repertoire adequat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ${THISDIR}/toto.o: toto.h include1.h include2.h include3.h
    où THISDIR a été obtenu via un sous-Makefile inclus ou en argument à make.
    Comme tout est fait dans THISDIR mais que les dependances sont inchangées, tu es sur que chaque exec est fait de la meme facon, avec le minimum de recompilations.
    Donc tu aurais une arborescence de type
    src/
    include/
    obj_flags1/
    exec_flags1/
    ...
    obj_flagsN/
    exec_flagsN/
    et un script de controle qui appelle make avec tous les flags/repertoires qu'il faut. Si certaines sources sont communes à tous les builds, on peut meme ajouter
    obj_common
    De cette facon, je crois que tu es tranquille : les dependances sont les memes pour tous les builds (naturellement, puisque le Makefile est le meme).

Discussions similaires

  1. liste des dépendances pour un client d'EJB
    Par JacNar6 dans le forum Build
    Réponses: 2
    Dernier message: 03/07/2013, 12h17
  2. Réponses: 0
    Dernier message: 12/11/2012, 08h55
  3. Réponses: 4
    Dernier message: 05/07/2012, 18h13
  4. Liste des dépendances pour une table.
    Par Dragofeu dans le forum Développement
    Réponses: 4
    Dernier message: 17/10/2008, 09h33
  5. Générer la liste des dépendances pour Eclipse
    Par otsgd dans le forum Maven
    Réponses: 2
    Dernier message: 03/10/2006, 15h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo