2.5. Gérer plus de code avec Make
L'utilitaire GNU Make, communément abrégé make, est un outil permettant de contrôler la génération d'exécutables à partir de fichiers sources. make détermine automatiquement quelles parties d'un programme complexe ont été modifiées et doivent être recompilées. make utilise des fichiers de configuration appelés Makefiles pour contrôler la manière dont les programmes sont construits.
2.5.1. Aperçu de GNU make
et Makefile
Pour créer une forme utilisable (généralement des fichiers exécutables) à partir des fichiers sources d'un projet particulier, il convient d'effectuer plusieurs étapes nécessaires. Enregistrez les actions et leur séquence afin de pouvoir les répéter ultérieurement.
Red Hat Enterprise Linux contient GNU make
, un système de construction conçu à cet effet.
Conditions préalables
- Comprendre les concepts de compilation et de liaison
GNU make
GNU make
lit les Makefiles qui contiennent les instructions décrivant le processus de construction. Un Makefile contient plusieurs rules qui décrivent une manière de satisfaire une certaine condition (target) avec une action spécifique (recipe). Les règles peuvent dépendre hiérarchiquement d'une autre règle.
En lançant make
sans aucune option, il recherche un Makefile dans le répertoire courant et tente d'atteindre la cible par défaut. Le nom du fichier Makefile peut être l'un des noms suivants : Makefile
, makefile
, et GNUmakefile
. La cible par défaut est déterminée à partir du contenu du Makefile.
Détails du Makefile
Les Makefiles utilisent une syntaxe relativement simple pour définir variables et rules, qui consiste en une target et une recipe. La cible spécifie ce qui est produit si une règle est exécutée. Les lignes contenant des recettes doivent commencer par le caractère TAB.
Typiquement, un Makefile contient des règles pour la compilation des fichiers sources, une règle pour lier les fichiers objets résultants, et une cible qui sert de point d'entrée au sommet de la hiérarchie.
Considérons l'exemple suivant Makefile
pour la construction d'un programme C qui consiste en un seul fichier, hello.c
.
all: hello hello: hello.o gcc hello.o -o hello hello.o: hello.c gcc -c hello.c -o hello.o
Cet exemple montre que pour atteindre la cible all
, le fichier hello
est nécessaire. Pour obtenir hello
, il faut hello.o
(lié à gcc
), qui est à son tour créé à partir de hello.c
(compilé par gcc
).
La cible all
est la cible par défaut car c'est la première cible qui ne commence pas par un point (.). L'exécution de make
sans argument est donc identique à l'exécution de make all
, lorsque le répertoire courant contient ce Makefile
.
Fichier makefile typique
Un Makefile plus typique utilise des variables pour la généralisation des étapes et ajoute une cible "clean" - supprimer tout sauf les fichiers sources.
CC=gcc CFLAGS=-c -Wall SOURCE=hello.c OBJ=$(SOURCE:.c=.o) EXE=hello all: $(SOURCE) $(EXE) $(EXE): $(OBJ) $(CC) $(OBJ) -o $@ %.o: %.c $(CC) $(CFLAGS) $< -o $@ clean: rm -rf $(OBJ) $(EXE)
L'ajout de fichiers sources supplémentaires à un tel Makefile ne nécessite que de les ajouter à la ligne où la variable SOURCE est définie.
Ressources supplémentaires
- GNU make : Introduction - 2 Introduction aux Makefiles
2.5.2. Exemple : Construction d'un programme C à l'aide d'un fichier Makefile
Créez un exemple de programme C à l'aide d'un fichier Makefile en suivant les étapes de cet exemple.
Conditions préalables
-
Vous devez comprendre les concepts de Makefiles et de
make
.
Procédure
Créez un répertoire
hellomake
et allez dans ce répertoire :$ mkdir hellomake $ cd hellomake
Créez un fichier
hello.c
avec le contenu suivant :#include <stdio.h> int main(int argc, char *argv[]) { printf("Hello, World!\n"); return 0; }
Créez un fichier
Makefile
avec le contenu suivant :CC=gcc CFLAGS=-c -Wall SOURCE=hello.c OBJ=$(SOURCE:.c=.o) EXE=hello all: $(SOURCE) $(EXE) $(EXE): $(OBJ) $(CC) $(OBJ) -o $@ %.o: %.c $(CC) $(CFLAGS) $< -o $@ clean: rm -rf $(OBJ) $(EXE)
ImportantLes lignes de la recette du Makefile doivent commencer par le caractère tabulation ! Lorsque vous copiez le texte ci-dessus à partir de la documentation, le processus de copier-coller peut coller des espaces à la place des tabulations. Si cela se produit, corrigez le problème manuellement.
Exécuter
make
:$ make gcc -c -Wall hello.c -o hello.o gcc hello.o -o hello
Cela crée un fichier exécutable
hello
.Exécutez le fichier exécutable
hello
:$ ./hello Hello, World!
Exécutez la cible Makefile
clean
pour supprimer les fichiers créés :$ make clean rm -rf hello.o hello
2.5.3. Ressources documentaires pour make
Pour plus d'informations sur make
, voir les ressources listées ci-dessous.
Documentation installée
Utilisez les outils
man
etinfo
pour consulter les pages de manuel et les pages d'information installées sur votre système :$ man make $ info make
Documentation en ligne
- Le manuel GNU Make hébergé par la Free Software Foundation
- Guide de l'utilisateur de Red Hat Developer Toolset - Chapitre 3. GNU make