Le on 4 : Loutil makefile
Objectifs de la le on 4 loutil makefile
- D duire les avantages de la compilation conditionnelle.
- Construire un graphe de d pendance des fichiers constituant une
application.
- Reconnaitre les r gles d criture dun fichier makefile.
- Utiliser loutil makefile pour mettre en place un m canisme de
compilation conditionnelle.
-
Identifier les commandes qui permettent lex cution dun fichier
makefile.
Plan de la le on 4 loutil makefile
o 4.1 Introduction
o 4.2 R gles d criture dun fichier makefile
o 4.3 Exemple
o 4.4 Ex cution dun fichier makefile
o 4.5 Utilisation des variables et des macro-commandes
59
4.1 Introduction :
Loutil Makefile est un moyen pratique pour compiler et lier des programmes repartis sur
plusieurs fichiers. Le principe du Makefile est de construire un graphe de d pendance des
fichiers constituant lapplication, surcharg pour chaque fichier par la commande qui permet
de le r g n rer partir des fichiers dont il d pend. On lance linterpr teur de Makefile par la
commande make . La diff rence entre make et un script Shell classique est que make
connait si une cible est jour ou non, ce qui lui permet de d cider si cette cible doit tre
reconstruite, ou peut tre conserv e (on parle alors de compilation conditionnelle). Lorsquon
demande make de refaire une cible, il d termine quelles sont les sous-cibles qui ne se
sont pas jour, les r g n rera avant de r g n rer la cible principale. En effet, lorsquun seul
fichier parmi les fichiers sources est modifi , il nest pas n cessairement utile de recompiler
tous les fichiers sources pour r g n rer lex cutable final. Ceci permet de gagner du temps en
ne recompilant que les fichiers sources sur lesquels la modification du code effectu e a un r el
impact. En particulier, la commande make permet dassurer la compilation s par e gr ce
la commande gcc , et ceci en ne recompilant que le code modifi (compilation
conditionnelle), tout en ayant la possibilit dutiliser des commandes Shell (ce qui tr s utile,
surtout pour r aliser des installations).
4.2 R gles d criture dun fichier makefile :
Les fichiers makefile sont structur s selon des r gles qui d finissent ce qui doit tre ex cut et
Advertisement
qui permettent de compiler un programme. En effet, une r gle est une suite dinstructions qui
seront ex cut es pour construire un cible, mais uniquement si des d pendances sont plus
r centes (par rapport lex cution pr c dente de la cible). La syntaxe dune r gle est comme
suit :
cible : d pendances
commandes
60
Avec :
- La cible d signe g n ralement le nom dun fichier qui va tre g n r par les
commandes qui vont suivre, sachant que lespace qui pr c de commandes est
obligatoire et doit tre fait avec une tabulation.
- Les d pendances d signent les fichiers ou les r gles n cessaires la cr ation de
la cible . Par exemple, pour la compilation C, les d pendances peuvent contenir un
fichier den-t te ou un fichier source.
- Les commandes repr sentent g n ralement les commandes Shell qui seront
ex cut es au moment de la cr ation de la cible . Il est possible de faire appel sur la
m me ligne une suite de commandes s par es par un caract re point-virgule ; .
Dans le cas o les commandes d passent une ligne, il est obligatoire de signaler la fin
de ligne avec un caract re antislash \ .
Notons que les lignes qui d butent par le caract re # sont des lignes de commentaires. Par
exemple, soit le graphe suivant de d pendance des fichiers constituant lapplication
(lex cutable r sultat dans cet exemple est intitul sum ), tels que les fl ches repr sentent
les inclusions.
Figure 4.1 Exemple de graphe de d pendance des fichiers constituant une application.
61
Le fichier makefile correspondant ce graphe est comme suit :
sum: main.o sum.o
gcc o sum main.o sum.o
main.o: main.c sum.h
gcc c main.c
sum.o: sum.c sum.h
gcc c sum.c
Figure 4.2 Contenu du fichier makefile .
4.3 Exemple :
Soit le fichier makefile suivant, sachant que all , qui d bute g n ralement les fichiers
Advertisement
makefile, regroupe dans ces d pendances lensemble des ex cutables produire et clean
permet de supprimer tout les fichiers interm diaires. Notons que mrproper permet de
supprimer tout ce qui peut tre r g n r et permet une reconstruction compl te du projet.
all : executable
executable : file1.o file2.o
gcc -o executable file1.o file2.o
file1.o : file1.c file1.h
gcc -c file1.c
file2.o : file2.c file1.h file2.h
gcc -c file2.c
clean :
rm file1.o file2.o executable core
Figure 4.3 Contenu du fichier makefile .
Par d faut, la premi re d pendance rencontr e tentera d tre r solue : all . Cette cible
n cessite de remettre jour toutes les conditions situ es droite des : et make passe
donc lunique cible suivante executable . Dapr s la deuxi me ligne du makefile, on voit
62
que executable d pend des deux fichiers objets file1.o et file2.o . R cursivement,
les fichiers dont d pendent file1.o et file2.o sont recherch s. Si un des fichiers
d pendants est plus r cent quun des fichiers cibles au cours de cette recherche, le fichier
cible doit tre r g n r , et la r gle de compilation ( commandes ) associ e est ex cut e.
4.4 Ex cution dun fichier makefile :
Pour ex cuter un fichier makefile, on fait recours la commande make comme suit :
make all
La commande make interpr te le fichier makefile et ex cute les commandes contenues
dans la r gle all , une fois les d pendances ont t v rifi es. Si ces d pendances ont t
modifi es depuis la derni re compilation, la compilation de ces fichiers modifi s entra ne la
mise jour des cibles. Dans le cas o la commande make est utilis e sans argument, elle
ex cute la premi re r gle rencontr e. En effet, pour ex cuter un ensemble dactions, la
commande make requiert par d faut un fichier nomm makefile. Si le fichier qui contient
lensemble dactions est intitul autrement (par exemple actions ), il faut utiliser loption
f avec la commande make , tout en sp cifiant le nom du fichier, comme suit :
make f actions
Toutefois, il est possible de ne g n rer quun cible particulier et ceci en sp cifiant son nom
en tant que param tre pour la commande make . Par exemple, pour ne g n rer que le
Advertisement
fichier file2.o dans lexemple pr c dent, il suffit d crire :
make file2.o
63
Par exemple, soit le fichier makefile suivant :
Lobjectif de ce makefile est de cr er un ex cutable res qui d pend de trois fichiers objets
walmain.o , walfact.o et aff_bjr.o . Le fichier objet walmain.o est g n r partir
du fichier walmain.c (par la commande gcc c walmain.c ).
Notons que le fichier walmain.c fait appel au fichier walfct.h suivant (c.f. Le on 2.) :
64
Le fichier objet walfact.o est g n r partir du fichier walfact.c (par la commande
gcc c walfact.c ).
De m me, le fichier objet aff_bjr.o est g n r partir du fichier aff_bjr.c (par la
commande gcc c aff_bjr.c ).
Ainsi, pour ex cuter ce fichier makefile, on fait recours la commande make sans
arguments, ce qui permet dinterpr ter le fichier makefile et ceci en ex cutant la premi re
r gle rencontr e ( all ). Cependant, la commande make clean ne permet dex cuter que
la ligne dont la cible est clean . En lan ant de nouveau la commande make , le message
Rien faire pour all est affich , vu quaucune des d pendances na t modifi e entre
temps.
65
4.5 Utilisation des variables et des macro-commandes :
La commande make utilise des variables pr d finies et des macro-commandes, tels que les
variables sont consid r es comme des macro-commandes (comme #define en langage C).
La d claration dune variable doit tre plac e en d but du fichier makefile et elle se fait
comme suit :
Variable=Valeur
Il est aussi possible dutiliser les variables denvironnement du Shell, qui seront export es
comme des macros. Ensuite, pour faire appel une variable, il suffit de pr c der son nom
entre parenth ses par le caract re dollar $ (comme en Shell). Par exemple, la macro
$(HOME) correspondent la variable denvironnement HOME . De m me, si on
d clare une variable comme suit CC = gcc , il est possible par la suite dutiliser $(CC)
prog.c pour compiler le programme prog.c . En effet, on adopte souvent les conventions
de nommage suivantes :
66
Variable/Macro-
Advertisement
commande
CC
CXX ou CPP
CFLAGS
CXXFLAGS
LDFLAGS
EXEC
RM
$@
$<
$^
$?
R le
Compilateur du langage C (cc ou gcc)
Compilateur du langage C++ (c++ ou g++)
Param tres (ou options) passer au compilateur du langage C
Param tres (ou options) passer au compilateur du langage C++
Param tres (ou options) de l dition des liens
Nom de lex cutable g n rer
Commande utilis e pour effacer un fichier
Nom de la cible
Nom de la premi re d pendance
Liste des d pendances
Liste des d pendances plus r centes que la cible
Table 4.1 Principales conventions du nommage.
Notons enfin quil est aussi possible dutiliser les caract res jokers (comme en Shell). Par
exemple, lexpression prog?.c repr sente tous les fichiers commen ant par prog et
finissant par lextension .c avec une lettre entre ces deux cha nes. De m me, le caract re
antislash \ permet dinhiber laction des caract res jokers.
67