Intéressant, je ne savais pas que make utiliserait par défaut le compilateur C en fonction des règles concernant les fichiers source.
Quoi qu'il en soit, une solution simple qui démontre les concepts simples de Makefile serait:
HEADERS = program.h headers.h
default: program
program.o: program.c $(HEADERS)
gcc -c program.c -o program.o
program: program.o
gcc program.o -o program
clean:
-rm -f program.o
-rm -f program
(gardez à l'esprit que make nécessite une indentation par tabulation au lieu d'espaces, assurez-vous de corriger cela en copiant)
Cependant, pour supporter plus de fichiers C, vous devriez créer de nouvelles règles pour chacun d'eux. Ainsi, pour améliorer:
HEADERS = program.h headers.h
OBJECTS = program.o
default: program
%.o: %.c $(HEADERS)
gcc -c $< -o $@
program: $(OBJECTS)
gcc $(OBJECTS) -o $@
clean:
-rm -f $(OBJECTS)
-rm -f program
J'ai essayé de rendre cela aussi simple que possible en omettant des variables telles que $(CC) et $(CFLAGS) qui sont généralement vues dans les Makefiles. Si vous êtes intéressé à comprendre cela, j'espère vous avoir donné un bon départ sur ce sujet.
Voici le Makefile que j'aime utiliser pour les sources C. N'hésitez pas à l'utiliser:
TARGET = prog
LIBS = -lm
CC = gcc
CFLAGS = -g -Wall
.PHONY: default all clean
default: $(TARGET)
all: default
OBJECTS = $(patsubst %.c, %.o, $(wildcard *.c))
HEADERS = $(wildcard *.h)
%.o: %.c $(HEADERS)
$(CC) $(CFLAGS) -c $< -o $@
.PRECIOUS: $(TARGET) $(OBJECTS)
$(TARGET): $(OBJECTS)
$(CC) $(OBJECTS) -Wall $(LIBS) -o $@
clean:
-rm -f *.o
-rm -f $(TARGET)
Il utilise les fonctionnalités wildcard et patsubst de l'utilitaire make pour inclure automatiquement les fichiers .c et .h dans le répertoire actuel, ce qui signifie que lorsque vous ajoutez de nouveaux fichiers de code à votre répertoire, vous n'aurez pas à mettre à jour le Makefile. Cependant, si vous souhaitez modifier le nom de l'exécutable généré, des bibliothèques ou des indicateurs de compilation, vous pouvez simplement modifier les variables.
En tout cas, ne utilisez pas autoconf, s'il vous plaît. Je vous en supplie! :)