Ich habe das folgende Makefile, mit dem ich ein Programm (eigentlich einen Kernel) erstelle, an dem ich arbeite. Es ist von Grund auf neu und ich lerne etwas über den Prozess, daher ist es nicht perfekt, aber ich denke, es ist zu diesem Zeitpunkt mächtig genug für meine Erfahrung beim Schreiben von Makefiles.
AS = nasm
CC = gcc
LD = ld
TARGET = core
BUILD = build
SOURCES = source
INCLUDE = include
ASM = assembly
VPATH = $(SOURCES)
CFLAGS = -Wall -O -fstrength-reduce -fomit-frame-pointer -finline-functions \
-nostdinc -fno-builtin -I $(INCLUDE)
ASFLAGS = -f elf
#CFILES = core.c consoleio.c system.c
CFILES = $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
SFILES = assembly/start.asm
SOBJS = $(SFILES:.asm=.o)
COBJS = $(CFILES:.c=.o)
OBJS = $(SOBJS) $(COBJS)
build : $(TARGET).img
$(TARGET).img : $(TARGET).elf
c:/python26/python.exe concat.py stage1 stage2 pad.bin core.elf floppy.img
$(TARGET).elf : $(OBJS)
$(LD) -T link.ld -o $@ $^
$(SOBJS) : $(SFILES)
$(AS) $(ASFLAGS) $< -o $@
%.o: %.c
@echo Compiling $<...
$(CC) $(CFLAGS) -c -o $@ $<
#Clean Script - Should clear out all .o files everywhere and all that.
clean:
-del *.img
-del *.o
-del assembly\*.o
-del core.elf
Mein Hauptproblem bei diesem Makefile ist, dass beim Ändern einer Header-Datei, die eine oder mehrere C-Dateien enthält, die C-Dateien nicht neu erstellt werden. Ich kann dies ganz einfach beheben, indem alle meine Header-Dateien Abhängigkeiten für alle meine C-Dateien darstellen. Dies würde jedoch jedes Mal, wenn ich eine Header-Datei ändere / hinzufüge, zu einer vollständigen Neuerstellung des Projekts führen, was nicht sehr elegant wäre.
Ich möchte, dass nur die C-Dateien, die die von mir geänderte Header-Datei enthalten, neu erstellt und das gesamte Projekt erneut verknüpft werden. Ich kann die Verknüpfung durchführen, indem alle Header-Dateien Abhängigkeiten vom Ziel darstellen, aber ich kann nicht herausfinden, wie die C-Dateien ungültig werden, wenn ihre enthaltenen Header-Dateien neuer sind.
Ich habe gehört, dass GCC einige Befehle hat, um dies zu ermöglichen (damit das Makefile irgendwie herausfinden kann, welche Dateien neu erstellt werden müssen), aber ich kann für mein ganzes Leben kein tatsächliches Implementierungsbeispiel finden, das ich mir ansehen kann. Kann jemand eine Lösung veröffentlichen, die dieses Verhalten in einem Makefile ermöglicht?
EDIT: Ich sollte klarstellen, ich bin mit dem Konzept vertraut, die einzelnen Ziele einzufügen und jedes Ziel zu haben. Um die Header-Dateien zu benötigen. Das erfordert, dass ich das Makefile jedes Mal bearbeite, wenn ich irgendwo eine Header-Datei einbinde, was ein bisschen mühsam ist. Ich suche nach einer Lösung, die die Abhängigkeiten der Header-Dateien selbst ableiten kann. Ich bin mir ziemlich sicher, dass ich sie in anderen Projekten gesehen habe.