我有一个Haskell程序,我想用GHC编译,由Shake构建系统编排。我应该执行哪些命令,以及在什么情况下应该重新运行?
答案 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倍。缺点是并行性更难(您可以使用-j
到ghc --make
,但Shake仍假设每个操作都占用一个CPU),并且两个ghc --make
编译不能同时运行时间,如果它们在任何依赖关系上重叠。
<强>依赖关系强>
你可以:
import
语句(可能还有#include
语句),或者使用haskell-src-exts
之类的库。对于具有非常近似import
解析器see this example的实际代码。ghc -M
的输出来检测依赖关系,可以使用Shake辅助函数parseMakefile
对其进行解析。对于实际代码see this example。解析Haskell文件的优点是可以生成Haskell文件,并且可以更快。使用ghc -M
的优点是更容易支持所有GHC功能。