Gestion du build

Makefile simple

La video précédente nous a permis d'écrire le fichier Makefile suivant dans le dossier de notre projet :

CC=clang
CFLAGS=-Wall -Wextra -pedantic -std=c2x

TARGET = celcius

all: main

main: main.o celcius.o
	$(CC) $(CFLAGS) main.o celcius.o -o $(TARGET)

main.o: main.c
	$(CC) $(CFLAGS) -c main.c

celcius.o: celcius.c
	$(CC) $(CFLAGS) -c celcius.c

clean:
	rm *.o $(TARGET)

danger !

L'indentation des makefile est la tabulation.

  • Oui c'est complètement idiot
  • Non on ne peut pas faire autrement

Heureusement, si vous utilisez un IDE, il reconnaîtra que vous faire un Makefile et utilisera bien les tabulations.

On utilise un makefile de façon simple. Dans un terminal, tapez make (qui est équivalent à make all, car c'est la première règle du fichier Makefile):

$ make      
clang -Wall -Wextra -pedantic -std=c2x -c main.c
clang -Wall -Wextra -pedantic -std=c2x -c celcius.c
clang -Wall -Wextra -pedantic -std=c2x main.o celcius.o

La règle all dépend des règles main.o et celcius.o qu'il faut donc faire avant :

Si on retape la commande make, on remarque un changement :

$ make      
clang -Wall -Wextra -pedantic -std=c2x main.o celcius.o

Seule la règle main a été exécutée. Ceci est normal car une règle est définie :

noms : prérequis
	commande

Si noms et prérequis sont des noms de fichiers : on exécute la règle noms que si un des fichiers de prérequis est plus récent (ou a été modifié plus récemment que) un des fichiers de noms.

Dans notre cas :

Vérifions ceci en changeant la date de modification du fichier celcius.c puis en re-exécutant make :

$ touch main.c
$ make        
clang -Wall -Wextra -pedantic -std=c2x -c main.c
clang -Wall -Wextra -pedantic -std=c2x main.o celcius.o

La règle celcius.o a bien été exécutée en plus de la règle main.

Pour faire une compilation fraîche, on commence par effacer tout résidu de la compilation précédente avant de refaire un make :

$ make clean
rm *.o a.out
$ make      
clang -Wall -Wextra -pedantic -std=c2x -c main.c
clang -Wall -Wextra -pedantic -std=c2x -c celcius.c
clang -Wall -Wextra -pedantic -std=c2x main.o celcius.o
$ ./a.out
98.60 
310 

Variables Makefile

Grace aux variables, il n'est pas nécessaire d'expliciter toutes les règles :

On obtient le fichier Makefile suivant, bien plus simple et portable :

CC=clang
CFLAGS=-Wall -Wextra -pedantic -std=c2x

OBJECTS=main.o celcius.o 
NAME=celcius

all: $(NAME)

$(NAME): $(OBJECTS)
	$(CC) $(CFLAGS) -o $@ $^

%.o: %.c %.h
	$(CC) $(CFLAGS) -c $^

clean:
	rm *.o $(NAME)

Il suffit de renseigner :

Documentation

Ce qu'on a appris devrait suffire pour 99.9% de vos besoins, mais au cas ou :