我的Makefile为:
BUILD_DIR= $(BASE_DIR)/build
_OBJ := a.o b.o
CLEAN_OBJECTS := $(_OBJ)
.PHONY: clean
create_code:
python ../script/my_script.py
all: create_code $(_OBJ)
$(_OBJ): %.o: %.c
mkdir -p $(BUILD_DIR)
$(CC) $(CFLAGS) $(INCLUDE_PATH) -c $< -o $@
cp *.o $(BUILD_DIR)
clean:
rm -f $(CLEAN_OBJECTS)
目标create_code执行python脚本并生成一组.c / .h文件。
目标_obj编译它们。
每次我运行make all
时,都会运行create_code
目标,即使先前生成的.c / .h没有变化。
仅在make clean
之前完成有关为什么发生这种情况以及如何使create_code目标运行的任何建议。
答案 0 :(得分:0)
潜在的问题是您有一个或多个生成的文件,这些文件依赖于底层文件系统以外的其他东西,即数据库的内容。
一种可能性是利用以下事实:make
调用规则重建目标后,仍然会在其他任何目标被指定为前提时始终检查该目标的更新时间规则。
所以,给定规则(未测试)...
.PHONY: FORCE
%.c: FORCE
command-to-generate-source $@.tmp
diff -q $@.tmp $@ || cp $@.tmp $@
从命令行调用make foo.c
。 make
将运行命令...
command-to-generate-source foo.c.tmp
diff -q foo.c.tmp foo.c || cp foo.c.tmp foo.c
其中command-to-generate-source foo.c.tmp
应该保留其输出在foo.c.tmp
中。如果新生成的输出文件与现有文件不同,则将运行cp
操作,因此将更新目标时间戳,并相应地更新所有依赖于目标的时间戳。
但是,如果新生成的输出文件与现有文件相同,则将不运行任何cp
,目标文件将保持不变,并且make
不会将其视为已更改当它成为其他规则的前提条件时。
这只是一种可能性,但是鉴于您已经在命令python ../script/my_script.py
中拥有大多数(如果不是全部)所需逻辑,这是显而易见的可能性。