我应该如何让Shake知道需要’ghc –make’来跟踪haskell文件的变化?

我想知道推荐使用shake和ghc的方法 – 一起制作.在我的项目中,使用摇动规则将C源代码编译到他们的* .o文件(我称之为cobjects)中,并通过调用ghc –make将这些对象链接到我的
haskell程序中.在此命令期间,当需要重建我的haskell文件时,ghc会自行计算出来.

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

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 **> ...

needMakefileDependencies函数位于Development.Shake.Util中.唯一的细微之处在于我在运行命令后调用了needMakefileDependencies,否则目标文件还没有被创建(你可以通过自己使用parseMakefile过滤Makefile中的.hs文件来解决这个问题).

点赞