Voici un makefile simple (c'est un fichier qui peut s'appeller makefile
ou Makefile
, auquel cas il apparaîtra en tête de l'arborescence) :
CC = gcc CFLAGS = -ansi LDFLAGS = -lm -lc # bibliotheque math suivie de bibliotheque C all : salou
Si on se contente de spécifier quel compilateur C il faut utiliser, et avec quelles options, la cible (le fichier salou
qu'on cherche à construire) sera faite en compilant le fichier salou.c
(évident puisqu'on compile avec le compilateur C, CC). Si le fichier salou
existe déjà et qu'aucune modification n'a été apportée au fichier source, la compilation n'aura pas lieu. On aurait aussi pu mettre :
salou : salou.c gcc -ansi -lm -lc -o salou salou.c
La ligne de dépendances salou : salou.c
indique clairement que le fichier salou
a besoin du fichier salou.c
pour être construit et que si celui-ci n'a pas été modifié, la compilation du fichier salou
n'aura pas lieu. Si le fichier salou.c
n'existe pas mais qu'il y a dans la suite du makefile une ligne indiquant comment le construire, le fichier salou.c
sera construit puis le fichier salou
sera à son tour construit. Noter qu'il faut une tabulation à la suite de la ligne de dépendances (la ligne gcc -ansi -lm -lc -o salou salou.c
dans l'exemple précédent).
Voici un exemple plus explicite :
# Exemple simple d'utilisation d'un Makefile # # Par defaut, le Makefile sait comment construire un fichier objet (*.o) # a partir d'un fichier source (*.c) : # # aire.o : Makefile aire.c # # suffit a lancer la compilation a partir du fichier source (ici aire.c) # # # La commande CC sera invoquee par defaut, c'est l'ancien compilateur C; # c'est sur la plupart des systemes un lien vers le nouveau compilateur # GNU gcc : # # aire : $(OBJS) # # suffit a lancer la compilation a partir des fichiers objets # # # ANSI_FLAG peut etre definit lorsque on lance la commande make : # # make ANSI_FLAG=Ok # # # ANSI_FLAG peut aussi etre definit dans le fichier .bashrc : # # export ANSI_FLAG = Ok # # # ATTENTION ! ANSI_FLAG = non est aussi une definition, si bien que le # programme sera egalement compile avec la norme ansi... # ANSI_FLAG = # aucune definition, accepte CFLAGS=-g -O # options de compilation OBJS = aire.o cercle.o # fichiers objets PROG = ../../ # chemin du repertoire prog BIN = $(PROG)bin/ # chemin du repertoire bin ifdef ANSI_FLAG CFLAGS := $(CFLAGS) -ansi # faut il compiler suivant la norme ansi ? endif install : all mv aire $(BIN) all : aire # Construire le fichier binaire (compile, donc executable) aire avec CC # a partir des fichiers objets definits dans la macro OBJS # (ici aire.o et cercle.o) # Dependances de aire : aire.o et cercle.o aire : $(OBJS) # Construire le fichier objet avec CC et CFLAGS aire.o : Makefile aire.c cercle.o : Makefile cercle.c # Nettoyage des fichiers objets (si on considere par exemple que le fichier binaire n'a dorenavent plus besoin d'etre recompile) clean : rm -f `find . -name '*.o' -print`