我有一个工具,用于在构建过程中生成 C++ 头文件。我只想写出生成的标头(如果它们与磁盘上已有的标头发生更改),这样我就不会触发依赖于这些标头的对象文件的重建。我正在尝试使用 GNU Make 来做到这一点。我的问题是,由于条件写入,我最终陷入先决条件总是比目标更新的情况。
这是我的代码的简化示例:
$(TMP_GENERATED_FILE): $(SCRIPT_INPUT_FILES)
$(SCRIPT) $< -o $@
$(GENERATED_FILE): $(TMP_GENERATED_FILE)
cmp -s "$<" "$@" || cp -f "$<" "$@"
# Other rules for the .o files which depend on $(GENERATED_FILE)
问题是
$(TMP_GENERATED_FILE)
几乎总是比$(GENERATED_FILE)
更新,因为我只写出$(GENERATED_FILE)
,如果它与$(TMP_GENERATED_FILE)
不同。这意味着 $(GENERATED_FILE)
的配方会在每个构建上执行。有什么办法可以避免这种情况吗?理想的状态是如果没有任何改变,后续运行的 make 将不执行任何操作。
您的标头构建过于复杂。这是一个工作示例:
# makefile
all: hello
hello: hello.o
gcc $^ -o $@
hello.o: hello.c hello.h
gcc -c $< -o $@
hello.h: hello.h.in1 hello.h.in2
cat $^ > $@
// hello.c
#include "hello.h"
int main() {
fputs("hello\n", stdout);
return 0;
}
// hello.h.in1
/* autogenerated header */
// hello.h.in2
#include <stdio.h>
测试:
$ make
cat hello.h.in1 hello.h.in2 > hello.h
gcc -c hello.c -o hello.o
gcc hello.o -o hello
$ touch hello.h.in2
$ make
cat hello.h.in1 hello.h.in2 > hello.h
gcc -c hello.c -o hello.o
gcc hello.o -o hello
$ touch hello.c
$ make
gcc -c hello.c -o hello.o
gcc hello.o -o hello
有疑问吗?