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 "invente" une règle de compilation..


Sujet :

Systèmes de compilation

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 72
    Par défaut Makefile "invente" une règle de compilation..
    Bonjour,

    j'essaie de faire un Makefile qui compile (séparément) tous les fichiers sources contenus dans le dossier courant et qui déplace les executables obtenus dans un autre dossier (ici ../../bin)

    Evidement, je souhaite que la compilation n'ai lieu que pour les sources dont les binaires sont obsolètes par rapport au code source.

    Initialement je laissais les binaires dans le dossier courant, et tout fonctionnait parfaitement.
    Maintenant que j'ai modifié mon makefile en changeant la dépendance pour la compilation:

    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    %: $(BIN_DIR)/%
     
    $(BIN_DIR)/%: %.cc
    # compile
    le makefile fait n'importe quoi et surtout lance la compilation avec g++ alors qu'il n'en est fait nulle part mention dans le makefile !!

    Il l'invente littéralement...

    Mon makefile pour que ce soit plus clair:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    BIN_DIR = ../../bin
     
    SRC=$(wildcard *.cc)
    OP=$(SRC:.cc=)
     
    all: $(OP)
     
    %: $(BIN_DIR)/%
     
     
    $(BIN_DIR)/%: %.cc
    #    Ici je mettrais la compilation et le déplacement dans BIN_DIR

  2. #2
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Je suis pas sur que tu soit dans la bonne section, mais c'est normal. Par défaut, CPP=g++.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 72
    Par défaut
    Je n'ai pas trouvé de section Makefile, et puis comme je sais que les programmeurs C++ sont des gens avisés ...

    Même si CPP=g++ par defaut, je ne lui dit nulle part d'executer CPP, il n'y a aucune commande dans mon script makefile, il est tel que je l'ai posté, sans une ligne de plus.

    Par defaut, Makefile "rajouterais" la commande CPP ? C'est plutôt étrange.

  4. #4
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Oui, tu as des règles par défaut. (.cc.o par exemple). Aussi, dans un make file simple, souvent on se contente d'une seule règle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    appli : %.cpp=.o
      $(CPP) -o $@ $^ $(LFLAGS)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 72
    Par défaut
    Je trouve ça vraiment curieux... je ne fais appel à CPP nul part...

    Sinon étant moi même programmeur en C++ et donc par conséquent éclairé, j'ai fini par trouver comment arriver à mes fins :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SRC=$(wildcard *.cc)
    OP=$(SRC:%.cc=$(BIN_DIR)/%)
     
    all: $(OP)
     
     
    $(BIN_DIR)/%: %.cc
    # Compilation ici

    Apparement make n'aime pas la combinaison de règles

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    %: $(BIN_DIR)/%
     
    $(BIN_DIR)/%: %.cc
    sans que je comprenne pourquoi...

    Donc j'ai concaténé le repertoire directement dans la variable OP, et ça marche !

  6. #6
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Hum, tu sais que à chaque ligne, le % est reéavlué ? Donc si dans une ligne tu à % : %, % sera bien remplacé par chacun des nom de fichier de ton rep. Là, ton %, ce que tu en veux, c'est le % de %.cc... Qui n'est spécifié nul part sur la ligne oO !

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 72
    Par défaut
    Je ne comprends pas ce que tu veux dire, il y'a beaucoup de % dans ton explication, je m'y perds un peu :/

  8. #8
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    L'expression % est reéavlué à chaque règle.

    dossier : fichier.c fichier.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    %.c:%.h # ici % = fichier
      blabla
    %: # ici % = fichier.c:fichier.h
      blabla

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 72
    Par défaut
    Je pense qu'il y'a quelquechose que je n'ai pas compris avec make

    pour moi
    signifie pour avoir la cible fichier, il faut d'abord vérifier la dépendance BIN_DIR/fichier

    D'ou l'appel de la règle suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $(BIN_DIR)/%:%.cc
    # Compilation de fichier.cc
    qui signfie pour moi : pour avoir BIN_DIR/fichier, il faut vérifier la dépendance fichier.cc

  10. #10
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Et si tu à un fichier toto.h, il va te chercher la règle BIN_DIR/toto.h, et te renvoyé sur les rose parce qu'il ne la connait pas cette règle...

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 72
    Par défaut
    Impossible,

    mon dossier ne contient que des .cc, et les deux seules façons d'appeller make sont :

    make fichier, qui compile uniquement le fichier
    et
    make, qui compile tous les fichiers (privés de leur extension).

    Si quelqu'un peut m'expliquer pourquoi ça ne fonctionne pas, ça m'aiderait à comprendre make.

    Sinon, merci à toi qui a pris la peine de me répondre

  12. #12
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Sa soulève une qustion que je m'étais jamais posé. % peut-il valoir Makefile ? mais bon.

    Sinon, la règle : Elle veut littéralement dire pour chaque fichier, si le fichier dans BIN_DIR du même nom n'existe pas, fabriqué le fichier (grace à la-dite règle).

    Hors, tu à une règle pour faire BIN_DIR/%:%.cc et non BIN_DIR/%[.cc]:%[.cc]

    essaye : [EDIT] A y réfléchir, j'aurais du commencer par là. Désolé, ça fait assez longtemps que j'ai pas fait de makefile pas basic, et en plus, c'est la fin de semaine >< !

  13. #13
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Bon j'ai mis deux relecture, mais là, j'ai un sérieux doute.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    %.cc: $(BIN_DIR)/%
     
    $(BIN_DIR)/%:: %.cc
    Comme ça, la deuxième ligne se fiche qu'il y ait une règle %.cc. Sinon j'ai peur que ça fasse une vielle boucle.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 72
    Par défaut
    Merci pour ta réponse !

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