我有几个(独立的)文件需要相当长的时间来编译,所以我想我应该尝试并行编译,根据Don的答案这里。
我遵循这里的方向,所以我的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(注意:与医生们相反,GHC似乎默认为"makefile",而不是"Makefile“,即使存在"makefile”。)
我的问题是:如何使quickbuild依赖于任何自动生成依赖项(这样,make实际上将并行运行)?我试着将“MyProg.o”添加到“quickbuild”的依赖列表中,但是“make”(正确地)抱怨说,没有建立'B.hi‘的规则。
发布于 2014-02-28 10:56:05
我建议不要为此目的使用make。
看看ghc-parmake及其问题,尤其是这个 - GHC有一个非常复杂的重新编译检查器,您不能用Makefiles复制它(例如,它可以检测到包文件是否在您自己的项目更改之外)。
您也不会因为并行运行多个GHC而从并行make -j收到一个很大的加速比(实际上不会超过2),因为触发多个GHC具有很高的启动开销,这是ghc --make避免的。特别是,每次新的GHC调用都必须解析和键入正在编译的模块的所有依赖项中涉及的所有接口.hi文件;ghc --make缓存它们。
相反,使用新的ghc --make -j的GHC7.8-它是真正的平行。
它将比手工编写的Makefile更可靠,更少的工作量,并且比Make可以更好地使用它的文件时间戳完成重新编译避免。
在第一个视图中,这听起来像是Haskell的缺点,但实际上并非如此。在其他喜欢使用make进行构建的语言中,比如C++,不可能注意到项目之外的文件何时发生变化;在编译器中有一个像ghc --make这样的编译系统可以注意到这一点。
https://stackoverflow.com/questions/19545257
复制相似问题