gpt4 book ai didi

makefile - 避免重新生成不会更改的文件

转载 作者:行者123 更新时间:2023-12-04 06:12:25 25 4
gpt4 key购买 nike

我有一个带有这种形式的几个规则的 Makefile

protolist.c: $(PROTOCOLS) Makefile src/genmodtable.sh
$(SHELL) $(srcdir)/src/genmodtable.sh \
$@ $(filter-out %Makefile %genmodtable.sh, $^)

顾名思义, protolist.c最后包含由 .c 定义的所有“协议(protocol)”的列表。 $(PROTOCOLS) 中的文件.这个文件的内容在形式上确实依赖于 $(PROTOCOLS) 中的所有内容。 、Makefile 和生成器脚本,但是当其中一个 .c 时,文件实际上很少发生更改。文件被编辑。因此, genmodtable.sh被编码为不更改 protolist.c 的时间戳如果它不会对其内容进行任何更改。这会导致 Make 跳过重建 protolist.o和它的依赖关系,当它不是真的必要时。

一切正常;问题在于,因为 protolist.c现在它的依赖关系似乎已经过时了,Make 认为它必须尝试重新生成 protolist.c每次运行。这不是性能问题——脚本非常快——但它是令人困惑的行为。我依稀记得有一个习惯用法,涉及时间戳文件,可以用来阻止 Make 这样做,但我无法重建它或在任何地方找到它的描述。有谁知道它是什么?

(另外,如果有人能建议如何摆脱那个愚蠢的 $(filter-out ...) 结构,那将很有帮助,因为这是这个 Makefile 中唯一的 GNUmakeism。)

最佳答案

这似乎类似于 Fortran 编程和 make 的问题,涉及编译模块时生成的文件。 (不相关,除此之外,我了解了如何执行此操作。)

你想要的是比较 protolist.o 的时间戳到 protolist.c 的时间戳,它仍然是“旧的”,并决定运行 protolist.c 的配方,取决于时间戳文件的时间戳,每次运行配方时都会更新。
为了完成这项工作,您必须使用空规则将两者链接在一起。

protolist.o:protolist.c
[...]

protolist.c: protolist.c.time ;

protolist.c.time: $(PROTOCOLS) Makefile src/genmodtable.sh
$(SHELL) $(srcdir)/src/genmodtable.sh\
protolist.c $(过滤掉 %Makefile %genmodtable.sh, $^)
touch protolist.c.time

在我自己的 makefile 中,我必须将时间戳文件声明为特殊目标 .PRECIOUS 的先决条件。 , 以防止 make 删除它们,但我使用的是模式规则;我不是 100% 确定,但我认为在使用显式规则时这不是必需的,比如这里。

为了避免 $(filter-out ...)构造,你能不能简单地用 $(PROTOCOLS) 替换它? ?
(虽然我个人会坚持 Paul's First Rule of Makefiles :不要为编写可移植的 makefile 而烦恼,而是使用可移植的 make。)

关于makefile - 避免重新生成不会更改的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7630157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com