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 :

Defines dans un Makefile multi-clibles


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut Defines dans un Makefile multi-clibles
    Bonjour.
    Un travail pour mon école consiste à recoder un serveur FTP doté de commandes basiques (put/get/ls/cd/pwd). Pour faire plus clean j'ai unifié les fonctions, et ce sont le même fichier qui sert pour le client ou le serveur.
    Malheureusement il y a une petite difficulté : les messages doivent s'afficher sur la sortie standard pour le client, et sur le socket pour le serveur.
    Je me suis rappelé une astuce que j'avais vu en stage : la définition de macro dans le makefile (comme ça à la compile avec le makefile je défini le fd).
    Malheuresement je ne parviens pas à l'appliquer dans le cas d'un MAkefile multi-cible, qui doit générer le client ET le serveur. Normalement l'option -D DEFINE se met dans les CFLAGS, mais dans ce cas je ne le peux, sinon elle s'applique également au serveur. Je fais suivre le Makefile :
    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
     
    STDSRC  =       func.c xfunc.c my_greps.c
    SRC     =       serveur.c $(STDSRC)
    SRC2    =       client.c $(STDSRC)
    CC      =       gcc
    OBJ     =       $(SRC:.c=.o)
    OBJ2    =       $(SRC2:.c=.o)
     
    CFLAGS  =       -W -Wall -pedantic -g 
    EXEC    =       serveur client
    serveur :	$(OBJ)
     	@gcc $(OBJ) -o $@ $(LDFLAGS)  
     
    client  :       $(OBJ2)
                    @gcc $(OBJ2) -o $@ $(LDFLAGS) -DCLIENT
    Dans ce cas là ça ne fonctionne pas ;
    Par contre si tape :
    gcc -DCLIENT client.c ... -o client, ça marche.

    Merci d'avance.
    Dernière modification par Invité ; 13/04/2008 à 15h14.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    all:: serveur client
     
    serveur::	 $(OBJ)
     	@gcc  -DSERVEUR $(OBJ) -o $@ $(LDFLAGS) 
     
    client :: $(OBJ2)
            @gcc -DCLIENT $(OBJ2) -o $@ $(LDFLAGS)
    et tu fais "make" simplement...

  3. #3
    Invité
    Invité(e)
    Par défaut
    Ça marche pas. Ce serait trop simple sinon
    Et à mon avis ća ne marche pas parce que le Makefile sépare la compilation du linkage, et les defines, ća se joue pendant la compilation (le pré-processage plus précisément). Le seul moyen de le faire serait de le mettre dans les CFLAGS mais dans ce cas là ća affecterais aussi le serveur.

    Ça m'ennuierais vraiment de faire deux fichiers.

  4. #4
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Il y a moyen d'avoir des variables spécifiques à une cible, au moins avec gmake. Mais même ça ne devrait pas suffire: il faut en plus que ce ne soit pas les mêmes .o qui soient impliqués. Ce qui fait que ces variables ne sont pas réellement nécessaires.

    Quelque chose comme (non testé):

    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
    STDSRC  =       func.c xfunc.c my_greps.c
    SRC     =       serveur.c $(STDSRC)
    SRC2    =       client.c $(STDSRC)
    CC      =       gcc
    OBJ     =       $(SRC:.c=.srv.o)
    OBJ2    =       $(SRC2:.c=.cl.o)
     
    CFLAGS  =       -W -Wall -pedantic -g 
    EXEC    =       serveur client
     
    %.srv.o: %.c
            $(CC) -c $(CFLAGS) -DSERVER $(CPPFLAGS) $< -o $@
     
    %.cl.o: %.c
            $(CC) -c $(CFLAGS) -DCLIENT  $(CPPFLAGS) $< -o $@
     
    serveur :	$(OBJ)
     	@gcc $(OBJ) -o $@ $(LDFLAGS)  
     
    client  :       $(OBJ2)
                    @gcc $(OBJ2) -o $@ $(LDFLAGS) -DCLIENT

  5. #5
    Invité
    Invité(e)
    Par défaut Ça marche ! !
    C'est génial ça marche !
    Merci beaucoup Jean-Marc.

    Malgré ça il me reste un tout petit problème...
    Le makefile est de type GNU mais à l'école on bosse sur des BSD...
    Et le BSDMake me donne l'erreur "make: don't know how to make %.c. Stop".
    (j'ai tout de même pu tester car Gmake est installé). Si tu connaissais la correspondance GNU% ->BSD

    Mais si tu ne sais pas,c'est pas grave je chercherais.
    Merci encore.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par harddisc Voir le message
    Ça marche pas. Ce serait trop simple sinon
    Et à mon avis ća ne marche pas parce que le Makefile sépare la compilation du linkage, et les defines, ća se joue pendant la compilation (le pré-processage plus précisément). Le seul moyen de le faire serait de le mettre dans les CFLAGS mais dans ce cas là ća affecterais aussi le serveur.

    Ça m'ennuierais vraiment de faire deux fichiers.
    franchement je ne vois pas pourquoi ça ne marcherait pas, si dans le code tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifdef CLIENT
    .....
    #endif
    #ifdef SERVEUR
    ...
    #endif

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    franchement je ne vois pas pourquoi ça ne marcherait pas
    Parce que donner des flags pour le préprocesseur dans la ligne de link a généralement peu d'effets.

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    arff j'avais pas vu qu'il avait mis la compil sans les flags...

    C'est qu'en general je fais vraiment pas comme ca.. je pensais que c'etait la ligne de compil (bon, ok j'avais lu vite..)

    Mais si c'etait la compil ca marche impec..

Discussions similaires

  1. Erreur dans le makefile
    Par titor dans le forum OpenGL
    Réponses: 1
    Dernier message: 23/11/2005, 22h26
  2. Réfèrence indefinie dans mon makefile
    Par legend666 dans le forum Linux
    Réponses: 2
    Dernier message: 21/11/2005, 21h58
  3. Gestion des headers dans un Makefile
    Par Weren dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 09/11/2004, 11h44
  4. MAKEFILE : Comment récupérer l'OS dans le makefile
    Par nana1 dans le forum Systèmes de compilation
    Réponses: 12
    Dernier message: 14/09/2004, 17h23
  5. Faire un setenv dans un Makefile
    Par papayou42 dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 06/07/2004, 11h37

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