Shake如何决定是否重建目标?

时间:2013-10-19 18:00:10

标签: shake-build-system

我对Shake用于确定是否需要重建输出的规则感到困惑。我有一个简单的文档构建,有两个步骤。完整的构建文件如下所示,但总结一下,asciidoc用于将.txt文件转换为.dbxml(Docbook XML)文件,然后使用{{1}将其转换为PDF }。

我希望如果我触摸PDF并重新运行抖动,则不会发生任何事情,因为输出比两个输入都要新。但是,实际上,shake会执行dblatex步骤。

接下来,我希望如果我触摸dblatex文件,那么shake将执行dblatex但不执行asciidoc,因为dbxml比其输入更新(即.dbxml)。然而,实际上震动同时执行asciidoc和dblatex步骤。

我在依赖项中犯了错误吗?

.txt

1 个答案:

答案 0 :(得分:4)

在Shake中,如果文件的上次修改时间从构建时更改,则该文件被视为脏。在make中,如果文件的上次修改时间较早而不是其依赖项,则该文件被视为脏。我怀疑你的观察结果都源于这种差异。要直接回答这个问题,Shake会在文件或其任何直接依赖项发生更改时重建文件。

为什么Shake会做出与众不同的事情?原因有三:

  1. 如果修改时间发生变化,Make不会存储足够的信息以允许它重建,因为它没有记录有关上次构建中修改时间的任何额外元数据。
  2. 通过进行时间比较,依赖于单调递增的时钟,如果用户更改系统时间,则会中断,并且似乎特别容易在NFS文件系统上出现故障。
  3. 假设A取决于B,B取决于C.C更改,B重建,但B的规则足够聪明,发现旧B不需要更新。在make中你有两个糟糕的选择 - 无论如何都要触摸B并重建A,或者不要触摸B然后在每次运行make时运行B的规则。在Shake中你不接触B,A不重建,B不会在下次重建。
  4. 至于你的构建系统,这对我来说都很好看。我唯一的小调整是使用中缀运算符-<.>而不是replaceExtension - 它们都是相同的函数,但操作符看起来更清晰。