Vous êtes sur la page 1sur 22

LOG1000

Génie logiciel

C02C
LOG1000
Makefiles
Ingénierie logicielle
1. Outils
d’intégration

2. Syntaxe des
Makefiles

Makefiles

Département de génie informatique et de


génie logiciel 1

Avec du matériel produit par Bram Adams, Michel Gagnon et Nikolay Radoev 1
LOG1000
Génie logiciel Outils d’intégration (« build systems »)
C02B
Makefiles

1. Outils
d’intégration

2. Syntaxe des
Makefiles

2
LOG1000
Génie logiciel Outils d’intégration (« build systems »)
C02B
Makefiles ●
Première étape : Configuration :

Sélection des outils (compilateurs) à utiliser,
1. Outils
d’intégration ●
Sélection des fonctionnalités à compiler.
2. Syntaxe des
Makefiles

Deuxième étape : Construction :

Exécution de la recette de construction.

Liaison des morceaux construits selon les
dépendances définies.

3
LOG1000
Génie logiciel Outils d’intégration (« build systems »)
C02B
Makefiles

1. Outils
d’intégration

2. Syntaxe des
Makefiles

Structure relativement bonne : on peut intégrer chaque module 4


indépendamment avant d’intégrer l’exécutable.
LOG1000
Génie logiciel Outils d’intégration (« build systems »)
C02B
Makefiles

1. Outils
d’intégration

2. Syntaxe des
Makefiles

Compiler tout ça à partir de zéro, c’est long ... un bon outil ne va re- 5
compiler que le code qui a été changé.
LOG1000
Génie logiciel Outils d’intégration (« build systems »)
C02B
Makefiles ●
La configuration et les recettes du « build
system » doivent donc évoluer en même temps
1. Outils
que le code.
d’intégration

2. Syntaxe des

La taille de la configuration représente ≈9% de la
Makefiles taille de l'ensemble du code source (médiane).

6
LOG1000
Génie logiciel Comment fonctionne GNU Make ?
C02B
Makefiles ●
Il faut qu'il y ait un fichier appelé « Makefile » qui
décrit la configuration de l'outil d'intégration.
1. Outils
d’intégration

Make exécute la construction avec la
2. Syntaxe des
commande suivante, qui exécute la règle par
Makefiles défaut :
make

Ou bien avec la commande suivante, qui exécute
la règle associée avec la cible :
make CIBLE_DE_LA_RÈGLE


Mais voyons un exemple avec des commandes
de base de Linux.
7
Exemple simple de Makefile

all: data.txt règle (« rule »)


cat data.txt

data.txt: commande à exécuter


cible echo “bonjour” > data.txt caractère de tabulation (« tab »)

dépendances
(il y en a juste une ici) contenu du fichier « Makefile »


Un dépendance est un fichier : si le fichier n'existe pas,
alors Make va chercher la règle qui contient ce fichier
comme cible.

S'il n'y a pas de règle pour produire ce fichier, Make va
produire une erreur.

Lancer « make » exécute la première règle du Makefile, 8
c'est la règle par défaut.
LOG1000
Génie logiciel Exemple simple de Makefile
C02B
Makefiles
Contenu du fichier Makefile → lancé en faisant
« make » ou « make hello » sur la ligne de commande

hello: hello.o util.o main.o règle (« rule »)


1. Outils
d’intégration gcc -o hello hello.o util.o main.o
Si une dépendance est une
2. Syntaxe des cible plus loin dans le
Makefiles hello.o: hello.c hello.h Makefile, alors la règle
gcc -o hello.o -c hello.c associée à la cible est
exécutée en premier.
util.o: util.c util.h
gcc -o util.o -c util.c cible
dépendances
main.o: main.c hello.h util.h
gcc -o main.o -c main.c commande à exécuter

caractère de tabulation (« tab ») : Make est sensible aux caractères


Ce Makefile produit un exécutable appelé "hello".
9
LOG1000
Génie logiciel Arbre des dépendances de l’exemple simple
C02B
Makefiles
hello: hello.o util.o main.o
gcc -o hello hello.o util.o main.o Ce Makefile correspond à
cet arbre de dépendances.
1. Outils hello.o: hello.c hello.h
d’intégration
gcc -o hello.o -c hello.c
2. Syntaxe des
Makefiles
util.o: util.c util.h
gcc -o util.o -c util.c
Code binaire
hello fonctionnel
main.o: main.c hello.h util.h (exécutable)
gcc -o main.o -c main.c

Code objet hello.o main.o util.o

Code source hello.c hello.h main.c util.h util.c

10
LOG1000
Génie logiciel Syntaxe des Makefiles
C02B
Makefiles ●
En exécutant simplement "make", la première
règle rencontrée est exécutée.
1. Outils
d’intégration

