Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Invité de passage
    Inscrit en
    avril 2012
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : avril 2012
    Messages : 2
    Points : 0
    Points
    0

    Par défaut Makefile: pourquoi fichiers intermediaires supprimés automatiquement

    Bonjour,
    Quand j'exécute mon Makefile celui ci efface des fichiers intermédiaires et je ne comprend pas pourquoi.
    Voici un exemple simplifié de ce que je veux faire:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
     
    all: toto.a
     
    %.a : %.b
    	cp $< $@
     
    %.b : %.c
    	cp $< $@
    Quand j'exécute la commande
    dans un répertoire contenant un fichier toto.c j'obtient:
    Code :
    1
    2
    3
    4
     
    cp toto.c toto.b
    cp toto.b toto.a
    rm toto.b
    Je ne comprend pas pourquoi le fichier toto.b est effacé. Il y a certainement un mécanisme de make qui m'échappe, pourtant j'ai l'impression d'avoir déjà utilisé ce genre de makefile...

    Si je relance la commande make all, j'obtient "nothing to do for all" alors que le répertoire ne contient pas de toto.b!

    Si vous pouviez m'éclairer sur ce point je pourrai enfin arrêter de m'arracher les cheveux

    Merci

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 5 223
    Points : 13 072
    Points
    13 072

    Par défaut

    Hello,

    Tu obtiens « nothing to do… » car tu as toujours « toto.a », qui est la seule dépendance officielle de « all ».

    Pour le reste, tu peux lire ce chapitre sur les chaînes de règles implicites : http://www.gnu.org/software/make/man...#Chained-Rules

    En l'occurrence, le fichier *.b est nécessaire pour relier *.a à *.c, mais n'est spécifié explicitement nulle part dans le Makefile. Puisque c'est make qui a pris l'initiative de le générer pour produire ce que tu lui as demandé, il est normal qu'il nettoie en fin de processus. Sauf si tu lui passes une directive pour lui demander de ne pas le faire.

    Voir aussi : http://gl.developpez.com/tutoriel/outil/makefile/

  3. #3
    Invité de passage
    Inscrit en
    avril 2012
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : avril 2012
    Messages : 2
    Points : 0
    Points
    0

    Par défaut

    Bonjour,

    Merci Obsidian pour ta réponse et pour le lien vers la partie de la doc Gnu make qui parle des chaînes de règles implicites.

    Je pensais que même si toto.a est la seul dépendance officielle de all, make doit regarder si toto.a n'est pas la cible d'une autre règle (ici %.a: %.b).
    Ce comportement est effectivement dû aux chaînes de règles implicites (si on remplace les % par toto tout se déroule comme je m'y attend).

    On en parle ici avec quelques propositions pour éviter cette suppression automatique.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •