next up previous contents index
Next: La règle des modèles Up: Les makefiles Previous: Les makefiles

   
Compilation simple d'un fichier C

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`


next up previous contents index
Next: La règle des modèles Up: Les makefiles Previous: Les makefiles
MATHIEU DECORE
1999-11-03
Merci de me dire ce que pensez de ce document.