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 #define des fichiers sources


Sujet :

Systèmes de compilation

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 25
    Points : 12
    Points
    12
    Par défaut Makefile et #define des fichiers sources
    J'ai un programme constitué de plusieurs fichiers c. A l'intérieur tout est organisé avec des #ifdef SERVEUR #ifdef CLIENT.

    J'aimerais pouvoir compiler directement le serveur et le client sans avoir à éditer mon fichier.h pour modifier le #define CLIENT en #define SERVEUR à chaque fois !

    Je suis certain qu'il existe une solution inhérente à un Makefile. Savez-vous laquelle ?

    La solution alternative mais pourrie que j'ai trouvée c'est de créer un fichier pourri :

    touch decision.h
    echo "#define CLIENT" >> decision.h
    gcc [...]
    rm decision.h

    mais c'est pas très propre non ?

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Puisque tu sembles utiliser gcc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gcc -D CLIENT ... toto.c
    compilera le fichier toto.c comme s'il contenait

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Makefile et #define des fichiers sources
    Citation Envoyé par canard75
    J'ai un programme constitué de plusieurs fichiers c. A l'intérieur tout est organisé avec des #ifdef SERVEUR #ifdef CLIENT.

    J'aimerais pouvoir compiler directement le serveur et le client sans avoir à éditer mon fichier.h pour modifier le #define CLIENT en #define SERVEUR à chaque fois !

    Je suis certain qu'il existe une solution inhérente à un Makefile.
    Ca n'a rien a voir avec Makefile. Ton compilateur a probablement une option qui permet de définir (ou d'invalider) une macro. Exemple (Borland C, gcc):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    -DMA_MACRO     #define MA_MACRO
    -DMA_MACRO=2   #define MA_MACRO=2
    -UMA_MACRO     #undef MA_MACRO
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 25
    Points : 12
    Points
    12
    Par défaut
    Ok compris ! J'avais correctement lu le man mais je l'avais mal utilisé !

    Comment puis-je maintenant à partir du Makefile suivant avoir un:

    make all (crée avec -DSERVEUR l'executable server et avec -DCLIENT l'executable client

    make client (juste pour créer le client)
    make server (juste pour créer le serveur)

    L'idée naïve serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    client: 
         DFLAG = -DCLIENT
         all
    Mais évidemment ca ne fonctionne pas !!!

    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
    CC 	    = gcc
    CFLAGS      = -Wall 
    INCLUDE_DIR = 
    LIBS        = 
    LIB_DIR     = 
    EXEC_CL     = client
    EXEC_SE     = server
    CSRC        = $(wildcard *.c)
    COBJ        = $(patsubst %.c, %.o, $(CSRC))
    OBJS        = $(COBJ)
     
    DEFAULT: all
     
    all: $(EXEC)
     
    compile: $(COBJ)
     
    $(EXEC): $(OBJS)
    	@$(CC) $(DEF) $(LIB_DIR) $(OBJS) $(LIBS) -o $@
     
    $(COBJ): %.o : %.c
    	@$(CC) $(CCFLAGS) $(INCLUDE_DIR) -c $< -o $@
     
    clean: 
    	@rm -f *.[oa] *~
    	@rm -f $(EXEC)

  5. #5
    Membre régulier Avatar de jula
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2003
    Messages : 81
    Points : 83
    Points
    83
    Par défaut
    Salut,
    un truc comme ça, ça irait ?
    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
     
    CC        = gcc
    CFLAGS      = -Wall
    INCLUDE_DIR =
    LIBS         =
    LIB_DIR    =
    EXEC_CL   = client
    EXEC_SE   = server
    OBJ_C = client.o xxx
    OBJ_S = serveur.o xxx
     
    DEFAULT: all
     
    all: $(EXEC_CL) $(EXEC_SE)
     
    compile: $(COBJ)
     
    $(EXEC_CL): $(OBJ_C)
       @$(CC) $(DEF) -DCLIENT $(LIB_DIR) $(OBJS) $(LIBS) -o $@
     
    $(EXEC_SE): $(OBJ_S)
       @$(CC) $(DEF) -DSERVEUR $(LIB_DIR) $(OBJS) $(LIBS) -o $@
     
    $(OBJ_C): xxx
       @$(CC) $(CCFLAGS) -DCLIENT $(INCLUDE_DIR) -c $< -o $@
     
    $(OBJ_S): xxx
       @$(CC) $(CCFLAGS) -DSERVEUR $(INCLUDE_DIR) -c $< -o $@
     
    clean:
       @rm -f *.[oa] *~
       @rm -f $(EXEC)
    cordialement,
    Jula.
    Promis, avant j'ai cherché sur Google!

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par jula
    Salut,
    un truc comme ça, ça irait ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CC        = gcc
    CFLAGS      = -Wall
    Un peu léger...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CFLAGS      = -O2 -Wchar-subscripts -Wcomment -Wformat=2 -Wimplicit-int -Werror-implicit-function-declaration -Wmain -Wparentheses -Wsequence-point -Wreturn-type -Wswitch -Wtrigraphs -Wunused -Wuninitialized -Wunknown-pragmas  -Wfloat-equal -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wwrite-strings -Wconversion -Wsign-compare -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wmissing-noreturn -Wformat -Wmissing-format-attribute -Wno-deprecated-declarations -Wpacked -Wredundant-decls -Wnested-externs -Winline -Wlong-long
    Ca décoiffe plus...
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre régulier Avatar de jula
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2003
    Messages : 81
    Points : 83
    Points
    83
    Par défaut
    Emmanuel Delahaye +1
    c'est vrai que plus on prend de précaution à la compil moins on a de mauvaises surprises après (portage, maintenance, utilisateurs tordus, réutilisabilité, etc.), moi j'utilise -Wall -W, et ça fait moins peur quand on l'écrit, mais ...
    jula.
    Promis, avant j'ai cherché sur Google!

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2005
    Messages : 25
    Points : 12
    Points
    12
    Par défaut
    Merci beaucoup je crois que j'y suis maintenant !!

    D'autres objections ?

    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
    CC          = gcc
    CFLAGS      = -O2 -Wchar-subscripts -Wcomment -Wformat=2 -Wimplicit-int -Werror-implicit-function-declaration -Wmain -Wparentheses -Wsequence-point -Wreturn-type -Wswitch -Wtrigraphs -Wunused -Wuninitialized -Wunknown-pragmas  -Wfloat-equal -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wwrite-strings -Wconversion -Wsign-compare -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wmissing-noreturn -Wformat -Wmissing-format-attribute -Wno-deprecated-declarations -Wpacked -Wredundant-decls -Wnested-externs -Winline -Wlong-long 
    INCLUDE_DIR =
    LIBS        =
    LIB_DIR     =
    EXEC_CL     = client
    EXEC_SE     = server
    CSRC   = $(wildcard *.c)
    COBJ_C = $(patsubst %.c, %.$(EXEC_CL).o, $(CSRC))
    COBJ_S = $(patsubst %.c, %.$(EXEC_SE).o, $(CSRC))
     
    DEFAULT: all
     
    all: $(EXEC_CL) $(EXEC_SE)
     
    $(EXEC_CL): $(COBJ_C)
    	@$(CC) -DCLIENT $(LIB_DIR) $(COBJ_C) $(LIBS) -o $@
     
    $(EXEC_SE): $(COBJ_S)
    	@$(CC) -DSERVER $(LIB_DIR) $(COBJ_S) $(LIBS) -o $@
     
    $(COBJ_C): %.$(EXEC_CL).o : %.c
    	@$(CC) $(CFLAGS) -DCLIENT $(INCLUDE_DIR) -c $< -o $@
     
    $(COBJ_S): %.$(EXEC_SE).o : %.c
    	@$(CC) $(CFLAGS) -DSERVER $(INCLUDE_DIR) -c $< -o $@
     
    .PHONY: clean mrproper
     
    clean:
    	@rm -f *.[oa] *~       
     
    mrproper: clean
    	@rm -f $(EXEC_CL) 
    	@rm -f $(EXEC_SE)
    Canard <;-)

Discussions similaires

  1. [MAKEFILE] Séparer fichiers objets des fichiers sources
    Par LinuxUser dans le forum Systèmes de compilation
    Réponses: 13
    Dernier message: 11/11/2012, 14h31
  2. Propriété des fichiers sources ?
    Par gforce dans le forum Droit
    Réponses: 11
    Dernier message: 30/01/2007, 15h34
  3. impossible d'utiliser des fichiers sources uniques
    Par Florian.L dans le forum Code::Blocks
    Réponses: 7
    Dernier message: 11/10/2006, 15h35
  4. Installation d'un driver : suppression des fichiers source
    Par Michaël dans le forum Matériel
    Réponses: 1
    Dernier message: 14/08/2006, 21h48
  5. [InnoSetup] recuperer la liste des fichiers source
    Par Ben_Le_Cool dans le forum Installation, Déploiement et Sécurité
    Réponses: 5
    Dernier message: 26/07/2006, 17h30

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