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 :

[Sous Makefile] Comment ça marche ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Par défaut [Sous Makefile] Comment ça marche ?
    Bonsoir,

    Je suis à développer une petite application client serveur qui a la forme suivante :

    _Trunk/
    _Trunk/Client/
    _Trunk/Client/client.c
    _Trunk/Client/client.h
    _Trunk/Client/MakeFile
    _Trunk/Serveur/serveur.c
    _Trunk/Serveur/serveur.h
    _Trunk/Serveur/MakeFile
    _Trunk/librairie.c
    _Trunk/librairie.h
    Mon problème actuel est le suivant. Je ne comprends pas la partie consacrée aux sous makefile dans l'Introduction à Makefile

    En effet, je ne vois pas comment le makefile qui se situerait au Trunk/ pourrait savoir comment aller dans les sous dossiers Client et Serveur.
    A quoi correspondrait la partie :

    EXEC=$(HELLO_DIR)/hello

    Parce que moi j'aurai deux exécutables que sont ./ratioClientTCP et ./ratioServeurTCP

    Là, nous avons l'impression qu'il n'y aura qu'un seul exécutable de généré dans tous les cas :s


    Pour les réels "sous makefile", je n'aurai juste qu'à enlever mes actuels constantes qui seront déjà définie dans le makefile principal, le makefile du Trunk/.


    Merci beaucoup de toute l'aide que vous pourrez m'apporter
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  2. #2
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Tout dépend de ce que tu définit comme règles de compilation dans ton makefile

    Tu as accès a tout les les commandes systèmes (cd, cp, mv, ....)
    rien ne t'empêche non plus d'appeler d'autres makefile dans d'autres répertoires aussi si tu en connait le chemin, ou de générer tes cibles dans des répertoires différent de celui ou tu lance la commande.

    Par défaut la commande make cherchera a exécuter la règle de compilation la plus proche du haut de ton fichier make.

    s'il ne sait pas la faire, il va examiner les dépendances qui lui manquent et chercher à les résoudre. il s'agit en fait d'un parcours d'arbre ou make va analyser chaque noeud et décider de ce qui est a compiler.

    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    all: A B
     
    A: E.o A.c
      gcc A.c E.o -o A 
     
    B: B.c
      gcc B.c -o B 
     
    E.o: E.c E.h
      gcc E.c E.h -o E.o
    ici on a les arbres de dépendances suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    A                                         B
    |                                          |
    +---------+                           B.c
    A.c          E.o
                   |
                   +-------------+
                  E.c                 E.h
    pour construire A, make va vérifier l'arbre de dépendance de façon récursive
    pour faire A make doit construire A.c et E.o

    pour construire A.c pas de règle, donc vérification de l'existence du fichier et de sa date (si plus récent que A, A sera a reconstruire)

    pour construire E.o un règle existe, make vérifie a nouveau les dépendances
    il trouve uniquement les fichier E.C et E.h qui n'ont pas de regles, si ces derniers sont plus récent que E.o il reconstruit E.o et reconstruira pas conséquent A

    une fois A.c et E.o analysé et éventuellement reconstruit si leur date de création/modification est plus récente que A ou si A n'existe pas Make exécute la commande de compilation de A (ici gcc ...)


    je ne sais pas si j'ai été clair mais il s'agit du fonctionnement de make dans les grandes lignes.

    quelques liens utiles sur tout ce que je viens de dire et pas mal d'autre choses.
    http://cs.millersville.edu/~katz/linuxHelp/make.html
    http://www.jfranken.de/homepages/joh...inhalt.en.html
    http://www.ugrad.cs.ubc.ca/~cs219/Co.../multMake.html
    http://www.ugrad.cs.ubc.ca/~cs219/Co.../multMake.html
    https://cdcsp.univ-lyon1.fr/~kielbas.../docs/make.pdf

  3. #3
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Par défaut
    Bonjour,

    Merci de votre réponse, je vais aller voir les liens en espérant comprendre un peu mieux.

    En ce qui concerne votre question pour la teneur de mes makefiles, je peux vous montrer à quoi ressemble mes sous make file mais il ne s'agit que d'une reprise du makefile proposé dans l'introduction aux makefile (lien dans le post précédent)

    Pour le client :
    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
     
    CC=gcc
    CFLAGS=-Wall -Wextra -O -Wstrict-prototypes -Wunreachable-code -g
    LDFLAGS=
    EXEC=chatTCP_client
    SRC= $(wildcard *.c)
    OBJ= $(SRC:.c=.o)
     
    all: $(EXEC)
     
    chatTCP_client: $(OBJ)
    	@$(CC) -o $@ $^ $(LDFLAGS)
     
    main.o: client.h
     
    %.o: %.c
    	@$(CC) -o $@ -c $< $(CFLAGS)
     
    .PHONY: clean mrproper
     
    clean:
    	rm -rf *.o
     
    mrproper: clean
    	rm -rf $(EXEC)
    Pour le serveur :
    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
     
    CC=gcc
    CFLAGS=-Wall -Wextra -O -Wstrict-prototypes -Wunreachable-code -g
    LDFLAGS=
    EXEC=ratioTCP_serveur
    SRC= $(wildcard *.c)
    OBJ= $(SRC:.c=.o)
     
    all: $(EXEC)
     
    ratioTCP_serveur: $(OBJ)
    	@$(CC) -o $@ $^ $(LDFLAGS)
     
    %.o: %.c
    	@$(CC) -o $@ -c $< $(CFLAGS)
     
    main.o: serveur.h
     
    .PHONY: clean mrproper
     
    clean:
    	rm -rf *.o
     
    mrproper: clean
    	rm -rf $(EXEC)
    ______

    Cela vous semble-t-il correct ?

    Trunk/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
    16
    17
    18
    19
    20
    21
    22
    23
     
    export CC=gcc
    export CFLAGS=-Wall -Wextra -O -Wstrict-prototypes -Wunreachable-code -g
    export LDFLAGS=
    CLIENT_DIR=Client
    SERVEUR_DIR=Serveur
    EXEC=$(CLIENT_DIR)/ratioTCP_Client $(SERVEUR_DIR)/ratioTCP_Serveur
     
    all: $(EXEC)
     
    $(EXEC):
    	@(cd $(CLIENT_DIR) && $(MAKE))
    	@(cd $(SERVEUR_DIR) && $(MAKE))
     
    .PHONY: clean mrproper $(EXEC)
     
    clean:
    	@(cd $(CLIENT_DIR) && $(MAKE) $@)
    	@(cd $(SERVEUR_DIR) && $(MAKE) $@)
     
    mrproper: clean
    	@(cd $(CLIENT_DIR) && $(MAKE) $@)
    	@(cd $(SERVEUR_DIR) && $(MAKE) $@)
    Trunk/Client/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
    16
    17
    18
    19
    20
    21
    22
     
    EXEC=ratioTCP_client
    SRC= $(wildcard *.c)
    OBJ= $(SRC:.c=.o)
     
    all: $(EXEC)
     
    ratioTCP_client: $(OBJ)
    	@$(CC) -o $@ $^ $(LDFLAGS)
     
    main.o: client.h
     
    %.o: %.c
    	@$(CC) -o $@ -c $< $(CFLAGS)
     
    .PHONY: clean mrproper
     
    clean:
    	rm -rf *.o
     
    mrproper: clean
    	rm -rf $(EXEC)
    Trunk/Serveur/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
    16
    17
    18
    19
    20
    21
    22
     
    EXEC=ratioTCP_serveur
    SRC= $(wildcard *.c)
    OBJ= $(SRC:.c=.o)
     
    all: $(EXEC)
     
    ratioTCP_serveur: $(OBJ)
    	@$(CC) -o $@ $^ $(LDFLAGS)
     
    %.o: %.c
    	@$(CC) -o $@ -c $< $(CFLAGS)
     
    main.o: serveur.h
     
    .PHONY: clean mrproper
     
    clean:
    	rm -rf *.o
     
    mrproper: clean
    	rm -rf $(EXEC)
    Merci,
    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  4. #4
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    je n'ai pas de shell sous la main, mais le principe me semble correct,

    cependant tu peux peu être utiliser des include des tes sous makefile dans ton makefile principal.


    http://www.gnu.org/software/make/man...e.html#Include

  5. #5
    Inactif   Avatar de Deallyra
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    1 997
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 1 997
    Par défaut
    Merci de vos réponses

    *Si la réponse vous convient, n'oubliez pas le tag
    *Exprimez vous dans un français correct; on prend le temps de vous lire, prenez le temps de bien écrire.
    *Et comment on interprète votre code? N'oubliez pas la balise!

    *Pour une mise en page simple avec des divs.
    *Pour faire des formulaires xHTML CSS.

  6. #6
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    aucun soucis

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

Discussions similaires

  1. [MakeFile] Comment intégrer un dir include sous DOS?
    Par Jean_Benoit dans le forum Systèmes de compilation
    Réponses: 2
    Dernier message: 06/10/2006, 21h14
  2. Makefile comment ça marche
    Par m_psy4 dans le forum Langage
    Réponses: 1
    Dernier message: 30/07/2006, 23h20
  3. [SYNEDIT] -> Comment ça marche ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/01/2004, 19h11
  4. [TP][Turbo Vision] comment ça marche ??
    Par Costello dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 05/08/2003, 00h24
  5. [update][req. imbriquee] Comment ca marche ??
    Par terziann dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/07/2003, 12h51

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