2009-11-09 76 views
43

我想編譯我的程序與剖析,所以我跑:Cabal在需要分析庫時不安裝依賴關係?

$ cabal configure --enable-executable-profiling 
... 
$ cabal build 
... 
    Could not find module 'Graphics.UI.GLUT': 
     Perhaps you havent installed the profiling libraries for package 'GLUT-2.2.2.0'? 
... 
$ # indeed I have not installed the prof libs for GLUT, so.. 
$ cabal install -p GLUT --reinstall 
... 
    Could not find module 'Graphics.Rendering.OpenGL': 
     Perhaps you havent installed the profiling libraries for package 'OpenGL-2.4.0.1'? 
... 

那麼,問題是,不像小集團的一貫歡迎的行爲,陰謀沒有解決依賴和需要譜庫時安裝它們。

我可以解決它通過手動解決依賴性(通過以下在編譯後出現錯誤):

$ cabal install -p OpenGLRaw --reinstall 
$ cabal install -p StateVar --reinstall 
$ cabal install -p Tensor --reinstall 
$ cabal install -p ObjectName --reinstall 
$ cabal install -p GLURaw --reinstall 
$ cabal install -p OpenGL --reinstall 
$ cabal install -p GLUT --reinstall 

然後再重複我的下一依賴性..

是否有更好的方法來做到這一點?即是否讓cabal自己的工作與正常的圖書館一樣?

+9

我已經啓用'庫profilin的g:True'在我的'〜/ .cabal/config'文件中。從此,任何新的安裝都將自動啓用分析。不幸的是,這仍然意味着我不得不爲已安裝的舊軟件包手動重新安裝。雖然,經過一段時間手動完成此操作,我現在已經將大部分軟件包重新安裝並啓用了分析... – 2009-11-09 23:48:43

+0

@Tom Lokhorst:謝謝。而且,這似乎是最好的/唯一的答案。所以,如果你願意,你可以把它作爲答案,所以我可以接受它 – yairchu 2009-11-10 15:06:15

+0

嗯,說不的免費upvotes是不禮貌的:-)但是,我希望有人會得到一個更好的答案,一個不會要求我下次手動重新安裝完整的Haskell平臺。 – 2009-11-10 17:43:39

回答

45

我已在我的~/.cabal/config文件中啓用library-profiling: True。從此,任何新的安裝都將自動啓用分析。

不幸的是,這仍然意味着我不得不爲已安裝的舊軟件包手動重新安裝。雖然,一會兒手動這樣做之後,我現在有啓用剖析重新安裝大多數包...

+7

我想這對許多人來說是熟悉的例程。如果只有一個命令可以自動完成這項艱鉅的任務,例如'cabal重新安裝 - 所有 - 使用庫分析功能'。 – 2013-07-17 17:47:55

+0

是否真的需要重新編譯所有庫以便分析我的應用程序?在完全優化的版本(沒有剖析內部代碼)和性能分析之間,沒有辦法更快地切換嗎? – 2014-01-28 13:59:46

+3

經過數週的重新安裝後,我建議你在完成上述更新到'〜/ .cabal/config'後完全卸載所有內容。有幾種方法可以做到這一點。一個是'rm -rf〜/ .ghc' – RussellStewart 2014-10-24 20:53:34

30

由湯姆Lokhorst評論:

我確實希望有人會提出一個更好的答案,一個不需要我下次手動重新安裝完整的Haskell平臺的人。

對於未來的用戶:

安裝所有已安裝的庫紋版本的任務已經變得不那麼煩瑣,cabal (cabal-install)現在跟蹤的內容是在world文件中.cabal目錄使用它安裝(在Linux上,這將是$HOME/.cabal,在Windows上類似C:\Users\%YOU%\AppData\Roaming\cabal\,在OSX ??)。

所以在config文件啓用分析(在同一目錄),並清除GHC的軟件包數據庫後(你可以找到每ghc-pkg list nonexisting的全局和用戶數據庫的位置;從全局數據庫中刪除小集團安裝的軟件包ghc-pkg unregister packagename如果您有任何,重命名或刪除整個用戶數據庫 - 這是必要的,因爲world文件只跟蹤明確安裝的軟件包,而不是它們的依賴),以分析支持應該工作如下安裝的一切:

$ cabal install --reinstall world --dry-run 

第一用--dry-run運行,在實際重新安裝之前檢查問題處理任何事情如果它將重新安裝像processdirectory這樣的引導軟件包,那麼這是一個不好的跡象,如果您不知道如何處理它,請在#haskell IRC頻道上詢問一個郵件列表,或者在這裏尋求指導。如果由於hackage上某些不兼容的軟件包的新版本而無法找到一致的安裝計劃,通常可以通過編輯world文件和限制某些軟件包的允許版本來解決。

然後,如果你是樂觀的,沒有什麼會嚴重打破,

$ cabal install --reinstall world 

和茶一壺好茶,而GHC忙編譯。

+0

如果在配置中設置爲「True」,這實際上是否會啓用分析?當我做一個 - 重新安裝現有的軟件包時,它似乎需要-p標誌 – jberryman 2012-07-23 14:07:51

+2

我剛剛嘗試過'cabal install --reinstall world'確實重新啓用了分析功能。是否在配置文件中註釋了'library-profiling:True'行? – 2012-07-23 15:06:15

+6

嘿,謝謝。我正在讀'--'作爲命令行標誌而不是評論。哎呀! – jberryman 2012-07-23 16:19:42

13

Daniel Fischer的回答看起來不錯,但由於某種原因,我的〜/ .cabal/world庫只包含直接安裝庫的條目,而不包含它們的依賴關係。

相反,我甩了所有已安裝的庫列表使用

$ ghc-pkg list > list 

這將列出安裝庫的全系統並在本地。因此,我編輯了list文件以刪除第一部分(包含系統範圍內安裝的庫),只留下/home/<user>/.ghc/...之後的行。最後,我跑

$ cabal install --reinstall $(cat list) 

這對我有效。你應該先做--dry-run。然後去沏一壺茶。或烤一塊蛋糕。

+1

根據Daniel的上述回答,世界文件只能包含直接安裝的軟件包。我認爲這個想法是,cabal會爲你解決依賴關係,並且他們可能會隨着時間而改變。 – ntc2 2013-09-23 23:01:22

+0

這裏還有一些其他有用的評論: https://github.com/haskell/cabal/issues/275 – Tad 2013-12-05 02:26:58

0

對遊客2016+:只要安裝ghc-prof

Debian的Linux系統:

sudo apt-get install ghc-prof

Arch Linux的系統:

sudo pacman -S ghc-prof