Vous êtes sur la page 1sur 13

Concevoir un Makele

Vincent Loechner (original : Nicolas Zin, http://www.linux.efrei.fr/) 17 novembre 2003

Table des mati` eres


1 Introduction 2 Cr eation dun makele 2.1 Simple Makele . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 R` egles d ecritures . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Automatisation de t aches 3.1 Utilisation de variables . 3.2 Variables g en eriques . . 3.3 R` egles g en eriques . . . . 3.4 Fonctions . . . . . . . . 2 3 3 4 4 5 5 6 6 7 8 8 8 9 10 11

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

4 Gestion des makeles 4.1 Lancer make ` a partir dun 4.2 Inclure un chier . . . . . 4.3 Cr eer des d ependances . . 4.4 Squelette dun makele . . 5 Conclusion

make . . . . . . . . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

Chapitre 1

Introduction
Un makele est un chier utilis e par le programme make pour arriver ` a un but, ce but etant lui-m eme d ependant dautres buts, et ce de mani` ere r ecursive. On parle alors plut ot de cibles plus que de but. Make est principalement utilis e pour cr eer de gros programmes, o` u la cible principale est un ex ecutable. Pour que cet ex ecutable puisse etre compil e, il faut pouvoir rassembler les di erents objets (.o) qui le composent. Ces objets d ependent ` a leur tour de chiers sources ou dautres objets. La di erence entre make et un script classique est que make sait si une cible donn ee est ` a jour ou non ; donc il sait si cette cible doit etre reconstruite, ou peut etre conserv ee. Lorsquon demandera ` a make de refaire une cible, il regardera quelles sont les sous-cibles qui ne se sont pas ` a jour, les refera et refera ensuite la cible principale. Make peut egalement etre utilis e pour dautres choses que pour la g en eration dex ecutables, comme pour ladministration syst` eme, la g en eration de documents latex, ...

Chapitre 2

Cr eation dun makele


Lorsquon appelle la commande make, le programme va essayer de trouver un chier makele ou Makele. Si aucun argument nest donn e` a make, la premi` ere cible trouv ee dans le chier makele est consid er e comme cible principale ; sinon il consid` ere largument pass e en param` etre comme cible principale.

2.1

Simple Makele
CIBLE: <TAB> <TAB> <TAB> DEPENDANCES COMMANDE COMMANDE COMMANDE

Un simple makele est compos e de r` egles ayant lapect suivant :

La cible est g en eralement le nom du chier que lon veut g en erer. Les d ependances sont les chiers utilis es pour g en erer cette cible. Les commandes sont les actions a mener pour g ` en erer la cible ` a partir des d ependances. Quand make va essayer de cr eer la cible, il va regarder la (les) d ependance(s). En fait make consid` ere quon travaille avec des chiers et que la cible et les d ependances sont des noms de chers. Pour d eterminer si une cible ou une d ependance est ` a jour, il va regarder la date de modication du chier portant le nom de la d ependance ou de la cible. Il va regarder si les d ependances sont ` a jour, cest ` a dire si elles ne d ependent pas elle non plus dautres r` egles. Si cest le cas, il va ex ecuter ces r` egles. Ensuite on va voir si la cible a besoin d etre refaite. Si la date de modication dune d ependance est plus jeune que la date de modication de la cible, il consid` ere la cible comme n etant pas ` a jour, et il va alors ex ecuter les commandes. Si make ne trouve pas le chier corespondant ` a une d ependance et quil narrive pas ` a cr eer ce chier, il g en` ere une erreur. Si le chier cible nexiste pas, il consid` ere la cible comme non ` a jour.

CHAPITRE 2. CREATION DUN MAKEFILE

2.2

R` egles d ecritures

Dans un makele, il faut faire attention ` a commencer une ligne de commande par une tabulation. Cela permet ` a make de savoir quest ce quil doit consid erer comme commande. Si on veut mettre des expressions (d ependance ou quoique ce soit) sur plusieurs lignes, on peut le faire en terminant la ligne par un \. Quand make voit \ il sait que lexpression continue sur la ligne suivante. On peut formuler des r` egles qui nont pas de commandes. En particulier il est utile de placer une r` egle au d ebut du makele, souvent nomm ee all, qui va d ependre de la cible principale. Ainsi, si make est appel e sans argument, il va consid erer la premi` ere cible quil voit comme la cible principale. Par ce stratag` eme, il va consid erer comme r` egle principale, la bonne r` egle. On peut aussi ecrire des r` egles qui nont pas de d ependances. Par exemple, on fournit souvent une r` egle nomm ee clean qui eace tout les chers g en er es par le make. Cette r` egle permet de faire le m enage.

2.3

Exemple

all: edit edit : main.o command.o display.o insert.o search.o files.o utils.o cc -o edit main.o command.o display.o \ insert.o search.o files.o utils.o main.o : main.c defs.h cc -c main.c command.o : command.c defs.h command.h cc -c command.c display.o : display.c defs.h buffer.h cc -c display.c insert.o : insert.c defs.h buffer.h cc -c insert.c search.o : search.c defs.h buffer.h cc -c search.c files.o : files.c defs.h buffer.h command.h cc -c files.c utils.o : utils.c defs.h cc -c utils.c clean : rm edit main.o command.o display.o \ insert.o search.o files.o utils.o Note : lorsque make ex ecute une commande il ache les commandes ex ecut ees. Si vous ne voulez pas que la ligne de commande soit ach ee placez un @ devant la commande.

Chapitre 3

Automatisation de t aches
Make facilite l ecriture de r` egles gr ace ` a lutilisation de variables, de caract` eres g en eriques et de r` egles g en eriques.

3.1

Utilisation de variables

Il est possible de d enir des variables dans un makele. Le but est de simplier la modication du makele. Si on d enit une variable recevant des options de compilation, si on a ` a changer ces options, il est plus facile de changer une d enition que tout le makele. Pour d enir une variable il faut mettre sur une nouvelle ligne le nom de la variable suivi dun = suivi de la valeur de la variable. En r` egle g en erale, on met le nom de la variable en majuscule, ca permet de la di erentier des commandes ou des noms de chiers qui sont souvent en minuscules. Pour faire r ef erence ` a une variable dans un makele, il faut utiliser le caract` ere $ suivi dune parenth` ese ouvrante, suivi du nom de la variable, suivi dune parenth` ese fermante. Exemple : CC=gcc CFLAGS=-O2 -pipe -Wall LDFLAGS=-O2 -L/usr/local/include -lqt prog: a.o b.o $(CC) -o prog $(LDLAGS) a.o b.o a.o: a.c $(CC) $(CFLAGS) -c a.c b.o: b.c $(CC) $(CFLAGS) -c a.c Une variable sp eciale VPATH permet de dire ` a make dans quels r epertoires il doit chercher les d ependances. Exemple : VPATH = src :../headers

CHAPITRE 3. AUTOMATISATION DE TACHES

3.2

Variables g en eriques
Signication repr esente les d ependances qui ont et e modi ees (les d ependances qui n etaient pas ` a jour) repr esente toutes les d ependances. Ici, on tient compte du chemin vers le chier. Ceci permet de r ef erencer des chiers qui ne sont pas dans le r epertoire courant (cf. variable VPATH) m eme chose que $ mais les doublons sont supprim es. repr esente la cible courante. repr esente la premi` ere d ependance. Est utile quand la premi` ere d ependance a une fonction pr ecise.

