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 et repertoires


Sujet :

Systèmes de compilation

  1. #1
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut Makefile et repertoires
    voilà mon soucis: j'utilise makefile et gcc pour la compilation de mon projet:
    voici l'arborescence du projet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    proj
     \ bin
     \ obj
     \ src
        \base
        \fem
            \base
        \math
    ... etc ...
    tous les fichier cpp et .h son dans les répertoires src/*
    je veux que tous les .o généré aillent dans le répertoire obj (sans arborescence dans ce répertoire là)
    src/base/toto.cpp -> obj/toto.o
    src/fem/base/titi.cpp -> obj/titi.o
    j'utilise un makefile unique se trouvant dans la racine du projet...

    l'idée étant de ne pas spécifier explicitement tous les finchiers donc j'ai utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SRC = $(sort $(wildcard $(SRCDIR)*.cpp $(SRCDIR)*/*.cpp $(SRCDIR)*/*/*.cpp $(SRCDIR)*/*/*/*.cpp))
    pour avoir la liste des fichiers sources (c'est pas beau d'ailleur si qqun a mieux, je prends)
    j'arrive à avoir la liste des .o correspondant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OBJ = $(patsubst %.cpp,$(OBJDIR)%.o,$(notdir $(SRC)))
    maintenant, problème... comment c'ezst t'y qu'on dois faire pour relier les deux tableaux
    j'aurai bien fait un truc style
    """ for i=1..nFichier, gcc -o $OBJ(i) $SRC(i) (si 'besoin') """
    mais je sais pas comment avec makefile
    avec 'besoin'= une des dépendances modifiée...

    j'avais presque trouvé avec un for src in $(SRC) mais ensuite on ne peut rien faire avec $$src: pas ce modifications de chaines... c nul!!!

    enfin bref, cela m'a tout de même permis d'écrasser tous les contenus de mes fichiers .cpp .... je pensais activé svn après ça, j'aurais du le faire avant!!!
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  2. #2
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    C'est bien compliqué !
    Pourquoi ne fais-tu pas des sous-makefile dans chaque dossier appelés par le makefile maître à la racine, pour compiler ? Ca ne fait aussi qu'une commande à taper en console, sans se prendre la tête avec ces listes de variables...
    Tu peux déplacer d'un coup les .o après la compilation et avant de linker si vraiment tu veux tous les avoir dans un dossier à part, non ?

  3. #3
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    l'idée c'est que je ne suis qu'au début de mon projet et je sais pas encore quels seront exactement les répertoire... cela me faisait chi$¤* de devoir coller un makefile dans chaque fichier....

    cela dit j'ai une solution qui fait presque la blague:
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    #===========================================================
    #
    #  Makefile du projets LachFem
    #
    #  Auteur               : ............................
    #  Date de création     : ...........................
    #  Date de modification : ...........................
    #
    #  Version Actuelle du projet: ......
    #
    #  Histoire:
    #    - ..........
    #
    #===========================================================
     
    #variables
     
     
    SRCDIR = <rep_racine_source>
    OBJDIR = <rep_de_objet>
     
    EXEC    = <nom_executable>
    DEPFILE = $(OBJDIR)mk.depend
    SRC = $(wildcard $(SRCDIR)*.cpp $(SRCDIR)*/*.cpp $(SRCDIR)*/*/*.cpp $(SRCDIR)*/*/*/*.cpp)
    OBJ = $(patsubst %.cpp,$(OBJDIR)%.o,$(notdir $(SRC)))
    OBJS= $(patsubst %.cpp,%.o,$(notdir $(SRC)))
    CFLAGS = -O3
    LFLAGS = -O3
    INCLIB = -I. \
             -I/usr/include \
             -I/usr/include/w32api \
             -I/lib/gcc/i686-pc-cygwin/4.3.4/include \
             -I/lib/gcc/i686-pc-cygwin/4.3.4/include/c++ \
             -I/lib/gcc/i686-pc-cygwin/4.3.4/include/c++/i686-pc-cygwin \
             -I/lib/gcc/i686-pc-cygwin/4.3.4/include-fixed
    INLIB = -lstdc++
     
    #les programmes
    MSQ = @
    MSG = $(MSQ)echo
    RM  = $(MSQ)rm -rf
    CC  = $(MSQ)gcc
    MSG_OK = $(MSG) " Ok"
     
     
    ifeq ($(wildcard $(DEPFILE)), ) 
    all:$(DEPFILE)
    include $(DEPFILE)
    else
    include $(DEPFILE)
    all:$(EXEC)
    endif
     
     
    $(EXEC):$(OBJS)
        $(MSG) -n "==== édition de liens: "
        $(CC) $(LFLAGS) $(OBJ) -o $(EXEC) $(INLIB)
        $(MSG_OK)
        $(MSG) "Tout va bien!"
     
    $(DEPFILE): $(SRC)
        $(MSG) -n "dependances :"
        $(RM) $(DEPFILE)
        $(CC) -MM $(SRC) $(CFLAGS) $(INCDIR) >> $(DEPFILE)
        $(MSG_OK)
     
    $(OBJS):
        $(MSG) -n "---- compilation $*.cpp :"
        $(CC) -c $< -o $(OBJDIR)$@ $(CFLAGS) $(INCDIR)
        $(MSG_OK)
     
     
    clean:
        $(RM) $(OBJ) $(DEPFILE)
     
    #============ fin du makefile ========================
    en fait si j'ai bien compris le fonctionnement, les dépendances dans le fichier mk.depend sont écrite comme par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    toto.o:./src/base/toto.cpp ./src/base/toto.h
    et en incluant cette ligne on rajoute donc bien les dépendance de toto.o
    lors du second appel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $(OBJS):
        $(MSG) -n "---- compilation $*.cpp :"
        $(CC) -c $< -o $(OBJDIR)$@ $(CFLAGS) $(INCDIR)
        $(MSG_OK)
    il n'y a pas de dépendance mais $< n'est pas vide car il va chercher celle qui ont été définies avant.... on traite ainsi le toto.o au lieu du ./obj/toto.o

    des problèmes demeure:
    -à chaque lancement 'make all' il recompile TOUT.... il ne tiens pas compte des modifications sélective... => mon idée serait de transformer le fichier mk.depend pour rajouter le rep des objets en début de chaque ligne ainsi on traitera directement les dépendances du fichier et non plus un alias... est-ce que 'gcc -MM' a une option pour ça? sinon comment on peut simplement ajouter une chaine de caractère en début de chaque ligne?

    -si on lance 'make' tout seul il fait n'importe quoi...
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

  4. #4
    Membre éclairé Avatar de genteur slayer
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2002
    Messages
    710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2002
    Messages : 710
    Points : 825
    Points
    825
    Par défaut
    J'ai trouvééééééééééééééééééééééé!!!!! yahou!!!

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    #===========================================================
    #
    #  Makefile du projet ................
    #
    #  Auteur               : .................
    #  Date de création     : ................
    #  Date de modification : ................
    #
    #  Version Actuelle du projet: ................
    #
    #  Histoire:
    #    - ver  -- date -- comment
    #    - ..... -- ...... -- .....................................
    #
    #===========================================================
     
    #variables
    SRCDIR = ./src/
    OBJDIR = ./obj/
    EXEC    = ./bin/LachFem
    DEPFILE = $(OBJDIR)mk.depend
    INCDIR = 
    LIBDIR = 
    INCLIB = -lstdc++
     
    #les programmes et leurs options
    MSQ = @
    MSG = $(MSQ)echo
    MSG_OK = $(MSG) " Ok"
    MSG_CCOK = $(MSG) " a été correctement compilé"
    MSG_DEPOK = $(MSG) " *** dépendances calculées"
    MSG_BUILDOK = $(MSG) "Le Projet a été construit!"
    RM  = $(MSQ)rm -rf
    CC  = $(MSQ)gcc
    SED = sed -e "s/\(.*\.o:\)/$(subst /,\/,$(OBJDIR))\1/g"
    CFLAGS = -O3 -Wall
    LFLAGS = -O3 -Wall
     
    #variables automatiques
    SRC = $(wildcard $(SRCDIR)*.cpp $(SRCDIR)*/*.cpp $(SRCDIR)*/*/*.cpp $(SRCDIR)*/*/*/*.cpp)
    SRC_H = $(wildcard $(SRCDIR)*.h $(SRCDIR)*/*.h $(SRCDIR)*/*/*.h $(SRCDIR)*/*/*/*.h)
    OBJ = $(patsubst %.cpp,$(OBJDIR)%.o,$(notdir $(SRC)))
     
    all:
     
    ifeq ($(wildcard $(DEPFILE)), ) 
    all:$(DEPFILE)
    -include $(DEPFILE)
    else
    include $(DEPFILE)
    all:$(EXEC)
    endif
     
     
    $(EXEC):$(OBJ)
        $(MSG) "==== édition de liens ===== "
        $(CC) $(LFLAGS) $(OBJ) -o $(EXEC) $(LIBDIR) $(INCLIB)
        $(MSG_BUILDOK)
     
    $(DEPFILE): $(SRC) $(SRC_H)
        $(MSG) "Calcul des dependances..."
        $(RM) $(DEPFILE)
        $(CC) -MM $(SRC) $(CFLAGS) $(INCDIR) | $(SED) > $(DEPFILE)
        $(MSG_DEPOK)
     
    $(OBJ):
        $(MSG) "---- compilation $*.cpp ------"
        $(CC) -c $< -o $@ $(CFLAGS) $(INCDIR)
        $(MSG) -n " +++ $*.cpp "
        $(MSG_CCOK)
     
     
    clean:
        $(RM) $(OBJ) $(DEPFILE)
     
    #============ fin du makefile ========================
    voilà!!! bon cela dit, il faut quand même un système qui connaisse sed me permettant de substituer les chaines de caractères...

    cela dit, dans cette version, il n'y a plus de problèmes: make seul fonctionne...
    et make ne reconstruit que ce qui a été changé....

    les dépendances sont recalculée à chaque modification/ajout de fichier cpp ET h... on ne recompile l'objet *.o que si une de ses dépendances a été modifié...

    et le script n'a pas besoin d'être changer lors d'ajouts de fichiers ou de répertoires sources!!! le top!
    il n'y a que ceux qui savent qui ne savent pas qu'ils savent...
    Libere-toi hacker, GNU's Not Unix!!!

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

Discussions similaires

  1. Makefile C++ et sous repertoires
    Par betaplus dans le forum Systèmes de compilation
    Réponses: 3
    Dernier message: 20/08/2014, 11h10
  2. Makefile + plusieurs repertoires
    Par florianjoy54 dans le forum C
    Réponses: 2
    Dernier message: 02/12/2010, 17h50
  3. changer de repertoire lors de l'exécution d'une makefile
    Par jeanjack dans le forum Débuter
    Réponses: 5
    Dernier message: 24/04/2009, 15h36
  4. placer dans des repertoire les resultat du makefile
    Par Didier77 dans le forum Systèmes de compilation
    Réponses: 4
    Dernier message: 12/05/2007, 15h53
  5. Réponses: 3
    Dernier message: 11/05/2007, 17h46

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