我们知道二进制文件依赖于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 $@
任何帮助将不胜感激。
答案 0 :(得分:2)
通过检查文件的时间戳来简化工作。你几乎不希望每个构建工件都依赖于你的Makefile
(至少在积极开发它时没有)但如果你真的想要Make来处理这种依赖,你可以将CFLAGS
定义放在一个辅助文件中{ {1}},将其包含在主buildflags.mk
中,并使所有目标文件都依赖于Makefile
。
buildflags.mk
和/或realclean
目标,并确保在对构建基础架构进行基本更改时记住使用它们。有一个夜间构建工作(或类似),从一个完全干净的板岩开始构建 - 例如通过将新副本签出到临时目录中 - 显然也是一个好主意。
或者,或者另外,在每个目标文件中包含构建标志的副本作为静态字符串,以便稍后验证它们,可能使用distclean
选项或类似。
答案 1 :(得分:0)
每次更改make
时,您都可以使用-B
的{{1}}选项强制重建。请参阅this answer。