1

当我在 ninja 中有一个包含多个输出的规则时,它假定所有输出都已更新,并且它们的所有依赖项都被重建,即使它们根本没有改变。

这通常会出现代码生成步骤,例如解析器生成器。

例如对于 LEMON 解析器生成器:

rule lemon
    command = lemon $in

build grammar.c grammar.h grammar.out: lemon grammar.y

如果在运行 LEMON 后grammar.y得到更新但grammar.h没有改变。LEMON 检测到这一点并且不更新文件。尽管如此,忍者重建了所有依赖的东西grammar.h

我该如何防止这种情况?

4

1 回答 1

1

添加restat到您的规则中。从文档中:

restat
如果存在,则导致 Ninja 在执行命令后重新统计命令的输出。其修改时间命令未更改的每个输出都将被视为从未需要构建。这可能会导致输出的反向依赖关系从待处理的构建操作列表中删除。

所以规则变成了:

rule lemon
    command = lemon $in
    restat = 1
于 2015-11-19T10:57:55.033 回答