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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Responsable Modération
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    septembre 2007
    Messages
    5 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    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 932
    Points : 16 242
    Points
    16 242

    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.

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