7

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

4

1 回答 1

10

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

汇编

您可以:

  • 依次调用ghc -c每个文件,具体取决于.hs文件及其传递导入的任何.hi文件,生成 a.hi.ofile。最后,ghc -o根据所有.o文件调用。有关实际代码,请参见此示例
  • 调用ghc --make一次,具体取决于所有.hs文件。有关实际代码,请参见此示例

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

依赖项

您可以:

  • 解析 Haskell 文件以递归方式查找依赖项。要解析文件,您可以查找遵循编码约定的import语句(也可能是#include语句),或者使用诸如haskell-src-exts. 对于具有非常近似import解析器的实际代码,请参见此示例
  • 使用 的输出ghc -M来检测依赖关系,可以使用 Shake 辅助函数对其进行解析parseMakefile。有关实际代码,请参见此示例

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

于 2018-06-06T16:01:47.770 回答