Il est possible d'exécuter une règle particulière
2. Syntaxe des
en spécifiant le nom de sa cible.
Makefiles ●
Ex.: « make util.o » ne produira pas
l'exécutable mais permettra de vérifier qu'il est
possible de compiler « util.c » et « util.h ».

11
Source : Spongebob Squarepants
LOG1000
Génie logiciel Analyse des dépendances
C02B
Makefiles ●
Si une dépendance d'une règle est la cible d'une
autre règle, alors cette autre règle peut être
1. Outils
exécutée.
d’intégration

2. Syntaxe des

La règle est exécutée :
Makefiles

Ssi toute les dépendances d'une règle ont été
exécutées et que la cible n'existe pas encore
dans l'espace de travail,
OU

Ssi une des dépendances est plus récente que
la cible.
Make est donc « intelligent » : il ne
recompilera pas un fichier si ce n’est
pas nécessaire. C’est ce qu’on appelle
12
un « build incrémental ».
LOG1000
Génie logiciel Exécution du Makefile
C02B
Makefiles
1 hello: hello.o util.o main.o hello.c hello.h
2 gcc -o hello hello.o util.o main.o
3 main.c
1. Outils 4 hello.o: hello.c hello.h
d’intégration 5 gcc -o hello.o -c hello.c util.h util.c
2. Syntaxe des 6
Fichiers disponibles au début
Makefiles 7 util.o: util.c util.h
8 gcc -o util.o -c util.c
9 Fil d’exécution de la
commande « make »
10 main.o: main.c hello.h util.h
11 gcc -o main.o -c main.c
1 → hello.o n’existe pas. Make passe à la ligne 4 pour le créer.
4 → les fichiers hello.c et hello.h sont présents.
5 → GCC crée le fichier hello.o et Make retourne à la ligne 1.
1 → util.o n’existe pas. Make passe à la ligne 7 pour le créer.
7 → les fichiers util.c et util.h sont présents.
8 → GCC crée le fichier util.o et Make retourne à la ligne 1.
1 → main.o n’existe pas. Make passe à la ligne 10 pour le créer.
10 → les fichiers main.c, hello.h et util.h sont présents.
11 → GCC crée le fichier main.o et Make retourne à la ligne 1.
1 → les fichiers hello.o, util.o et main.o sont présents. 13
2 → GCC crée l’exécutable hello et Make termine.
LOG1000
Génie logiciel Remarque
C02B
Makefiles ●
On pourrait tout faire ça avec une suite de
commandes faites à la main, ou un script « bash ».
1. Outils ●
Sauf que ce script ne serait pas « intelligent » et
d’intégration
recompilerait tous les fichiers à chaque fois.
2. Syntaxe des
Makefiles ●
Impossible dans les gros projets, ou une
compilation complète peut prendre des heures ...

Make permet donc de faire un « build
incrémental ».

Source : XKCD.
Un « build system »
bien configuré
permet de minimiser
ce temps perdu ... 14
LOG1000
Génie logiciel Exemple où on vient de modifier « hello.h »
C02B
Makefiles
1 hello: hello.o util.o main.o hello
2 gcc -o hello hello.o util.o main.o
3 hello.o main.o util.o
1. Outils 4 hello.o: hello.c hello.h
hello.c util.c
d’intégration 5 gcc -o hello.o -c hello.c main.c
2. Syntaxe des 6 hello.h util.h
Makefiles 7 util.o: util.c util.h Fichiers disponibles au début
8 gcc -o util.o -c util.c
9
10 main.o: main.c hello.h util.h Fil d’exécution de la
11 gcc -o main.o -c main.c commande « make »

1 → hello.o existe, mais est-il plus récent que ses dépendances ? Allons voir.
4 → hello.o est plus récent que hello.c, mais plus vieux que hello.h
5 → GCC recompile hello.o
1 → util.o existe, mais est-il plus récent que ses dépendances ? Allons voir.
7 → util.o est plus récent que util.c et util.h. Pas besoin de recompiler.
1 → main.o existe, mais est-il plus récent que ses dépendances ? Allons voir.
10 → main.o est plus récent que main.c et util.h, mais plus vieux que hello.h
11 → GCC recompile main.o
1 → tous nos fichiers sont présents et plus récents que leurs dépendances.
2 → GCC recompile l’exécutable hello 15
LOG1000
Génie logiciel Autres règles de Makefile utiles
C02B
Makefiles ●
Traditionnellement, la première cible du Makefile s'appelle
« all » et permet de compiler l'exécutable final du logiciel.

Ainsi, faire un « make » ou un « make all » compile tout le
1. Outils
d’intégration logiciel.
2. Syntaxe des

Une autre règle utile est « clean », fait de la manière suivante :
Makefiles
clean:
rm -rf *.o

