修改 CFLAGS 时,生成文件不会重建 obj?



正如我们所知,二进制文件依赖于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重新生成代码。我该怎么做?请注意,我不想删除对象并重建它。

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 $@

任何帮助都将不胜感激。

Make只需检查文件上的时间戳即可工作。你几乎不希望每个构建工件都依赖于你的Makefile(至少在积极开发它的时候不是这样),但如果你真的想让Make处理这种依赖关系,你可以把CFLAGS定义放在次要文件buildflags.mk中,从主Makefile中包括它,并使所有对象文件都依赖于buildflags.mk

不过,我认为在实践中几乎没有人会真的这么做。在某些情况下,确保构建干净的唯一方法就是清空所有内容并重新开始。确保您拥有良好且最新的realclean和/或distclean目标,并确保在对构建基础架构进行根本性更改时记得使用它们。拥有一个夜间构建工作(或类似的工作),从一个完全干净的开始构建——例如,将一个新副本签入一个临时目录——显然也是一个好主意。

或者,或者另外,在每个对象文件中包含一个构建标志的副本作为静态字符串,以便稍后可以使用--help选项或类似选项对其进行验证。

每次更改CFLAGS时,都可以使用make-B选项强制进行重建。看看这个答案。

最新更新