避免重建未更改输出的依赖项
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
当我在 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