#Les différences majeures sont : #- suppression de la règle "depend" #- ajout des options -MMD et -MP à gcc/g++ # #Ces deux options exportent les dépendances dans un fichier (par défaut) sans arrêter la compilation. #-MD exporte tous les include (y compris les include des include...) #-MMD filtre les include "standards" (#include <...>) ce qui produit des fichiers .d beaucoup plus petits et lisibles #-MP ajoute des règles vides pour les fichiers sans dépendance, de façon à ne pas arrêter la compilation si ce fichier est bêtement supprimé... # #Le gros avantage est le suivant : #- si pas de .d ou si le .c/.cpp change de date : on recompile sans poser de question => génère les .d #- le .d donne les dépendances pour la prochaine compilation # => si .h change, le .c/.c++ est recompilé # # "monapp" est le nom de l'executable a produire ; cette premiere ligne est # appelee par "make" sans etiquette. all: monapp # tous les modules objets (binaire) du projet ; attention tous les fichiers sources # doivent etre dans le repertoire courant ou dans des librairies, ne pas mettre # d'autres fichiers sources (hors projet) dans ce repertoire. OBJECTS = 2.o 3.o monapp.o # ou #OBJECTS = $(addsuffix .o, $(basename $(shell ls *.c *.s 2>null))) # ou #OBJECTS = $(addsuffix .o, $(basename $(wildcard *.c))) # ou #OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c) $(patsubst %.cpp, %.o, $(wildcard *.cpp) # ou encore avec deux variables # SRC = $(wildcard *.c) # OBJECTS = $(SRC: %.c=%.o) # les options de compilation. # -MMD exporte les dependances vers un fichier .d, sans interrompre la compilation. -MD fait de meme, mais en incluant les fichiers "standards" # -MP ajoute des dependances vides pour les fichiers sans dependance, de facon a ne pas planter si ce fichier est supprime # -g active le debogage et -O0 desactive l'optimisation CFLAGS = -g -O0 -Wall -MP -MMD # les options pour l'edition de lien (ld), en particulier les bibliotheques ("-lm" pour la lib math) LDFLAGS = # les chemins non standards pour les "include" : -I INCLUDES = # liste des modules objets (".o") pour produire l'executable # "$@" pour le nom de la regle # "$^" on prend toutes les dependances, meme si deja resolues (quelque soit les dates des fichiers) monapp: monapp.o $(OBJECTS) gcc $(LDFLAGS) -o $@ $^ # rien a changer au dela de cette ligne # chaque module objet ("%.o") necessite le fichier source ("%.c") correspondant (de meme nom ou "basename") # "$<" precise que l'on ne garde que les dependances non resolues (fichiers modifies / date des fichiers source) %.o: %.c gcc -c $(CFLAGS) $(INCLUDES) $< # chaque module objet ("%.o") necessite le fichier source ("%.cpp") correspondant (de meme nom ou "basename") # "$<" precise que l'on ne garde que les dependances non resolues (fichiers modifies / date des fichiers source) %.o: %.cpp g++ -c $(CFLAGS) $(INCLUDES) $< # Cree une cible vide sans dependance : clean. Ainsi "make clean" nettoie le dossier courant. .PHONY: clean # supprime les modules objet ("*.o") et les eventuels fichiers de sauvegarde (~) clean: rm -f *.o *.d *~ # le "-" est obligatoire (la premiere fois il n'y a pas de fichiers "*.d") # cette instruction ajoute tous les fichiers de dependances ("*.d") dans le Makefile. -include *.d