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 momento para mi nivel de experiencia escribiendo makefiles.¿Cómo puedo hacer que un Makefile vuelva a generar automáticamente los archivos fuente que incluyen un archivo de encabezado modificado? (En C/C++)
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
Mi principal problema con este archivo MAKE es que cuando modifico un archivo de cabecera que uno o más archivos de C incluyen, los archivos de C no se reconstruyen. Puedo arreglar esto bastante fácilmente teniendo todos mis archivos de encabezado como dependencias para todos mis archivos C, pero eso efectivamente causaría una reconstrucción completa del proyecto cada vez que cambiara/añadiera un archivo de encabezado, lo cual no sería muy elegante.
Lo que quiero es solo para los archivos C que incluyen el archivo de encabezado que cambio para reconstruirlo, y para 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 imaginar cómo hacer que los archivos C se invaliden cuando los archivos de encabezado incluidos son más nuevos.
He oído que GCC tiene algunos comandos para que esto sea posible (para que el archivo MAKE pueda de alguna manera descubrir qué archivos deben ser reconstruidos) pero no puedo encontrar un ejemplo de implementación real para mirar . ¿Alguien puede publicar una solución que permita este comportamiento en un archivo MAKE?
EDIT: Debería aclarar, estoy familiarizado con el concepto de poner los objetivos individuales y tener cada objetivo.o requieren los archivos de encabezado. Eso requiere que edite el archivo MAKE cada vez que incluya 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í mismo, que estoy bastante seguro de haber visto en otros proyectos.
Puedo estar equivocado, pero creo que GCC realmente ha agregado una función para tratar de evitar ese problema. Consulte http://gcc.gnu.org/onlinedocs/gcc-4.3.1/gcc/Preprocessor-Options.html específicamente -MP. –
Sí, -MP existe desde GCC 3, existe en clang y icc, y anula la necesidad de sed. http://bruno.defraine.net/techtips/makefile-auto-dependencies-with-gcc/#comment-50775 – hmijail