haskell - 我应该如何让 Shake 知道需要 'ghc --make' 来跟踪 haskell 文件的更改?

标签 haskell shake-build-system

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

下面的示例未正确编写以集成这两个工具。如果 .hs文件更改然后重新运行 shake 脚本将不会重新调用 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 **> ...

最佳答案

一般原则是,如果规则运行使用文件的命令,则它应该依赖于该文件。在您的情况下,您必须需要所有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 **> ...

needMakefileDependency 函数位于 Development.Shake.Util 中。唯一的微妙之处是我在运行命令之后调用 needMakefileDependency ,否则目标文件还不会被创建(您可以通过仅过滤 >.hs 文件在 Makefile 中使用 parseMakefile 自己)。

关于haskell - 我应该如何让 Shake 知道需要 'ghc --make' 来跟踪 haskell 文件的更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21756380/

相关文章:

haskell:cd 命令在 shake/command 库中不起作用

haskell - 摇一摇: Signal whether anything had to be rebuilt at all

haskell - haskell中的斐波那契序列返回所有值

haskell - 摇一摇: how to proceed when file name is not known a-priori

haskell - (l,r)之前的~是什么意思

haskell - 我可以以某种方式使用比包指定的版本更高版本的包吗?

haskell - 为什么Shake不为Action提供MonadMask实例?

shake-build-system - 为什么 Shake 依赖项是明确的 `needed` ?

haskell : continuing recursion for extra step

haskell - 提前终止一元折叠