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] rm automatique :(


Sujet :

Systèmes de compilation

  1. #1
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut [Makefile] rm automatique :(
    Bonjour,

    je viens d'écrire ce makefile tout simple, qui me permet de créer les .exe correspondant aux .cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    GCC_C_FLAGS = -c -Wall -Werror -pedantic -pedantic-errors -std=c++98
    GCC_L_FLAGS = 
     
    CC = g++ $(GCC_C_FLAGS) $< -o $@
    LL = g++ $(GCC_L_FLAGS) $< -o $@
     
    SRC = $(wildcard *.cpp)
    OBJ = $(SRC:.cpp=.o)
    EXE = $(SRC:.cpp=.exe)
     
    all: $(EXE)
    	@echo --- --- Tous les executables ont ete crees --- ---
     
    %.exe: %.o
    	@$(LL)
    	@echo "- $@"
     
     
    %.o: %.cpp
    	@$(CC)
     
    clean:
    	rm -f *.o
     
    distclean: clean
    	rm -f *.exe
    Mais le résultat n'est pas tout à fait celui que j'attendais, quand je tapes make (avec juste le Makefile et les .cpp présents) voilà ce que ça donne :
    $ make
    - ex1.exe
    - ex2.exe
    --- --- Tous les executables ont ete crees --- ---
    rm ex1.o ex2.o
    $
    Je ne vois pas d'où vient ce rm ... Et d'ailleurs ce n'est pas juste un bug d'affichage, les .o sont bien effacés.


    Si quelqu'un a une idée ... je suis perplexe là.

    ps: je me demande aussi comment ne pas utiser l'extension .exe pour les éxécutables, tout en gardant la génération automatique de tous les executables

  2. #2
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Ça fait longtemps que je n'ai pas fait de makefile, mais:
    - a priori ce n'est pas ton 'clean' qui fait le rm (t'aurais rm -f et non rm ex1.o ex2.o)
    - si tu fait "make all" as-tu le meme comportement ?
    - tu peux lancer make en mode debug (-d voire --debug=<flag>, cf man make) et il devrait t'afficher la liste des règles qu'il a appliqué

  3. #3
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    make all c'est pareil,
    par contre avec -d il y a un paquet d'infos de debug, et voilà les 3 dernières lignes :

    Refabrication du fichier cible « all » réussie.
    Suppression des fichiers intermédiaires...
    rm ex3.o ex1.o ex2.o
    Ça veut dire qu'il se rend compte tout seul que .exe ne dépend que d'un .o qui lui même ne dépend que d'un .cpp, donc il pense qu'il peut virer le .o pour gérer les états de mises à jour?
    Si c'est ça, c'est bizarre. Et dans ce cas comment je fais pour garder les .o?


    ps: attention derrière toi un singe à 3 têtes...

  4. #4
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Le clean est visiblement exécuté automatiquement.
    Rajoute un @echo "Cleaning" à clean pour voir.

  5. #5
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Citation Envoyé par MatRem
    Ça veut dire qu'il se rend compte tout seul que .exe ne dépend que d'un .o qui lui même ne dépend que d'un .cpp, donc il pense qu'il peut virer le .o pour gérer les états de mises à jour?
    Exact, avec GNU make, il considere le .o comme etant un fichier intermediaire qu'il peut donc effacer.

    Citation Envoyé par MatRem
    Si c'est ça, c'est bizarre. Et dans ce cas comment je fais pour garder les .o?
    En rajoutant une regle .PRECIOUS qui depend de ton/tes fichiers que tu veux garder.

    ps: attention derrière toi un singe à 3 têtes...

    tu as une banane dans la poche ou tu es content de me voir ?

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    mais non..

    pour des cibles (target) il faut :: et non : ..

    Donc

    clean::

    ensuite, en général on ne met pas

    all : $(EXE)

    où $(EXE) ne correspond pas à une cible mais à une instruction...


    C'est :

    all : Make_Exe

    Make_Exe :: $(EXE)
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  7. #7
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Super, merci D[r]eadLock .

    Par contre c'est bizarre je n'ai jamais eu ce soucis de rm automatique des .o auparavant... Il devait toujours y avoir un intérêt de garder les .o pour la gestion des "up to date".


    Citation Envoyé par Alp
    Le clean est visiblement exécuté automatiquement.
    C'est ce que je croyais au début, mais non.

    Citation Envoyé par souviron34
    mais non..
    Mais non quoi?


    Citation Envoyé par souviron34
    pour des cibles (target) il faut :: et non : ..
    Ça sert à quoi :: ? J'ai toujours mis : moi


    Citation Envoyé par souviron3
    ensuite, en général on ne met pas

    all : $(EXE)

    où $(EXE) ne correspond pas à une cible mais à une instruction...

    C'est :

    all : Make_Exe

    Make_Exe :: $(EXE)
    Heu j'avoues que là je vois pas l'intérêt, surtout que $(EXE) n'a rien d'une instruction, c'est juste la liste des .exe.
    En plus je doute que make me laisse placer une instruction à la place d'une dépendance... si?

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par MatRem
    Mais non quoi?
    mais non à D[r]eadLock

    Citation Envoyé par D[r
    eadLock]
    Citation Envoyé par MatRem
    Ça veut dire qu'il se rend compte tout seul que .exe ne dépend que d'un .o qui lui même ne dépend que d'un .cpp, donc il pense qu'il peut virer le .o pour gérer les états de mises à jour?
    Exact, avec GNU make, il considere le .o comme etant un fichier intermediaire qu'il peut donc effacer
    NON make ne considère pas le .o comme un fichier intermédiaire qu'il peut effacer... Heureusement, sinon tous les gens qui font des grosses biblothèques n'arrêteraient pas de tout recompiler chaque fois qu'ils changent une ligne quelque part !!!!!!!!!!!!!


    Référez-vous au manuel en ligne http://www.gnu.org/software/make/manual/make.html




    Citation Envoyé par MatRem
    Ça sert à quoi :: ? J'ai toujours mis : moi

    http://www.gnu.org/software/make/man...ersus-Implicit



    Citation Envoyé par MatRem
    Heu j'avoues que là je vois pas l'intérêt, surtout que $(EXE) n'a rien d'une instruction, c'est juste la liste des .exe.
    En plus je doute que make me laisse placer une instruction à la place d'une dépendance... si?
    est une règle (signe =), pas une cible (signe : ou :...

    Or donc quand on fait all: $(EXE) on demande à appliquer une règle.. Mais sur quoi ??

    Et comme les cibles n'ont pas de "::", mais juste des ":", make descend tout le fichier ligne à ligne .. et donc termine par le rm ...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  9. #9
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Citation Envoyé par souviron34
    NON make ne considère pas le .o comme un fichier intermédiaire qu'il peut effacer... Heureusement, sinon tous les gens qui font des grosses biblothèques n'arrêteraient pas de tout recompiler chaque fois qu'ils changent une ligne quelque part !!!!!!!!!!!!!
    Et si http://www.gnu.org/software/make/man...#Chained-Rules
    Pour les biblio, je pense que gcc -M doit etre utiliser (pour generer les dependances) et tous les objets sont 'mentionnes' et donc pas consideres comme intermediaires.


    Citation Envoyé par souviron34
    Et comme les cibles n'ont pas de "::", mais juste des ":", make descend tout le fichier ligne à ligne .. et donc termine par le rm ...
    Non, sinon make executerais rm -f *.o et non rm ex1.o ex2.o

    Maintenant le probleme doit effectivement venir du fait que les .o ne sont pas 'mentionnes' et make les considere comme etant intermedaires, et peut les supprimer. Par contre, il trouve bien la regle %.exe : %.o puisqu'il affiche correctement le @echo "- $@".

    Par exemple si tu mets cette regle explicite (ce qui rends ex1.o mentione)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ex1.exe : ex1.o
    	@$(LL)
    	@echo "- $@"
    il va garder ex1.o

    Et pour garder tout tes .o
    Rq: je n'ai pas lu toute la doc, et ne sais donc ce qui rend un fichier mentionne (mentioned dans la doc).
    Quant au $(SRC...) et :: ou : ou =, je ne connais pas trop...

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par D[r]eadLock
    Et si http://www.gnu.org/software/make/man...#Chained-Rules
    Pour les biblio, je pense que gcc -M doit etre utiliser (pour generer les dependances) et tous les objets sont 'mentionnes' et donc pas consideres comme intermediaires.
    Eh non

    Les fichiers intermdédiares sont ceux IMPLIQUES par une règle (comme ils l'iniquent : de yacc à .o il faut passer par .c, qui, pusiqu'on n'a pas mis de règle explicite, est implicitement compilé , et est donc intermédiaire...


    Je réitère : les .o NE SONT PAS INTERMEDIAIRES et NE SONT PAS éliminés.. Heureusement ...

    j'ai une bibliothèque où j'ai 350 .o (350 modules) répartis dans 8 rpertoires et aggégés au sein de 4 bilbiothèques statiques .a.

    Une fois les .o compilés, ils restent là, sauf si EXPLICITEMENT tu les détruits, et ne sont recompilés QUE si il y a un changement au .c.

    Citation Envoyé par D[r]eadLock
    Quant au $(SRC...) et :: ou : ou =, je ne connais pas trop...
    voir le lien mentionné... Je répète : un "::" spécifie une CIBLE STATIQUE, et donc quelque chose d'atteignable par exemple par "make cible"..

    donc dans le cas cité, on ferait par exemple

    all :: make_exe

    makeexe::
    $(CC) ......

    clean::
    rm -f *.o

    cleanall::
    rm -f *.o *.a *.exe


    et par défaut "make" ferait "make all", et pour effacer il faudrait faire "make clean"
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  11. #11
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Bon, j'avoues que la solution de D[r]eadLock fonctionne trés bien, et que le rm ne semble pas venir de ma cible clean.
    En plus make en mode debug m'annonce bien qu'il détruit les fichiers temporaires...

    Je vais regarder du coté des ::, voir si c'est intéressant. Parceque la dernière explication du ::, j'ai l'impression qu'elle fonctionne aussi pour :, non?

Discussions similaires

  1. Code::Blocks makefile automatique
    Par Shaiky dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 22/04/2009, 07h25
  2. recherche makefile automatique
    Par zais_ethael dans le forum C
    Réponses: 6
    Dernier message: 10/02/2008, 00h01
  3. Création d'un makefile pour compilation automatique
    Par freestyler dans le forum Delphi
    Réponses: 48
    Dernier message: 08/06/2007, 14h47
  4. makefile automatique ou manuel
    Par julien.63 dans le forum Systèmes de compilation
    Réponses: 7
    Dernier message: 22/05/2007, 09h08
  5. makefile automatique ou manuel
    Par julien.63 dans le forum C
    Réponses: 0
    Dernier message: 17/05/2007, 12h34

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