Makefiles
Guide complet des Makefiles: syntaxe, templates et bonnes pratiques pour automatiser vos builds.
Règle de base
Une règle définit comment construire une cible à partir de ses dépendances.
target: dependency1 dependency2
command1
command2Cibles spéciales
Les cibles spéciales modifient le comportement de make.
.PHONY: all clean install
.DEFAULT_GOAL := all
all: program
clean:
rm -f *.o program
install: program
cp program /usr/local/bin/Règles implicites
Make a des règles implicites pour les opérations courantes.
# Règle implicite pour compiler un fichier .c en .o
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
# Utilisation de la règle implicite
main.o: main.c header.hConditions
# Vérification de la valeur d'une variable
ifeq ($(DEBUG), yes)
CFLAGS += -g -DDEBUG
else
CFLAGS += -O2
endif
# Vérification de l'existence d'une commande
ifneq ($(shell which clang),)
CC = clang
else
CC = gcc
endifInclure d'autres Makefiles
# Inclure un autre Makefile
include config.mk
# Inclure conditionnellement
-include $(DEPS)
# Inclure tous les Makefiles d'un répertoire
include $(wildcard modules/*.mk)Règles à motifs
# Règle à motif pour convertir des fichiers .c en .o
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
# Règle à motif pour convertir des fichiers .md en .html
%.html: %.md
pandoc -f markdown -t html -o $@ $<Bonnes pratiques
• Utilisez des variables pour tous les paramètres configurables
• Regroupez les variables liées en sections
• Utilisez des commentaires pour expliquer les sections complexes
• Séparez les Makefiles en modules pour les grands projets
• Utilisez des commandes shell portables (sh, pas bash)
• Testez les commandes avec des conditions
• Utilisez des variables pour les chemins de fichiers
• Évitez les fonctionnalités spécifiques à GNU Make si possible
• Utilisez des dépendances précises pour éviter les recompilations inutiles
• Utilisez la génération automatique de dépendances (-MMD -MP)
• Utilisez make -j pour la compilation parallèle
• Évitez les appels shell inutiles dans les variables récursives
• Utilisez make -n pour voir les commandes sans les exécuter
• Utilisez $(info ...) pour afficher des informations de débogage
• Créez une cible "debug" pour afficher les variables
debug:
@echo "SOURCES: $(SOURCES)"
@echo "OBJECTS: $(OBJECTS)"
@echo "CFLAGS: $(CFLAGS)"