有条件地更新 Makefile 中的目标

问题描述 投票:0回答:1

我有一个工具,用于在构建过程中生成 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 build gnu-make
1个回答
0
投票

您的标头构建过于复杂。这是一个工作示例:

# 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

有疑问吗?

© www.soinside.com 2019 - 2024. All rights reserved.