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 :

makefile avec un comportement différent dans la même arborescence


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2015
    Messages : 6
    Par défaut makefile avec un comportement différent dans la même arborescence
    Bonjour,

    Je bloque depuis quelques temps sur un makefile. J'ai un répertoire appelé test qui contient un répertoire src avec les fichiers a.c, b.c et c.c.
    Lorsque mon makefile est dans le répertoire src, tout fonctionne bien mais si je le mets dans le répertoire test, plus rien ne fonctionne. J'ai donc simplifié le makefile pour trouver mon erreur. Depuis que je l'ai trouvé, je ne vois pas comment la corriger.

    Ce Makefile dans le répertoire test/src fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SRC= $(wildcard *.c)
    OBJ=$(SRC:.c=.o)
    test:
          @echo (SRC)
          @echo (OBJ)
    renvoie deux lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    a.c b.c c.c
    a.o b.o c.o
    Ce makefile dans le répertoire test ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SRCX= ./src
    SRC= $(SRCX)/$(wildcard *.c)
    OBJ=$(SRC:.c=.o)
    test:
          @echo (SRC)
          @echo (OBJ)
    et renvoie deux lignes
    Si je remplace $(wildcard *.c) par les fichiers en dur,cela fonctionne. Mais je veux la génération automatique des fichiers.

    Une piste est la bienvenue.

    Autre problème rencontré:

    Si j'ai l'arborescence suivante test/src/include/header1/a.h , test/src/include/header2/b.h et test/src/include/header3/c.h, alors c'est la catastrophe.
    Je ne vois pas comment indiquer dans mon option I$(INC) les différents répertoires des headers.
    Une piste ?

    Merci à vous tous par avance.

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SRCX=./src
    SRC=$(wildcard $(SRCX)/*.c)
    OBJ=$(SRC:.c=.o)
    test:
    	@echo $(SRC)
    	@echo $(OBJ)
    Fonctionne avec GNU Make 4.1.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2015
    Messages : 6
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SRCX=./src
    SRC=$(wildcard $(SRCX)/*.c)
    OBJ=$(SRC:.c=.o)
    test:
    	@echo $(SRC)
    	@echo $(OBJ)
    Fonctionne avec GNU Make 4.1.
    BOnjour Matt_Houston,

    J'ai mis à jour ma version de make, et j'ai corrigé ma syntaxe. Ca fonctionne à présent. Aurais-tu une idée pour déclarer plusieurs repertoires headers dans ma variable

    où INC contient différents répertoires de fichier.h ?

    Merci par avance.

  4. #4
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INC_FILES=$(wildcard */*.h)
    INC_DIRS=$(sort $(dir $(INC_FILES)))
    test:
    	@echo $(INC_FILES)
    	@echo $(INC_DIRS)
    Pour rechercher à une profondeur arbitraire il te faut un makefile récursif, fortement déconseillé. Si c'est le cas crées plutôt un makefile par sous-répertoire ou utilises un outil de plus haut niveau (automake, CMake...).


    EDIT: je n'avais pas bien compris ta requête. Essaies avec $(addprefix -I,$(INC_DIRS)), pas testé mais ça devrait fonctionner.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2015
    Messages : 6
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INC_FILES=$(wildcard */*.h)
    INC_DIRS=$(sort $(dir $(INC_FILES)))
    test:
    	@echo $(INC_FILES)
    	@echo $(INC_DIRS)
    EDIT: je n'avais pas bien compris ta requête. Essaies avec $(addprefix -I,$(INC_DIRS)), pas testé mais ça devrait fonctionner.
    Bonjour Matt_Houston,
    Désolé de ne pas répondre immédiatement, j'ai du réinstaller ma debian car j'ai mal effectué mon upgrade et j'ai perdu mon xserver. J'ai testé ce que tu as proposé. De prime abord, cela ne donne rien mais je m'en inspire. Des que j'ai un résultat, je poste mes quelques lignes.

    Merci à toi.

  6. #6
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    No prob, tu réponds quand ça te chante, on n'est pas aux pièces.

    Ici $(addprefix ...) fonctionne ; comment l'as-tu testé ?

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Avril 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Avril 2015
    Messages : 6
    Par défaut
    Bonjour Matt_Houston,

    Je ne sais pas si j'ai bien décrit ce que je souhaitais, dans le doute je redonne mon arborescence.
    ├── bin
    ├── lib
    ├── makefile
    ├── obj
    └── src
    ** ├── a.c
    ** ├── b.c
    ** ├── c.c
    ** └── include
    **** ├── a
    **** │** └── a.h
    **** ├── b
    **** │** └── b.h
    **** └── c
    **** |** └── c.h

    D’après le man; l'option permet d'indiquer les répertoires à inclure. J'avais naïvement fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SRCX=./src
    INC=$(SRC)/include
    SRC=$(wildcard $(SRCX)/*.c)
    OBJ=$(SRC:.c=.o)
    CLFAGS=$(addprefix -I,$(INC))
    test:
    	@echo $(SRC)
    	@echo $(OBJ)
    	@echo $(CLFAGS)
    Le résultat est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ./src/a.c ./src/c.c ./src/b.c
    ./src/a.o ./src/c.o ./src/b.o
    -I./src/a.c -I./src/c.c -I./src/b.c/include

    En fait, ce que j'essaie de faire est la recherche automatique des différents header dans les différents répertoires.


    Voici, le makefile de mon projet qui se situe au même niveau que celui ci-dessus.

    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
    DEBUG=yes
    CC=g++
    ifeq ($(DEBUG),yes)
    	CFLAGS=-W -Wall -ansi -pedantic -g
    	LDFLAGS=
    else
    	CFLAGS=-W -Wall -ansi
    	LDFLAGS=
    endif
    EXEC=my_exe
    SRC=$(wildcard *.cpp)
    OBJ=$(SRC:.cpp=.o)
     
    all:$(EXEC)
    ifeq ($(DEBUG),yes)
    	@echo "Generation en mode debug"
    else
    	@echo "Generation en mode release"
    endif
    $(EXEC): $(OBJ)
    	$(CC) -o $@ $^ $(LDFLAGS)
    main.o: myst.h
    %.o: %.cpp
    	$(CC) -o $@ -c $< $(CFLAGS)
     
    .PHONY: clean mrproper
    clean:
    	rm -f *.o *~
    mrproper:
    	rm -rf $(EXEC)

  8. #8
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Comme je te l'avais dit, pour rechercher dans une arborescence arbitraire un seul makefile ne suffit pas. En revanche rien ne t'empêche d'invoquer le shell :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INC_DIR = ./src/include
    INC_FILES = $(shell find $(INC_DIR) -type f -name *.h)

Discussions similaires

  1. Réponses: 8
    Dernier message: 09/06/2015, 14h01
  2. [PHP 5.0] Chemin relatif d'un 'include' dans une arborescence différente
    Par darkterreur dans le forum Langage
    Réponses: 13
    Dernier message: 18/05/2011, 11h01
  3. Réponses: 6
    Dernier message: 06/02/2008, 14h05
  4. Importer un dump dans une arborescence différente
    Par Rockman018 dans le forum Import/Export
    Réponses: 4
    Dernier message: 19/04/2007, 11h02

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