当我在忍者中有一个包含多个输出的规则时,它会假定所有输出都已更新,反过来所有依赖关系都会被重建,即使它们根本没有改变。
这通常会产生代码生成步骤,如解析器生成器。
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
的所有内容。
如何防止这种情况?
答案 0 :(得分:1)
将restat
添加到您的规则中。来自documentation:
restat
如果存在,则在执行命令后使Ninja重新统计命令的输出。命令未更改的修改时间的每个输出都将被视为从未需要构建。这可能会导致输出的反向依赖性从挂起的构建操作列表中删除。
因此规则变为:
rule lemon
command = lemon $in
restat = 1