TP 2 - Make et autres outils pour la construction
Licence 3 Informatique - 2007-2008
PhilippeCollet,
NicolasNobelis
URL de cette page :
http://deptinfo.unice.fr/twiki/bin/view/Linfo/GLEnvtProg0708TP2
Objectifs
- Comprendre le fonctionnement d'un makefile explicite (cible, dépendance, mise à jour), puis des règles implicites.
- Créer un makefile par adaptation.
- Expérimenter quelques directives.
- Utiliser les différents types de variables.
- Créer un makefile avec des règles implicites et savoir créer ces règles.
- Ce TP devrait durer une séance et demi.
Premier makefile explicite pour l'outil de conversion
Nous allons construire et modifier progressivement un makefile pour automatiser au mieux la construction de l'outil de conversion, implémenté en C et vu en cours.
- Créez un répertoire TP2 pour ce TP.
- Récupérez l'archive conversion.tgz et décompactez-la dans un répertoire créé pour cette série d'exercice (conversion semble un nom intéressant).
- Etudiez le fichier Makefile.1 et essayez de construire l'application à l'aide de
make
.
- Que faudrait-il faire pour que, par défaut, l'application soit construite sans donner son nom de cible ? Faites-le dans un fichier Makefile.2
- Que faudrait-il faire pour que tout se construise simplement en tapant
make
(sans paramètres) et sans renommer ou recopier Makefile.2 ? Faites-le !
- Ajoutez des commentaires au fichier Makefile.2 (vous le ferez systématiquement à partir de maintenant), par exemple pour expliquer les dépendances de compilation séparée et la reliure finale.
Gestion des fichiers d'en-têtes
- Modifiez le fichier convertir.h pour que le taux passe à 6.55957. Relancez
make
. Que se passe-t-il ? Quel devrait être le comportement normal ?
- Créez un Makefile.3 qui gère correctement les .h (recherchez les dépendances dans les fichiers sources). Pour tester votre makefile, modifiez la date des divers fichiers .h avec la commande
touch
, puis relancez make
pour observer si seuls les fichiers dépendants du .h modifié ont été recompilés.
- Effectuez le même genre de tests que précédemment (
touch
, make
), mais exécutez la commande make
avec l'option qui affiche les commandes qui seraient exécutées, sans les exécuter.
Faire le ménage
- Ajoutez une cible clean qui efface tous les fichiers inutiles (
/bin/rm *.o *.bak *~ core
).
- Que se passe-t-il si vous lancez deux fois de suite la commande
make clean
? Rendez cette cible robuste !
- Ajoutez à ce makefile une règle veryclean qui, en plus d'éliminer les fichiers qui ne vous intéressent pas, efface aussi l'exécutable. Utilisez la règle clean pour créer cette nouvelle cible.
Création d'un nouveau makefile
Rien ne se perd, tout se transforme : on crée la plupart du temps un makefile en récupérant et en adaptant un précédent makefile.
- Créez un répertoire pacman pour la suite de ce TP.
- Récupérez l'archive leretourdepacman.tgz et décompactez la.
Nous allons maintenant construire, progressivement, le makefile idéal pour ce programme...
- Recopiez la meilleure version de votre Makefile pour la conversion et adaptez la pour pacman.
- Si vous ne faites que changer les cibles, les .c et les .h, cela fonctionne-t-il ? Pourquoi ? Ajoutez les bibliothèques manquantes et retestez.
- Pour faire les choses bien, il faudrait aussi référencer les "include" graphiques dans les cibles "gcc -c ...". Pourquoi cela fonctionne-t-il quand même ? Rajoutez tout de même le -I qui référence les "include".
- Testez que les dépendances (.c/.h) sont correctement gérées à l'aide de
touch
.
- Ajoutez une cible install qui déplace l'exécutable créé dans votre répertoire bin.
- Débrouillez vous pour que, par défaut, le makefile construise et installe pacman !
Manipulation des variables d'environnement
- Créez un makefile dont la cible par défaut affiche la valeur des variables SHELL, OSTYPE et USER.
- Regardez l'effet produit en fonction du caractère d'exportation de ces variables (comparer le résultat à l'aide de
set
et export
dans votre shell)
- Modifiez ces valeurs en appelant le makefile (par exemple
make USER=pipo
).
- Regardez l'effet produit, à l'exécution de make, puis dans le shell qui a lancé make.
- Qu'en déduisez-vous ?
--
NicolasNobelis - 12 Feb 2008
to top