Ces variables sont utilis es dans la partie commande. Symbole $? $

$+ $@ $<

Il est possible de d enir une r` egle pour un ensemble de chier, par exemple pour tous les chiers se terminant par un .c. Pour cela on peut utiliser le caract` ere %. Quand make voit ce caract` ere dans un champ cible, il essaye dy attribuer des noms de chiers. %.c correspond ` a tous les chiers se terminant par .c. Dans le champ des d ependances % est remplac e par la valeur trouv ee dans la cible. Exemple : %.o: %.c gcc -c $^ On peut utiliser une variable g en erique pour r ecup erer la valeur de % dans les commandes gr ace ` a $*. $* donne la valeur de %. Exemple : %.o: %.c gcc -c $*.c

3.3

R` egles g en eriques

On peut aussi etablir des r` egles g en eriques avec make. Ces r` egles vont etre attach ees ` a un suxe, et seront appel ees quand make tombera sur un chier se terminant par cette extension. Il faut dabord donner les suxes qui sont trait es par des r` egles, gr ace au mot cl e .SUFFIXES suivi de : puis des extensions (par exemple .c .cpp). Plus loin dans le makele on doit trouver les r` egles pour ces suxes : CC=g++ CFLAGS= -pipe -Wall # # Implicit rules # .SUFFIXES: .cpp .cpp.o:

CHAPITRE 3. AUTOMATISATION DE TACHES

$(CC) -c $(CFLAGS) $< Comme on peut le voir, on d enit une r` egle ayant une d enition sp eciale : la cible est compos ee de lextension source et de lextension destination de la cible a traiter. On trouve en dessous les commandes ` ` a ex ecuter pour transformer le chier dextension dorigine en chier dextension cible.

