我有一个 Haskell 程序,我想用 GHC 编译,由 Shake 构建系统编排。我应该执行哪些命令,在什么情况下应该重新运行它们?
问问题
313 次
1 回答
10
有两种编译方法和两种获取依赖项的方法。您需要从每组中选择一个(所有 4 种组合都有意义),以提出一种组合方法。
汇编
您可以:
- 依次调用
ghc -c
每个文件,具体取决于.hs
文件及其传递导入的任何.hi
文件,生成 a.hi
和.o
file。最后,ghc -o
根据所有.o
文件调用。有关实际代码,请参见此示例。 - 或调用
ghc --make
一次,具体取决于所有.hs
文件。有关实际代码,请参见此示例。
的优点ghc --make
是它比多次调用更快,ghc -c
因为 GHC 只能加载每个.hi
文件一次,而不是每个命令一次。通常加速是 3 倍。缺点是并行性更难(您可以使用-j
to 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 回答