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.

Synopsis
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

OptionEffet
-naffiche les commandes qui seraient lancées, sans les exécuter
-sn'affiche pas les commandes avant de les lancer
-Brefait toutes les cibles demandées, même à jour
-j 4lance jusqu'à quatre commandes en parallèle
-C dossierse place dans dossier avant de lire le Makefile
-f fichierlit fichier au lieu de Makefile
-kcontinue 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 Makefile montre 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é clean dans le dossier la rend « à jour » pour toujours.

  • make ne voit que les dépendances écrites dans le Makefile. Un .h absent des règles ne déclenche aucune recompilation quand il change : gcc -MMD -MP génère ces dépendances pour toi.

  • Le terminal des exercices Grademe n'a pas make. Sur Debian, Ubuntu ou WSL, il s'installe avec sudo apt install make.

Exemple

Makefile
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
Terminal
$ 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.o

make -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.

À toi d'écrire le code.