我如何使用 Shake 编译 Haskell 个程序

How do I compile Haskell programs using Shake

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

有两种编译方法和两种获取依赖项的方法。您需要从每组中选择一个(所有 4 种组合都有意义),以提出一种组合方法。

编译

您可以:

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

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

依赖项

您可以:

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