Quelques suggestions en vrac pour ton Makefile :
- Il existe une syntaxe pour remplacer une sous-chaine par une autre dans le contenu d'une variable, ce qui te permet de changer les extensions ".c" en ".o" et de ne pas avoir à maintenir à jour deux listes quasiment identiques :
SRC = main.c engine.c custom.c
OBJ = $(SRC:.c=.o)
# ici, $OBJ = main.o engine.o custom.o
- Tu peux faire des règles génériques pour éviter d'écrire explicitement que chaque .c donne le .o corespondant. La syntaxe est totalement illogique avec "make" (gmake propose beaucoup mieux), mais elle existe quand même :
SRC = main.c engine.c custom.c
OBJ = $(SRC:.c=.o)
# la règle ci-dessous signifie "chaque .o dépend du .o de même nom",
# $< fait référence à la source (le .c) et $@ à la cible (le .o).
.c.o:
gcc -W -Wall -o $@ -c $<
- L'idée de faire dépendre tes .o des .h qui sont utilisés pour leur génération est bonne (voire indispensable), mais c'est pénible à faire à la main et source d'erreur. Une solution plus pratique serait de faire dépendre tes .c de leurs .h respectifs, et ça tombe bien, gcc propose justement une option "-M" qui analyse les fichiers source et affiche en syntaxe "make" les règles de dépendance. Tu n'as plus qu'à rediriger la sortie de cette commande dans un fichier (par exemple "Makefile.depends") et l'inclure dans ton Makefile :
BIN = myprog
SRC = main.c engine.c custom.c
OBJ = $(SRC:.c=.o)
all: $(BIN)
# création du fichier "Makefile.dep" contenant les règles de dépendance.
depends:
gcc -W -Wall -M $(SRC) > Makefile.dep
$(BIN): $(OBJ)
# grâce à cette inclusion (qui ne plantera pas si le fichier n'existe pas, grâce au
# "-" devant), les dépendances seront gérées automatiquement à condition
# d'avoir appelé la règle "depends" avant pour créer "Makefile.dep".
-include Makefile.dep
.c.o:
gcc -W -Wall o $@ -c $<