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

时间:2015-11-19 10:57:55

标签: build-process build-dependencies ninja

当我在忍者中有一个包含多个输出的规则时,它会假定所有输出都已更新,反过来所有依赖关系都会被重建,即使它们根本没有改变。

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

E.g。对于LEMON解析器生成器:

rule lemon
    command = lemon $in

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

如果grammar.y更新,但运行LEMON后grammar.h没有更改。 LEMON检测到此并且不更新文件。不过,忍者重建依赖于grammar.h的所有内容。

如何防止这种情况?

1 个答案:

答案 0 :(得分:1)

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

  

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

因此规则变为:

rule lemon
    command = lemon $in
    restat = 1