下面的 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,这有点麻烦。我正在寻找一个解决方案,可以获得头文件依赖关系本身,这是我相当肯定我在其他项目中看到的。