Come posso fare in modo che Makefile ricostruisca automaticamente i file sorgente che includono un file di intestazione modificato? (In C / C ++)

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 [email protected] $^ $(SOBJS) : $(SFILES) $(AS) $(ASFLAGS) $< -o [email protected] %.o: %.c @echo Compiling $<... $(CC) $(CFLAGS) -c -o [email protected] $< #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 avendo tutti i miei file di intestazione essere dipendenze per tutti i miei file C, ma ciò causerebbe effettivamente una ricostruzione completa del progetto ogni volta che ho cambiato / aggiunto un file di intestazione, il che non sarebbe molto aggraziato.

Quello che voglio è solo per i file C che includono il file di intestazione che ho modificato per essere ricostruito e che l’intero progetto deve essere nuovamente collegato. Posso eseguire il collegamento facendo sì che tutti i file di intestazione siano dipendenti dalla destinazione, ma non riesco a capire come rendere i file C invalidi quando i loro file di intestazione inclusi sono più recenti.

Ho sentito che GCC ha alcuni comandi per renderlo ansible (così il makefile può in qualche modo capire quali file devono essere ricostruiti) ma non posso per la vita di me 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 mettere i singoli bersagli e avere ogni target.o richiedono i file di intestazione. Ciò richiede che io modifichi il makefile ogni volta che includo un file di intestazione da qualche parte, il che è un po ‘un problema. Sto cercando una soluzione che possa derivare da sola le dipendenze del file di intestazione, che sono abbastanza certo di aver visto in altri progetti.