make(1)
Outil de développement
Lit un Makefile et ne relance que les commandes dont la cible est plus ancienne que ses dépendances. Les options utiles : -n, -j, -B, -C, -f.
make [options] [cible ...]Description
make lit un fichier de règles, le Makefile, qui dit comment fabriquer chaque fichier à partir d'autres : une cible, ses dépendances, puis les commandes, chacune précédée d'une tabulation. Il cherche ce fichier dans le dossier courant sous les noms GNUmakefile, makefile puis Makefile.
Sans argument, il construit la première cible du fichier. Avant de lancer une commande, il compare les dates de modification : une cible plus récente que toutes ses dépendances est à jour, et sa commande est sautée. C'est ce qui permet de ne recompiler que les fichiers modifiés depuis la dernière fois. Une cible passée en argument (make clean) est construite à la place de la première.
Options utiles
| Option | Effet |
|---|---|
-n | affiche les commandes qui seraient lancées, sans les exécuter |
-s | n'affiche pas les commandes avant de les lancer |
-B | refait toutes les cibles demandées, même à jour |
-j 4 | lance jusqu'à quatre commandes en parallèle |
-C dossier | se place dans dossier avant de lire le Makefile |
-f fichier | lit fichier au lieu de Makefile |
-k | continue avec les autres cibles après une erreur |
Valeur de retour
0 quand tout a été construit sans erreur, 2 quand une erreur s'est produite (une commande qui échoue, un Makefile mal écrit). 1 n'apparaît qu'avec l'option -q, qui demande seulement si une cible est à refaire.
Pièges
Une ligne de commande qui commence par des espaces au lieu d'une tabulation donne
missing separator.cat -A Makefilemontre les tabulations sous la forme^I.Une cible comme
clean, qui ne produit pas de fichier à son nom, doit être déclarée.PHONY; sinon un fichier nommécleandans le dossier la rend « à jour » pour toujours.makene voit que les dépendances écrites dans le Makefile. Un.habsent des règles ne déclenche aucune recompilation quand il change :gcc -MMD -MPgénère ces dépendances pour toi.Le terminal des exercices Grademe n'a pas
make. Sur Debian, Ubuntu ou WSL, il s'installe avecsudo apt install make.
Exemple
CC = gccCFLAGS = -Wall -Wextra -gOBJ = main.o stats.o affichage.o
notes: $(OBJ) $(CC) $^ -o $@
%.o: %.c notes.h $(CC) $(CFLAGS) -c $< -o $@
clean: rm -f notes $(OBJ)
.PHONY: clean$ make -ngcc -Wall -Wextra -g -c main.c -o main.ogcc -Wall -Wextra -g -c stats.c -o stats.ogcc -Wall -Wextra -g -c affichage.c -o affichage.ogcc main.o stats.o affichage.o -o notes$ make -s$ ./notesmoyenne : 13, meilleure : 18$ makemake: 'notes' is up to date.$ make -B stats.ogcc -Wall -Wextra -g -c stats.c -o stats.omake -n montre le plan sans rien compiler, make -s compile en silence, et le make suivant n'a plus rien à faire. make -B stats.o force la recompilation d'une seule cible.