Ho il seguente makefile che uso per creare un programma (un kernel, in realtà) su cui sto lavorando. È da zero e sto imparando il processo, quindi non è perfetto, ma penso che sia abbastanza potente a questo punto per il mio livello di esperienza nella scrittura di makefile.
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
Il mio problema principale con questo makefile è che quando modifico un file di intestazione che include uno o più file C, i file C non vengono ricostruiti. Posso risolvere questo problema abbastanza facilmente facendo in modo che tutti i miei file di intestazione siano dipendenze per tutti i miei file C, ma ciò causerebbe effettivamente una ricostruzione completa del progetto ogni volta che ho modificato / aggiunto un file di intestazione, il che non sarebbe molto grazioso.
Quello che voglio è che vengano ricostruiti solo i file C che includono il file di intestazione che cambio e che l'intero progetto sia nuovamente collegato. Posso eseguire il collegamento facendo in modo che tutti i file di intestazione siano dipendenze della destinazione, ma non riesco a capire come rendere i file C invalidati quando i loro file di intestazione inclusi sono più recenti.
Ho sentito che GCC ha alcuni comandi per renderlo possibile (quindi il makefile può in qualche modo capire quali file devono essere ricostruiti) ma non riesco a trovare un vero esempio di implementazione da guardare. Qualcuno può pubblicare una soluzione che abiliterà questo comportamento in un makefile?
EDIT: dovrei chiarire, ho familiarità con il concetto di inserire i singoli target e avere ogni target.o richiedono i file di intestazione. Ciò richiede che modifichi il makefile ogni volta che includo un file di intestazione da qualche parte, il che è un po 'fastidioso. Sto cercando una soluzione che possa derivare da sola le dipendenze del file di intestazione, cosa che sono abbastanza certo di aver visto in altri progetti.