Faire un Makefile Générique

Portrait de furet

Note, il est conseillé de savoir faire un Makefile « standard » pour profiter pleinement de la lecture de cet article.

On peut bien sûr utiliser un truc complément inutile :

CFLAGS = -W -Wall -g

Ceci aura pour effet de configurer les CFLAGS, et de compiler tous les fichiers sources du répertoire courant.

En gros ça revient a faire ça :
gcc $CFLAGS *.c
Ce qui ne sert à rien, quand on sait qu'un Makefile sert, entre autres, à compiler séparément ses sources pour ne pas compiler tout à chaque fois.
Je tairai le nom de la personne qui a cru que ça allait me servir…

Sinon, on peut faire des Makefile très simples, avec le nom de chaque règle « en dur ». Ces Makefiles sont en général ceux utilisés pour des petits programmes, dès que le nombre de fichiers sources augmente, il devient très difficile d'écrire toutes les règles à la main.

Pour résoudre ce problème, on peut utiliser des règles génériques qui vont permettre de s'affranchir du nom de chaque règle et de ses dépendances.

CC = gcc
CFLAGS = -W -Wall -g
LDFLAGS = 
 
SRC = $(wildcard *.c)
OBJS = $(SRC:.c=.o)
AOUT = prog
 
all : $(AOUT) 
 
prog : $(OBJS)
	$(CC) $(LDFLAGS) -o $@ $^
%.o : %.c
	$(CC) $(CFLAGS) -o $@ -c $<
clean :
	@rm *.o
cleaner : clean
	@rm $(AOUT)

Quelques explications :
SRC = $(wildcard *.c) : comme son nom l'indique, wildcard agit comme une wildcard, c'est à dire un caractère « joker ». Ici on s'en sert pour récupérer tous les fichiers finissant par .c du répétoire dans lequel est le Makefile.

OBJS = $(SRC:.c=.o) : permet de préciser les nom de chaque fichier .o à partir du fichier .c.

$@ : le nom de la cible

$^ : le nom de chaque dépendance

$developpez.com