Leçon 4 : L’outil makefile

Page 1 sur 9Lecteur de document UniversityLib

Leçon 4 : L’outil makefile

Computer Science - Software Compilation · notes

Voir tous les documents en programmation

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

Publicité

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

Publicité

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

Publicité

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-

Publicité

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