修改CFLAGS时,Makefile不会重建obj?

时间:2013-08-31 11:45:30

标签: makefile

我们知道二进制文件依赖于obj,而obj依赖于.c文件(假设是C项目)。我们说,我有一个env.mk文件。此文件有一个标记,如' export NO_DISPLAY = YES'。在主Makefile中,我有以下内容。

ifeq ($(NO_DISPLAY),YES)
CFLAGS += -D__DISPLAY_DISABLE
endif

显然,env.mk包含在主make文件中。每当,我改变标志值' NO_DISPLAY'。 makefile永远不会再次重建可执行文件。但是,删除.o文件时,同样可以正常工作。我理解它背后的原因,因为它取决于.c,.h文件。 .c .h文件未被修改,因此makefile忽略重建它。但是,如果更改CFLAGS值,我希望makefile重建代码。我该怎么做?请注意,我不想删除obj并重建它。

target_dbg: $(patsubst ./src/%.c,./obj_dbg/%.o,$(wildcard ./src/*.c)) 
    @echo "Target main rule__dbg $(NPROCS)"
    $(CC) $(patsubst ./src/%.c,./obj_dbg/%.o,$(wildcard ./src/*.c)) $(LIBS) -o gif_dbg 

./obj_dbg/%.o: ./src/%.c ./include/*.h 
    @echo "I am called first..dbg"
    @mkdir -p ./obj_dbg
    #$(CC) $(CFLAGS) -E $<
    $(CC) $(CFLAGS) $(LDFLAGS) -DDEBUG -c $< -o $@

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

通过检查文件的时间戳来简化工作。你几乎不希望每个构建工件都依赖于你的Makefile(至少在积极开发它时没有)但如果你真的想要Make来处理这种依赖,你可以将CFLAGS定义放在一个辅助文件中{ {1}},将其包含在主buildflags.mk中,并使所有目标文件都依赖于Makefile

但是,我认为在实践中我几乎没有人会这样做。总会有这样的情况,确保你获得一个干净的构建的唯一方法是刷新一切并重新开始。确保您拥有良好且最新的buildflags.mk和/或realclean目标,并确保在对构建基础架构进行基本更改时记住使用它们。有一个夜间构建工作(或类似),从一个完全干净的板岩开始构建 - 例如通过将新副本签出到临时目录中 - 显然也是一个好主意。

或者,或者另外,在每个目标文件中包含构建标志的副本作为静态字符串,以便稍后验证它们,可能使用distclean选项或类似。

答案 1 :(得分:0)

每次更改make时,您都可以使用-B的{​​{1}}选项强制重建。请参阅this answer