3.4

Fonctions

Il est parfois tentant de vouloir utiliser * comme on pourrait le faire sous un shell pour d esigner tous les chiers se terminant par .o par exemple. On peut en eet mettre une r` egle nomm ee clean qui eace tous les chiers objets. Pour ca il faut taper : clean: rm *.o Mais on ne peut pas toujours utiliser *. En eet dans ce cas ca marche car toute commande est en fait lanc ee par un script. Donc *.o est interpr et e par un script. Mais il nest pas possible de mettre *.o dans une variable, make mettrait la chaine *.o et non pas le nom de tous les chiers se terminant par .o. Pour mettre le nom des chers se terminant par .o il faut passer par une fonction : $(wildcard *.o). Les fonctions commencent par $( et se terminent par ) comme des r efr erence de variables. La fonction wildcard va faire ce que lon cherche : elle va regarder les chiers qui correspondent au motif (ici *.o) que lon passe en param` etre. Dautres fonctions existent, par exemple la fonction lter permet de ltrer une liste de nom via un ltre. $(lter %.o,$(noms)) correspond ` a tous les noms contenus dans $(noms) r epondant ` a %.o . La fonction $(subst FROM,TO,TEXT) permet de faire une substitution : comma:= , empty:= space:= $(empty) $(empty) foo:= a b c bar:= $(subst $(space),$(comma),$(foo)) # bar is now a,b,c. La fonction $(patsubst PATTERN,REPLACEMENT,TEXT) permet de faire une substitution dans une liste de mots (des chiers par exemple) : SRC:= $(wildcard *.c) OBJ:= $(patsubst %.c,%.o,$OBJ)

Chapitre 4

Gestion des makeles


4.1 Lancer make ` a partir dun make

Il est possible ` a partir dun makele dappeler dautres makeles. En particulier on peut etre amen e ` a compiler un programme r eparti dans plusieurs r epertoires. Pour c a deux possibilit es : make -C <sous-r epertoire> demande daller dans le sous- r epertoire et de relancer un make. (cd <sous-r epertoire> ; make) : faire attention ` a bien mettre des parenth` eses. En eet cette commande est transmise au shell, et si les parenth` eses ne sont pas mises, le shell va consid erer les deux instructions comme ind ependantes, et va eectuer le cd <sous-r epertoire>, il va rendre la main (donc ressortir du sous-r epertoire) et lancer la commande suivante qui est make (donc qui sera ex ecut e dans le r epertoire courant).

4.2

Inclure un chier

