2013-10-23 15 views
3

我有一对夫妇的那需要相当一段时间来编译(独立)的文件,所以我想我会尝试并行编译,每唐·斯图尔特的回答here如何使用“使”与GHC依存产生

我跟着方向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文件” 的存在。)

我的问题是:如何使快速编译依赖于任何自动根依赖(这样作将并行实际运行)?我试图在'quickbuild'的依赖列表中添加'MyProg.o',但'make'(正确)抱怨说没有规则来构建'B.hi'。

+0

很显然,我试图避免构建语句,每一个文件,这将是烦人在最好的。我不认为这就是唐的意图,但我不清楚应该怎么做。 – crockeea

+0

你是否可以为'* .hi'文件制作一个伪规则(或其他任何调用它)?? –

+0

您是否建议增加:'B.hi:B.o \ n \ t ghc B'?然后我需要为所有40个模块做到这一点。你的意思是别的吗? – crockeea

回答

1

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

ghc-parmake和问题,especially this one - GHC有一个非常复杂的重新编译检查,你不能用Makefile文件复制(它可以检测例如,如果你自己的项目更改之外的包文件)。

你也不会从并行make -j接收大提速(在实践中并不> 2)并行运行多个GHCs,因为发射多GHCs具有通过ghc --make避免高启动开销。特别是,每个新的GHC调用都必须解析并检查所有正在编译的模块的所有依赖关系中涉及的接口文件; ghc --make缓存它们。

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

这将是比你手动编写的Makefile更可靠,更省力,做recompilation avoidance优于使能与它的文件时间戳做。


在第一个视图上,这听起来像是哈斯克尔的一个缺点,但事实上并非如此。在使用make进行构建的其他语言中,例如C++,不可能注意到项目之外的文件发生更改;在编译器本身有一个编译系统,如ghc --make可以注意到这一点。