我使用以下makefile来构建正在使用的程序(实际上是内核)。它是从头开始的,我正在学习该过程,所以它并不完美,但是对于我自己编写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
这个makefile文件的主要问题是,当我修改一个或多个C文件包含的头文件时,不会重建C文件。通过使我的所有头文件都成为我所有C文件的依赖项,我可以很容易地解决此问题,但是,每当我更改/添加头文件时,这都将有效地导致项目的完全重建,这不是很优雅。
我想要的是仅重建包含我更改的头文件的C文件,并再次链接整个项目。我可以通过使所有头文件成为目标文件的依赖项来进行链接,但是当它们包含的头文件较新时,我无法弄清楚如何使C文件无效。
我听说GCC有一些命令可以做到这一点(因此makefile可以以某种方式找出需要重建的文件),但是我一生都找不到真正的实现示例来查看。有人可以发布解决方案以在Makefile中启用此行为吗?
编辑:我应该澄清一下,我熟悉将各个目标放入并使每个target.o需要头文件的概念。这就要求我每次在某个地方包含头文件时都要编辑makefile,这有点麻烦。我正在寻找一种可以自行导出头文件依赖项的解决方案,我可以肯定在其他项目中也能看到这种依赖。