22 septembre 2006

Makefile automatique

Voici un makefile générique qui compile tout les fichier source d'un répertoire

WARN = -W -Wall -Wnested-externs -Wpointer-arith -Winline -Wcast-qual -Wcast-align -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wstrict-prototypes -Wshadow
CFLAGS = --std=c99 -pedantic $(WARN)

OPTIMISE = yes
DEBUG = yes

ifeq ($(DEBUG), yes)
CFLAGS += -ggdb
endif

ifeq ($(OPTIMISE), yes)
CFLAGS += -O2
endif

CC=gcc
SRC= $(wildcard *.c)
OBJ= $(SRC:.c=.o)
PROJET = projet

all: $(PROJET)

$(PROJET): $(OBJ)
$(CC) -o $(PROJET) $(OBJ) $(CFLAGS)

%.o : %.c %.h
@echo -e "CC\t" $< "\t" $@ @$(CC) -o $@ -c $< $(CFLAGS) %.o : %.c @echo -e "CC\t" $< "\t" $@ @$(CC) -o $@ -c $< $(CFLAGS) clean: rm -rf $(OBJ) $(PROJET) @if [ -f core ] ; then rm -f core; echo "rm core" ;fi mrproper: clean rm -rf *~

archive: mrproper
cd .. && tar cjvf $(PROJET)-`date +%d%B%y-%Hh%Mm%Ss`.tar.bz2 `basename $(PWD)`

On peut changer le contenu de la variable PROJET pour changer le nom de l'executable.

Quelques explications :

  • La fonction wildcard permet de sélectionner tout les fichier sources
  • Un @ signifie que la commande ne sera pas affichée
  • On utilise une variable comme cela : $(VAR)
  • Des regles générique sont déclarée à l'aide des %.o
  • OBJ= $(SRC:.c=.o) génére le liste des fichier objet
  • Quelques variables prédéfinies :
    $@ Le nom de la cible
    $< Le nom de la première dépendance
    $^ La liste des dépendances
    $? La liste des dépendances plus récentes que la cible
    $* Le nom du fichier sans suffixe

1 commentaire:

manuc66 a dit…

Je réalise de temps quelques changements, si cela vous intéresse, envoyer moi un petit mail.