Précédent   Forum du club des développeurs et IT Pro > C et C++ > Outils pour C & C++
Outils pour C & C++ Forum d'entraide sur les outils de développement pour C & C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 06/04/2012, 11h36   #1
rasfan
Invité de passage
 
Inscription : 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
rasfan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/04/2012, 23h08   #2
Obsidian
Modérateur
 
Avatar de Obsidian
 
Homme
Chercheur d'emploi
Inscription : septembre 2007
Messages : 4 614
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 36
Localisation : France, Essonne (Île de France)

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

Informations forums :
Inscription : septembre 2007
Messages : 4 614
Points : 11 078
Points : 11 078
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/
Obsidian est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/04/2012, 12h38   #3
rasfan
Invité de passage
 
Inscription : avril 2012
Messages : 2
Détails du profil
Informations forums :
Inscription : avril 2012
Messages : 2
Points : 0
Points : 0
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.
rasfan est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 14h42.


 
 
 
 
Partenaires

Hébergement Web