在新规则中向现有规则添加额外的依赖性

时间:2018-09-24 02:24:57

标签: haskell shake-build-system

我正在编写一个Shakefile,目的是使它可以使用新的Rules进行扩展。它的接口是一个函数mainFor :: Rules () -> IO (),其思想是客户项目只需要定义main = mainFor myCustomRules就可以使整个工作正常进行。 mainFor customRules被定义为一连串的震动Rules,然后调用customRules

只要传递给mainFor的自定义规则是针对新目标的,此方法就起作用。

但是,我的一些常规(非定制)规则的形式基本上是“使用此输入并希望达到最佳效果来运行这个不透明的大型专有外部脚本”;并且外部脚本可能会使用其他文件,具体取决于其输入。例如,假设我有以下形式的规则:

"_build/output.bin" %> out -> do
    need ["_build/script.scr", "_build/src/generated.src"]
    runExternalScript

对于特定的客户项目,也许生成的源代码包含对另一个文件_build/src/extrainput.src的引用。因此,在传递给mainFor的自定义规则中,我不仅为此文件需要其他规则,而且还应该修改现有规则以标记为need此输入:

main = mainFor $ do
    "_build/src/extrainput.src" %> \out -> do
       generateExtraSrc

    "_buld/output.bin" %> \out -> do
      need ["_build/src/extrainput.src"]

但这并不令人意外,因为mainFor中的stock规则和customRules参数中传递的第二个自定义规则都针对同一目标。 请注意,我不想完全覆盖库存规则,而只是扩展它以添加额外的依赖关系。

1 个答案:

答案 0 :(得分:1)

当前无法使用Shake进行此操作。可能性是:

  • 将其添加到Shake。这是否正确取决于此要求的普遍性-我的猜测相对很少-但这需要验证。您希望依赖项在规则之前运行的事实更加令人关注-与以某种方式提供多个共同产生结果的操作相比,它在某种程度上没有组成。
  • 在外面做。我的稻草人将把“ extras”编写为某种FilePath -> Action ()函数,然后定义自己的%>并将该函数应用于输出。它仅适用于预先选择的扩展点,但是如果在文件顶部重新定义%>,它将击中所有实例。
  • 如果您真的想进一步隐藏它,请使用shakeExtra以某种方式存储状态。