Tengo el siguiente archivo MAKE que utilizo para construir un programa (un kernel, en realidad) en el que estoy trabajando. Es desde cero y estoy aprendiendo sobre el proceso, por lo que no es perfecto, pero creo que es lo suficientemente poderoso en este punto para mi nivel de experiencia escribiendo archivos MAKE.
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
Mi principal problema con este archivo MAKE es que cuando modifico un archivo de encabezado que incluyen uno o más archivos C, los archivos C no se reconstruyen. Puedo solucionar esto con bastante facilidad haciendo que todos mis archivos de encabezado sean dependencias para todos mis archivos C, pero eso causaría efectivamente una reconstrucción completa del proyecto cada vez que cambie / agregue un archivo de encabezado, lo que no sería muy elegante.
Lo que quiero es solo para los archivos C que incluyen se reconstruyan el archivo de encabezado que cambio y que todo el proyecto se vuelva a vincular. Puedo hacer el enlace haciendo que todos los archivos de encabezado sean dependencias del objetivo, pero no puedo averiguar cómo hacer que los archivos C se invaliden cuando sus archivos de encabezado incluidos son más nuevos.
Escuché que GCC tiene algunos comandos para hacer esto posible (por lo que el archivo MAKE de alguna manera puede averiguar qué archivos deben reconstruirse) pero no puedo por mi vida encontrar un ejemplo de implementación real para mirar. ¿Alguien puede publicar una solución que habilite este comportamiento en un archivo MAKE?
EDITAR: Debo aclarar, estoy familiarizado con el concepto de poner los objetivos individuales y hacer que cada objetivo. O requiera los archivos de encabezado. Eso requiere que edite el archivo MAKE cada vez que incluyo un archivo de encabezado en alguna parte, lo cual es un poco molesto. Estoy buscando una solución que pueda derivar las dependencias del archivo de encabezado por sí sola, lo cual estoy bastante seguro de haber visto en otros proyectos.