gpt4 book ai didi

haskell - 如何将 'make' 与 GHC 依赖项生成一起使用

转载 作者:行者123 更新时间:2023-12-02 20:11:07 25 4
gpt4 key购买 nike

我有几个(独立的)文件需要相当长的时间来编译,所以我想我会尝试并行编译,根据 Don Stewart 的回答 here .

我按照指示 here 进行操作,所以我的 makefile 看起来像这样

quickbuild:
ghc --make MyProg.hs -o MyProg

depend:
ghc -M -dep-makefile makefile MyProg

# DO NOT DELETE: Beginning of Haskell dependencies
...
MyProg.o : MyProg.hs
MyProg.o : B.hi
MyProg.o : C.hi
...
# DO NOT DELETE: End of Haskell dependenciesghc

(注意:与 the docs 相反,GHC 似乎默认为“Makefile”而不是“makefile”,即使“makefile”存在。)

我的问题是:如何使快速构建依赖于任何自动生成依赖项(以便 make 实际上并行运行)?我尝试将“MyProg.o”添加到“quickbuild”的依赖项列表中,但是“make”(正确地)提示没有构建“B.hi”的规则。

最佳答案

我建议不要使用make出于这种目的。

看看ghc-parmake及其问题,especially this one - GHC 有一个非常复杂的重新编译检查器,您无法使用 Makefile 进行复制(它可以检测例如您自己项目之外的包文件是否发生更改)。

您也不会从并行 make -j 获得较大的加速(实际上不 > 2)用于并行运行多个 GHC,因为启动多个 GHC 具有较高的启动开销,ghc --make 可以避免这种情况。特别是,每个新的 GHC 调用都必须解析和类型检查所有接口(interface) .hi正在编译的模块的所有依赖项涉及的文件; ghc --make缓存它们。

相反,请使用新的 ghc --make -j GHC 7.8 - 它是真正的并行。

它会比你手动编写的 Makefile 更可靠、更省力,并且可以做 recompilation avoidance比 Make 更好地利用其文件时间戳。

<小时/>

乍一看,这听起来像是 Haskell 的一个缺点,但事实上并非如此。在其他喜欢使用 make 的语言中对于构建,例如 C++,不可能注意到项目外部的文件何时发生更改;编译器本身有一个构建系统,如 ghc --make允许注意到这一点。

关于haskell - 如何将 'make' 与 GHC 依赖项生成一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19545257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com