Affichage des articles dont le libellé est makefile. Afficher tous les articles
Affichage des articles dont le libellé est makefile. Afficher tous les articles

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