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

C++ Discussion :

Problème sur un makefile


Sujet :

C++

  1. #1
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut Problème sur un makefile
    Bonjour,

    dans un makefile pour mingw, je fais quelque chose comme ceci

    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
     
     
    include source
     
    OUTPUT        =
    OBJECTS       =
    OBJECTS_DIR = 
     
    all: kernel data
     
    kernel: OUTPUT        = $(KERNEL_OUTPUT)
    kernel: OBJECTS       = $(KERNEL_OBJECTS)
    kernel: OBJECTS_DIR = $(KERNEL_OBJECTS_DIR)
    kernel:$(OBJECTS)
            g++ -o $(OUTPUT) $(OBJECTS)
     
    data: OUTPUT        = $(DATA_OUTPUT)
    data: OBJECTS       = $(DATA_OBJECTS)
    data: OBJECTS_DIR = $(DATA_OBJECTS_DIR)
    data:$(OBJECTS)
            g++ -o $(OUTPUT) $(OBJECTS)
     
    $(OBJECTS_DIR)/%.o: %.cpp %.h	
    	g++ -c -o $@ $<
    Le fichier source contient les définitions pour les variables suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $(KERNEL_OUTPUT) = ../debug/kernel
    $(KERNEL_OBJECTS) = ../debug/obj/Kfile1.o ../debug/obj/Kfile2.o etc...
    $(KERNEL_OBJECTS_DIR) =  ../debug/obj
    $(DATA_OUTPUT) = ../debug/data
    $(DATA_OBJECTS) =  ../debug/obj/Dfile1.o ../debug/obj/Dfile2.o etc...
    $(DATA_OBJECTS_DIR) =  ../debug/obj
    Le problème est que dans les lignes suivantes les variables $(OBJECTS) et $(OBJECTS_DIR) semblent vides :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    kernel:$(OBJECTS)
    data:$(OBJECTS)
    $(OBJECTS_DIR)/%.o: %.cpp %.h
    Comme si les lignes suivantes ne fonctionnaient pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    kernel: OBJECTS       = $(KERNEL_OBJECTS)
    kernel: OBJECTS_DIR = $(KERNEL_OBJECTS_DIR)
    data: OBJECTS       = $(DATA_OBJECTS)
    data: OBJECTS_DIR = $(DATA_OBJECTS_DIR)
    Par contre si je remplace $(OBJECTS) et $(OBJECTS_DIR) à la main dans les lignes suivantes ça fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    kernel:$(OBJECTS)
    data:$(OBJECTS)
    $(OBJECTS_DIR)/%.o: %.cpp %.h
    A noter par contre que dans tous les cas la ligne suivante fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -o $(OUTPUT) $(OBJECTS)
    Qu'est ce que je fais de mal ?

    Flo.

  2. #2
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    C'est vraiment bizarre cette histoire dans le code suivant (repris de mon 1er post) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    kernel:$(OBJECTS)
            g++ -o $(OUTPUT) $(OBJECTS)
    Dans la 1ère ligne il $(OBJECTS) me "semble" vide puisque la construction des objets individuellement ne s'est pas faite.

    Par contre dans la 2ième ligne, $(OBJECTS) contient la liste de tous mes objets. Là j'en suis sur parce que j'ai l'echo de la commande sur le terminal (cmd.exe).

    Par contre si je mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    kernel:$(KERNEL_OBJECTS)
            g++ -o $(OUTPUT) $(OBJECTS)
    C'est le code suivant qui connait pas $(OBJECTS_DIR)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $(OBJECTS_DIR)/%.o: %.cpp %.h	
    	g++ -c -o $@ $<
    GCC me renvoie "No rule to make target `../debug/obj/Kfile1.o', needed by `kernel'. Ce qui me fait dire que $(OBJECTS_DIR) ne contient pas "../debug/obj" comme je lui ai pourtant mis dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    kernel: OBJECTS_DIR = $(KERNEL_OBJECTS_DIR)
    Flo.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 47
    Points : 71
    Points
    71
    Par défaut
    Les affectations de variables ne peuvent pas se trouver dans les règles.
    Une règle étant toute la partie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cible: dependances
        commandes
    Il y a un exemple dans la doc de gnu make qui semble correspondre à ce que tu veux faire:
    http://www.gnu.org/software/make/man...#Eval-Function

  4. #4
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Je crois que tu te fourvoies là :

    http://www.gnu.org/software/make/man...t_002dspecific

    Ou alors j'ai pas compris ta réponse.

    Par contre, je pense que les targets sont définies à la lecture du makefile et ne peuvent être modifiées en cours de make.

    Et ça c'est que j'essayais de faire : modifier une variable dans une règle (ce qui fonctionnait et ça j'en suis sur) puis utiliser cette variable modifiée comme nom de target en cours de make.

    Même si je n'ai pas trouvé quelque chose pour étayer cela, je pense que c'est pour ça que ma solution ne fonctionne pas. Du coup je suis passé à une autre façon de faire.

    Dans tous les cas, merci pour la réponse.

    Flo.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème sur la recherche fulltext en v4 !
    Par poppa dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/05/2004, 23h06
  2. Problème sur fiche MDIchild
    Par nivet dans le forum Composants VCL
    Réponses: 6
    Dernier message: 23/01/2004, 08h07
  3. Problème sur GetPrivateProfileString ???
    Par Bordelique dans le forum Langage
    Réponses: 7
    Dernier message: 25/06/2003, 22h15
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

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