Intéressant, je ne savais pas que make utiliserait par défaut le compilateur C étant donné les règles concernant les fichiers source.
Quoi qu'il en soit, une solution simple qui démontre des 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 tabulation au lieu d'une indentation d'espace, alors assurez-vous de corriger cela lors de la copie)
Cependant, pour prendre en charge plus de fichiers C, vous devrez créer de nouvelles règles pour chacun d'entre 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 comme $ (CC) et $ (CFLAGS) qui sont généralement vues dans les makefiles. Si cela vous intéresse, j'espère que je vous ai donné un bon départ.
Voici le Makefile que j'aime utiliser pour la source C. Sentez-vous libre de 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 joker 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, des bibliothèques ou des indicateurs de compilateur générés, vous pouvez simplement modifier les variables.
Dans les deux cas, n'utilisez pas autoconf, s'il vous plaît. Je t'en supplie! :)