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 :

[linux] tuto sur le makefile


Sujet :

Systèmes de compilation

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 7
    Points : 4
    Points
    4
    Par défaut [linux] tuto sur le makefile
    Bonjour tout le monde
    ma question est simple. quand je recopie le makefile du tuto:
    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
     
    all: hello
    hello: hello.o main.o
            gcc -o hello hello.o main.o
     
    hello.o: hello.c
            gcc -o hello.o -c hello.c -Wall -ansi
     
    main.o: main.c hello.h
            gcc -o main.o -c main.c -Wall -ansi
     
    clean:
            rm -rf *.o
     
    mrproper: clean
            rm -rf hello
    Pour après la compilation reussie, j'ai toujours dans mon repertoire les fichiers .o ? alors que je croyais que la regle clean était faite mais elle ne l'est pas. pourquoi ?
    merci de votre éclairage
    ++

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Bonjour,
    si j'ai bien compris, vous faites un :
    qui compile correctement votre projet et souhaiterez que la partie clean soit réalisée?

    Si c'est le cas, par défaut, la commande make exécute la partie all. si vous souhaitez exécuter la partie clean, il faut le préciser :

  3. #3
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    677
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 677
    Points : 638
    Points
    638
    Par défaut
    contrairement à un lecteur humain qui exécute les tâches en partant du
    haut de la liste et en descendant

    les tâches du makefile sont exécutées en partant du bas et en remontant

    donc on commence par virer l'exécutable et les .o puis on les reconstruit

  4. #4
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par HRS
    contrairement à un lecteur humain qui exécute les tâches en partant du
    haut de la liste et en descendant

    les tâches du makefile sont exécutées en partant du bas et en remontant

    donc on commence par virer l'exécutable et les .o puis on les reconstruit
    Non, ca ne commence pas par le bas, ni par le haut d'ailleurs (enfin parfois en partie).
    De plus toute les regles ne sont pas systematiquement applique, fort heureusement d'ailleurs car sinon si tout les .o etait detruit, l'ensemble des fichiers seraient recompilés ce qui prendrait un temps certains pour les gros projets.

    En fait il y a deux cas a distinguer :

    * tu appelles make en specifiant la cible (par exemple make clean) : dans ce cas le makefile commence par cette regle.
    * tu appelles make sans preciser de cible, alors la premiere regle rencontree (en commencant par le haut du fichier) est execute (soit la regle all dans le cas de l'exemple).

    Le mecanisme d'execution est ensuite le suivant :
    * lorsqu'une regle est evalue, on commence par evalue recursivement ces dependances.
    * lorsque les dependances ont ete evaluees et si au moins une des dependances est plus recente que la cible, si la cible ne correspond pas a un fichier ou si elle est dans .PHONIE alors les commandes de cette regle sont appliquees.

    La regle clean n'apparaissant ni dans les dependances de la regle all ni dans les dependances parcourues, elle n'est pas execute lors de l'appel a make.

    Pour l'executer il faut donc soit utiliser la methode de gege2061 soit modifie la regle all pour qu'elle devienne :

    Par contre d'une maniere generale je te deconseille, en phase de dev ou de debug, de supprimmer systematiquement les .o, en effet puisque celles les cibles plus anciennes que leur dependances sont reconstruites, conserver les .o permet, si les dependances sont correctement definies bien entendue, de recompiler tout ce qui est necessaire et seulement cela plutot que de recompiler tout le projet a chaque fois ce qui s'avere etre, sur de gros projets, un gain de temps considerable.
    Par contre avant une recette ou si tu as un doute sur tes dependances (peur d'en avoir oublie) la il est necessaire de tout supprimmer puis de lancer la compilation complete

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    explication claire, précise et qui répond à ma question. qu'est ce que tu veux que je dise à part MERCI ? j'ai rien d'autre à ajouter

  6. #6
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    677
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 677
    Points : 638
    Points
    638
    Par défaut
    Voulez-vous dire que l'ordre des instructions (conditionnées ou non)
    importe peu, et que présenté comme infra, cela donne les mêmes résultats ?

    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
     
     
    hello.o: hello.c
            gcc -o hello.o -c hello.c -Wall -ansi
     
    main.o: main.c hello.h
            gcc -o main.o -c main.c -Wall -ansi
     
    clean:
            rm -rf *.o
     
    hello: hello.o main.o
            gcc -o hello hello.o main.o
     
    mrproper: clean
            rm -rf hello
    all: hello

  7. #7
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 638
    Points
    7 638
    Par défaut
    Salut,

    Citation Envoyé par HRS
    Voulez-vous dire que l'ordre des instructions (conditionnées ou non)
    importe peu, et que présenté comme infra, cela donne les mêmes résultats ?
    D'après ce que j'ai compris, pas tout à fait.
    Dans le makefile que tu présentes, en l'appelant sans préciser la cible, la première règle rencontrée est celle construisant hello.o. Donc au final, tu te retrouveras avec le fichier objet hello.o, et terminé.
    Avec le premier makefile présenté, la première règle était "all", qui construisait l'exécutable (via les récursions construisant les divers fichiers objets).

    L'ordre n'a pas d'importance, mais la première règle présentée en a une (en général, quand on tape "make", c'est pour construire le fichier cible principal). Ensuite, c'est juste affaire d'appel des fichiers nécessaires à la résolution de la règle, donc peu importe dans quel ordre se trouvent les règles construisant ces fichiers, elles seront appelées quand cela sera nécessaire.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  8. #8
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par plegat
    Salut,

    Citation Envoyé par HRS
    Voulez-vous dire que l'ordre des instructions (conditionnées ou non)
    importe peu, et que présenté comme infra, cela donne les mêmes résultats ?
    D'après ce que j'ai compris, pas tout à fait.
    Dans le makefile que tu présentes, en l'appelant sans préciser la cible, la première règle rencontrée est celle construisant hello.o. Donc au final, tu te retrouveras avec le fichier objet hello.o, et terminé.
    Avec le premier makefile présenté, la première règle était "all", qui construisait l'exécutable (via les récursions construisant les divers fichiers objets).

    L'ordre n'a pas d'importance, mais la première règle présentée en a une (en général, quand on tape "make", c'est pour construire le fichier cible principal). Ensuite, c'est juste affaire d'appel des fichiers nécessaires à la résolution de la règle, donc peu importe dans quel ordre se trouvent les règles construisant ces fichiers, elles seront appelées quand cela sera nécessaire.
    C'est bien ca

Discussions similaires

  1. Réponses: 0
    Dernier message: 05/12/2010, 18h28
  2. 2 systeme linux identique sur 2 hd differents
    Par tomnie dans le forum Administration système
    Réponses: 17
    Dernier message: 30/03/2004, 11h17
  3. tuto sur MDI
    Par nicholz dans le forum Composants VCL
    Réponses: 2
    Dernier message: 25/01/2003, 17h37

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