2013-10-23 38 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可以注意到這一點。