Il est possible ` a lint erieur dun makele dinclure un chier, gr ace ` a la commande include <nom chier> au d ebut dune nouvelle ligne. Ca peut etre int eressant, en particulier si on a un projet r eparti dans plusieurs r epertoires. Il faut alors un makele par r epertoire. Tous ces makeles peuvent inclure un makele global contenant le programme de compilation, les r` egles implicites de compilation, et di erentes variables. Ainsi sil faut changer un param etre il sut de changer le chier inclu par tous les makeles. Exemple : -----------Makefile.global---------CC=g++ CFLAGS= -pipe -Wall -O2 LDFLAGS=-g MAKE=/usr/bin/make

CHAPITRE 4. GESTION DES MAKEFILES

FIND=/usr/bin/find # # Implicit rules # .SUFFIXES: .cpp .cpp.o: $(CC) -c $(CFLAGS) $< ------------Makefile-----------include Makefile.global OBJ= main.o all: $(OBJ) for i in $(SUBDIRS); do (cd $$i; $(MAKE) all); done $(MAKE) ciblePrincipale clean: rm -f $(OBJ) core *~ ciblePrincipale: @echo Ce que lon veut

4.3

Cr eer des d ependances

Plus le projet est gros, plus on est tent e dutiliser des r` egles implicites. Mais le probl` eme des r` egles implicites est quelles consid` erent que la cible doit etre reconstruite que si la d ependance principale a et e chang ee. Or un chier C doit etre recompil e si eectivement le chier C a et e modi e, mais aussi si un des chiers que le chier C inclut a et e modi e. La commande makedepend permet de d eterminer les d ependances dun chier C ou C++. Sa syntaxe est makedepend <chier.c>. Ce programme va lire les d ependances et va les ajouter au makele. On peut aussi passer des arguments ` a makedepend, comme les r epertoires utilis es par le compilateur C pour chercher les headers standards. En fait il sut de passer a ` makedepend les arguments de compilation, comme on les passerait au compilateur. Il se charge de trouver ce qui lint eresse pour etablir les d ependances. La syntaxe ` a utiliser est : makedepend <options de compilation> <chiers.c>. Par exemple : makedepend -- $(CFLAGS) -- $(SRC) G en eralement on cr ee une r` egle dans le makele qui va c reer les d ependances, avant de compiler. Exemple : SUBDIR= core ihm annexes CC=gcc

CHAPITRE 4. GESTION DES MAKEFILES

10

CFLAGS=-I/usr/local/include -Wall -pipe LDFLAGS=-lMesaGL -L/usr/local/lib SRC=main.c install.c lancement.c OBJ=$(subst .c,.o,$(SRC)) depend: makedepend -- $(CFLAGS) -- $(SRC)

4.4

Squelette dun makele

Si on devait faire un squelette dun makele dun programme C il devrait ressembler ` a quelque chose comme : CC=gcc CFLAGS=-I/usr/local/include -Wall -pipe LDFLAGS=-lMesaGL -L/usr/local/lib RM=/bin/rm MAKE=/usr/bin/make MAKEDEPEND=/usr/X11R6/bin/makedepend SRC= a.c \ b.c \ c.c OBJ=$(subst .c,.o,$(SRC)) SUBDIR= paf pof

.SUFFIXES: .c .c.o: $(CC) -c $(CFLAGS) $< all: for i in $(SUBDIRS); do (cd $$i; $(MAKE) all); done $(MAKE) monProgramme monProgramme: $(OBJ) $(CC) -o $@ $(LDFLAGS) $^ clean: $(RM) -f $(OBJ) core *~ for i in $(SUBDIRS); do (cd $$i; $(MAKE) clean); done depend: $(MAKEDEPEND) -- $(CFLAGS) -- $(SRC)

CHAPITRE 4. GESTION DES MAKEFILES

11

for i in $(SUBDIRS); do (cd $$i; $(MAKE) depend); done

Chapitre 5

Conclusion
Jai pr esent e les fonctionnalit es les plus couramment utilis ees de make. Beaucoup de subtilit es et de possibilit es existent encore, mais ne sont pas dusage courant. Dautre part, jai parl e du make GNU, car cest celui par d efaut sous Linux. Dautres make existent, ils sont un peu di erent de celui de chez GNU, en particulier, le make GNU a plus de possibilit es que les autres, donc il se peut que certains fonctionnalit es ne fonctionnent pas avec dautres make, m eme si les principales fonctionnalit es sont les m emes.

12