4

我想知道使用抖动和ghc --make一起的推荐方式。在我的项目中,shake 规则用于将 C 源代码编译到它们的*.o文件中(我称之为cobjects),并且这些对象通过调用链接到我的 haskell 程序中ghc --make。在此命令期间,ghc它会自行确定何时需要重建我的 haskell 文件。

下面的示例未正确编写以集成这两个工具。如果.hs文件更改,则重新运行摇动脚本不会重新调用ghc --make. 我理解为什么 Shake 不知道重建,但我不知道推荐的修复方法。

main = shake shakeOptions $ do
  want [main_exe]

  main_exe *> \out -> do
    need cobjects
    cmd "ghc --make" hs_compileFlags cobjects "main.hs"

  cobjects **> ...
4

2 回答 2

2

一般原则是,如果规则运行使用文件的命令,它应该依赖于文件。在您的情况下,您必须need满足所有ghc --make要求,最简单的方法是使用ghc -M(生成一个Makefile):

main = shake shakeOptions $ do
  want [main_exe]

  main_exe *> \out -> do
    need cobjects
    cmd "ghc -M" hs_compileFlags "main.hs"
    cmd "ghc --make" hs_compileFlags cobjects "main.hs"
    needMakefileDependencies "Makefile"

  cobjects **> ...

needMakefileDependencies函数在Development.Shake.Util. 唯一的微妙之处是我在运行命令needMakefileDependencies 调用,否则目标文件将不会被创建(你可以通过只过滤using自己的.hs文件来解决这个问题)。MakefileparseMakefile

于 2014-02-18T14:03:09.310 回答
0

看起来推荐的方法可能是使用“假”规则并want在顶部添加该规则。这是从这个有用的教程中找到的:

http://blog.jle.im/entry/shake-task-automation-and-scripting-in-haskell

我第一次尝试将此想法应用于我的示例:

main = shake shakeOptions $ do
  want [main_exe, "compile and link hs"]

  main_exe *> \out -> do
    need cobjects

  cobjects **> ...

  "compile and link hs" ~> do
    cmd "ghc --make" hs_compileFlags cobjects "main.hs"

(~>)函数指定字符串"compile and link hs"是规则的名称,而不是文件的名称。

虽然这总是会尝试像我想要的那样运行新规则,但不幸的是它会尝试在我不想要的规则之前main_exe运行规则

将新规则的需求移到规则中main_exe似乎可以解决这个新问题:

main = shake shakeOptions $ do
  want [main_exe]

  main_exe *> \out -> do
    need cobjects
    need ["compile and link hs"]

  cobjects **> ...

  "compile and link hs" ~> do
    cmd "ghc --make" hs_compileFlags cobjects "main.hs"

虽然这可行,但我不明白 Shake 如何决定在第一段代码中运行这两个规则的顺序。

于 2014-02-14T16:30:37.603 回答