避免重建未更改输出的依赖项

Avoid rebuilding dependencies of unchanged outputs

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

这通常伴随着代码生成步骤,例如解析器生成器。

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

rule lemon
    command = lemon $in

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

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

的东西

如何防止这种情况发生?

restat 添加到您的规则中。来自 documentation:

restat
If present, causes Ninja to re-stat the command’s outputs after execution of the command. Each output whose modification time the command did not change will be treated as though it had never needed to be built. This may cause the output’s reverse dependencies to be removed from the list of pending build actions.

所以规则变成:

rule lemon
    command = lemon $in
    restat = 1