我如何使用 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 倍。缺点是并行性更难(你可以使用 -j
到 ghc --make
,但 Shake 仍然假设每个动作消耗一个 CPU),并且两个 ghc --make
编译不能同时进行运行 如果它们在任何依赖项上重叠,则同时进行。
依赖项
您可以:
- 解析 Haskell 文件以递归查找依赖项。要解析文件,您可以按照编码约定查找
import
语句(可能还有 #include
语句),或者使用诸如 haskell-src-exts
[=67= 之类的库].对于具有非常近似 import
解析器的实际代码 see this example.
- OR使用
ghc -M
的输出检测依赖关系,可以使用Shake辅助函数parseMakefile
. For actual code see this example. 解析
解析 Haskell 文件的优点是可以生成 Haskell 文件并且速度更快。使用 ghc -M
的好处是更容易支持所有 GHC 功能。
我有一个 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 倍。缺点是并行性更难(你可以使用 -j
到 ghc --make
,但 Shake 仍然假设每个动作消耗一个 CPU),并且两个 ghc --make
编译不能同时进行运行 如果它们在任何依赖项上重叠,则同时进行。
依赖项
您可以:
- 解析 Haskell 文件以递归查找依赖项。要解析文件,您可以按照编码约定查找
import
语句(可能还有#include
语句),或者使用诸如haskell-src-exts
[=67= 之类的库].对于具有非常近似import
解析器的实际代码 see this example. - OR使用
ghc -M
的输出检测依赖关系,可以使用Shake辅助函数parseMakefile
. For actual code see this example. 解析
解析 Haskell 文件的优点是可以生成 Haskell 文件并且速度更快。使用 ghc -M
的好处是更容易支持所有 GHC 功能。