Lorsque l'on développe un programme un peu plus important que l'exemple
donné plus haut, il devient vite fastidieux d'utiliser directement la
commande cc, avec les bonnes options et sans oublier de recompiler
tous les fichiers que l'on a modifiés depuis la dernière mise à jour.
Supposons que l'on travaille sur un projet comportant deux fichiers sources,
main.c et func.c, qui utilisent tous deux un fichier
inc/incl.h placé dans un sous-répertoire. L'exécutable que l'on
fabrique est nommé essai.
En utilisant cc, il faut faire :
$ cc -c -Iinc -o main.o main.c $ cc -c -Iinc -o func.o func.c $ cc -o essai main.o func.oL'option
-c spécifie que l'on veut fabriquer un fichier objet (.o)
qui sera lié ultérieurement pour obtenir un exécutable.
Si l'on modifie main.c, il faut refaire les étapes 1 et 3.
Si l'on modifie le fichier inclut, il faut tout refaire. On dit que
essai dépend de main.o et func.o, qui dépendent
eux même de main.c, func.c et de incl.h.
Ceci signifie que notre exécutable final (essai) est à jour si sa
date de modification est plus grande que celle de main.o et
func.o, et ainsi de suite.
La commande make permet d'automatiser ce genre de chaînes de production. Son utilisation permet au développeur de s'assurer qu'un module donné est toujours à jour par rapport aux divers éléments dont il dépend. make se charge de déclencher les actions nécessaires pour reconstruire le module cible.
Makefile.
Syntaxe d'un fichier makefile :
but : dependance1 [...[dependance_n]]
commande1
commande2
...
La ou les cibles doivent apparaître sur la première ligne et être suivies de ':'. A la suite figure la liste des dépendances conduisant à la cible. Les règles de production sont décrites sur les lignes suivantes, qui doivent impérativement commencer caractère de tabulation.
Voici un exemple de fichier Makefile traitant l'exemple précédent :
all: essai
essai: main.o func.o
cc -o essai func.o main.o
CFLAGS= -Iinc
func.o: inc/incl.h
main.o: inc/incl.h
La première ligne (all) indique que la cible par défaut est
essai : lorsque l'on actionne make sans arguments, on veut
fabriquer essai.
Ensuite, on indique que essai dépend des deux fichiers objets, et
qu'il se fabrique à partir d'eux en actionnant cc -o essai ....
CFLAGS est une variable spéciale indiquant les options à passer au
compilateur C, ici -Iinc.
Enfin, on spécifie que les fichiers .o dépendent du fichier
.h. Notons que make utilise un certain nombre de règles par
défaut, par exemple celle disant que les fichiers .o dépendent
des fichiers .c et se fabriquent en utilisant cc. Il n'est donc
pas nécessaire de faire figurer la règle complète, qui s'écrirait :
main.o: inc/incl.h main.c
cc -Iinc -c -o main.o main.c