Ich habe das folgende Makefile, das ich verwende, um ein Programm (eigentlich einen Kernel) zu erstellen, an dem ich gerade arbeite. Es wurde von Grund auf neu erstellt und ich lerne gerade etwas über den Prozess, daher ist es nicht perfekt, aber ich denke, dass es zu diesem Zeitpunkt leistungsfähig genug ist 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 mit diesem Makefile ist, dass wenn ich eine Header-Datei ändere, 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 sind Abhängigkeiten für alle meine C-Dateien, aber das würde effektiv dazu führen, dass ein komplettes Rebuild des Projekts jedes Mal, wenn ich geändert/hinzugefügt eine Header-Datei, die nicht sehr anmutig sein würde.
Was ich möchte, ist, dass nur die C-Dateien, die einschließen. die von mir geänderte Header-Datei neu erstellt und das gesamte Projekt neu verlinkt werden muss. Ich kann die Verknüpfung tun, indem ich alle Header-Dateien zu Abhängigkeiten des Ziels, aber ich kann nicht herausfinden, wie die C-Dateien ungültig gemacht werden, wenn ihre enthaltenen Header-Dateien neuer sind.
Ich habe gehört, dass GCC einige Befehle hat, um dies möglich zu machen (so dass das Makefile irgendwie herausfinden kann, welche Dateien neu erstellt werden müssen), aber ich kann nicht für das Leben von mir ein tatsächliches Beispiel für die Implementierung finden, um zu sehen. Kann jemand eine Lösung posten, die dieses Verhalten in einem Makefile ermöglicht?
EDIT: Ich sollte klarstellen, ich bin vertraut mit dem Konzept der Platzierung der einzelnen Ziele in und mit jeder target.o erfordern die Header-Dateien. Das erfordert, dass ich die makefile jedes Mal, wenn ich eine Header-Datei irgendwo einschließen, die ein bisschen ein Schmerz ist zu bearbeiten. Ich bin auf der Suche nach einer Lösung, die die Header-Datei-Abhängigkeiten auf eigene Faust ableiten kann, die ich bin ziemlich sicher, ich habe in anderen Projekten gesehen.