如何使用Shake编译Haskell程序

时间:2018-06-06 16:01:48

标签: haskell shake-build-system

我有一个Haskell程序,我想用GHC编译,由Shake构建系统编排。我应该执行哪些命令,以及在什么情况下应该重新运行?

1 个答案:

答案 0 :(得分:9)

有两种方法可以进行编译,还有两种方法可以获取依赖项。你需要从每一组中挑选一个(所有4种组合都有意义),以提出一种综合方法。

<强>汇编

你可以:

  • 依次针对每个文件调用ghc -c,具体取决于.hs文件及其可传输的任何.hi文件,同时生成.hi.o文件。最后,根据所有ghc -o文件调用.o。对于实际代码see this example
  • 根据所有ghc --make文件,调用.hs一次。对于实际代码see this example

ghc --make的优势在于它比ghc -c的多次调用更快,因为GHC只能加载每个.hi文件一次,而不是每个命令一次。通常加速是3倍。缺点是并行性更难(您可以使用-jghc --make,但Shake仍假设每个操作都占用一个CPU),并且两个ghc --make编译不能同时运行时间,如果它们在任何依赖关系上重叠。

<强>依赖关系

你可以:

  • 解析Haskell文件以递归方式查找依赖项。要解析文件,您可以按照编码约定查找import语句(可能还有#include语句),或者使用haskell-src-exts之类的库。对于具有非常近似import解析器see this example的实际代码。
  • OR 使用ghc -M的输出来检测依赖关系,可以使用Shake辅助函数parseMakefile对其进行解析。对于实际代码see this example

解析Haskell文件的优点是可以生成Haskell文件,并且可以更快。使用ghc -M的优点是更容易支持所有GHC功能。