La commande « rm -rf *.o » élimine tous les fichiers objets
(.o) de manière récursive sans confirmation de
l'utilisateur/utilisatrice.
– DANGER ! Attention de ne pas enlever de bons
fichiers ...

GCC peut avoir des problèmes parfois avec le « linking».
Éliminer les fichiers objets intermédiaires peut résoudre ce
problème.

On peut aussi éliminer l'exécutable afin de forcer une
recompilation de celui-ci. 16
LOG1000
Génie logiciel Variables personnalisées
C02B
Makefiles ●
Il est possible de se définir des variables pour
des éléments dans le Makefile susceptibles de
1. Outils
changer. Initialisation de la variable EXEC
d’intégration avec la chaîne de caractères “hello”

2. Syntaxe des EXEC=hello


Makefiles Utilisations de la variable EXEC
all: $(EXEC)

$(EXEC): hello.o util.o main.o


gcc -o hello hello.o util.o main.o

hello.o: hello.c hello.h


gcc -o hello.o -c hello.c

util.o: util.c util.h


gcc -o util.o -c util.c

main.o: main.c hello.h util.h


gcc -o main.o -c main.c 17
LOG1000
Génie logiciel Variables personnalisées
C02B
Makefiles ●
Standard informel pour les noms de variables :

Pour l'exécutable à produire : EXEC
1. Outils
d’intégration – Ex.: EXEC=hello
2. Syntaxe des
Makefiles

Pour le compilateur : CC (compilateur C) ou
CXX (compilateur C++)
– Ex.: CC=gcc

Pour les options de compilations : CFLAGS
(options C) ou CXXFLAGS (options C++)
– Ex.: CFLAGS=-W -Wall -ansi -pedantic

Pour les options de « linking » : LDFLAGS
– Ex.: LDFLAGS=
– Dans le cas où il n'y en a pas mais qu'on
pourrait en ajouter plus tard. 18
LOG1000
Génie logiciel Variables internes à Make
C02B
Makefiles ●
Make définit un certain nombre de variables
internes qu'on peut utiliser dans nos Makefiles.
1. Outils
d’intégration

$@ Le nom de la cible
2. Syntaxe des

$< Le nom de la première dépendance
Makefiles

$^ La liste des dépendances

$? La liste des dépendances plus récentes
que la cible

$* Le nom du fichier sans suffixe


Il est possible de monter des Makefile très
complexes qui envoient et reçoivent des données
d'autres logiciels.

Ex.: tests automatisés, évaluation du taux de19
commentaires, etc.
LOG1000
Génie logiciel Exemple complet avec toutes les variables
C02B
Makefiles

CC=gcc
CFLAGS=-W -Wall -ansi -pedantic
1. Outils LDFLAGS=-lm
d’intégration
EXEC=hello
2. Syntaxe des
Makefiles all: $(EXEC)

$(EXEC): hello.o main.o


$(CC) -o $@ $^ $(LDFLAGS)

hello.o: hello.c
$(CC) -o $@ -c $< $(CFLAGS)

main.o: main.c hello.h


$(CC) -o $@ -c $< $(CFLAGS)

clean:
rm -rf *.o
20
LOG1000
Génie logiciel Utilisation de notations avancés
C02B
Makefiles ●
Make permet d'utiliser des expressions régulières
dans certaines de ces règles
1. Outils ●
SOURCES=$(wildcard *.cpp)
d’intégration
– Avec le mot clé "wildcard", on peut aller chercher tous les
2. Syntaxe des fichiers qui terminent par .cpp et les mettre dans une liste
Makefiles
appelée SOURCES

OBJECTS=$(SOURCES:.cpp=.o)
– La notation ".cpp=.o" permet de transformer tous les fichiers
dans la liste SOURCES qui terminent par ".cpp" en une liste
de fichiers avec le même nom et l'extension ".o". Cette liste
est mise dans la variable OBJECTS

21
LOG1000
Génie logiciel Exemple complet avec toutes les variables
C02B
Makefiles

CC=gcc
CFLAGS=-W -Wall -ansi -pedantic
LDFLAGS=-lm
1. Outils
d’intégration EXEC=hello
SOURCES=$(wildcard *.cpp)
2. Syntaxe des OBJECTS=$(SOURCES:.cpp=.o)
Makefiles

all: $(EXEC) $(SOURCES)

$(EXEC): $(OBJECTS)
$(CC) -o $@ $^ $(LDFLAGS)

hello.o: hello.c
$(CC) -o $@ -c $< $(CFLAGS)

main.o: main.c hello.h


$(CC) -o $@ -c $< $(CFLAGS)

clean:
rm -rf $(OBJECTS)
22

Vous aimerez peut-être aussi