2009-11-09 28 views
43

Tôi muốn biên dịch chương trình của tôi với hồ sơ, vì vậy tôi chạy:Cabal không cài đặt các phụ thuộc khi cần thư viện lược tả?

$ 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'? 
... 

Vì vậy, vấn đề là, rằng không giống như hành vi chào đón thông thường cabal của, cabal không giải quyết được sự phụ thuộc và cài đặt chúng khi cần thư viện profiling.

tôi có thể làm việc xung quanh nó bằng cách giải quyết các phụ thuộc bằng tay (do lỗi xuất hiện sau một thời gian biên soạn sau đây):

$ 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 

Và sau đó lặp lại cho sự phụ thuộc tiếp theo của tôi ..

Có cách tốt hơn để làm điều này? tức là làm cho cabal tự làm công việc như đối với các thư viện thông thường?

+9

Tôi đã kích hoạt ' thư viện-profilin g: True' trong tập tin '~/.cabal/config' của tôi. Từ đó trở đi, mọi cài đặt mới sẽ tự động bật tính năng định cấu hình. Thật không may đó vẫn có nghĩa là tôi đã phải tự cài đặt lại cho các gói cũ đã được cài đặt. Mặc dù, sau một thời gian làm điều này bằng tay, tôi _now_ có hầu hết các gói cài đặt lại với hồ sơ được kích hoạt ... –

+0

@Tom Lokhorst: Cảm ơn. Ngoài ra, điều này có vẻ là câu trả lời tốt nhất/duy nhất. Vì vậy, nếu bạn muốn, bạn có thể đặt nó xuống như một câu trả lời để tôi có thể chấp nhận nó – yairchu

+0

Vâng, nó là bất lịch sự để nói không để upvotes miễn phí :-) Tuy nhiên, tôi hy vọng ai đó sẽ đi cùng với một câu trả lời tốt hơn, một trong đó sẽ không yêu cầu tôi phải cài đặt lại Nền tảng Haskell hoàn chỉnh theo cách thủ công lần sau. –

Trả lời

45

Tôi đã bật library-profiling: True trong tệp ~/.cabal/config của mình. Từ đó trở đi, mọi cài đặt mới sẽ tự động bật tính năng định cấu hình.

Thật không may điều đó vẫn có nghĩa là tôi phải cài đặt lại thủ công các gói cũ đã được cài đặt. Mặc dù, sau một thời gian để làm điều này bằng tay, tôi tại có hầu hết các gói cài đặt lại với hồ sơ kích hoạt ...

+7

Tôi tưởng tượng đây là một thói quen quen thuộc đối với nhiều người. Nếu chỉ có một lệnh để tự động hóa tác vụ khác mất thời gian này, ví dụ: 'cabal reinstall-all --with-library-profiling-enabled'. –

+0

Có thực sự cần biên dịch lại tất cả các thư viện chỉ để cấu hình ứng dụng của tôi không? Không có cách nào để chuyển đổi nhanh hơn giữa phiên bản được tối ưu hóa hoàn toàn (không có mã hồ sơ bên trong) và tạo hồ sơ? –

+3

Sau nhiều tuần gỡ cài đặt, tôi khuyên bạn nên gỡ cài đặt hoàn toàn mọi thứ sau khi thực hiện cập nhật ở trên cho '~/.cabal/config'. Có một số cách để làm điều này. Một là 'rm -rf ~/.ghc' – RussellStewart

30

Từ một lời nhận xét của Tom Lokhorst:

Tôi hy vọng một người nào đó sẽ đến cùng với câu trả lời hay hơn, một câu hỏi sẽ không yêu cầu tôi phải cài đặt lại Nền tảng Haskell hoàn chỉnh theo cách thủ công trong lần tiếp theo.

Đối với du khách trong tương lai:

Nhiệm vụ của việc cài đặt các phiên bản profiling của tất cả các thư viện cài đặt đã trở nên ít của một việc vặt, cabal (cabal-install) tại theo dõi những gì đã được cài đặt sử dụng nó trong các world tập tin trong thư mục .cabal (trên linux, có thể là $HOME/.cabal, trên Windows giống như C:\Users\%YOU%\AppData\Roaming\cabal\, trên OSX ??). Vì vậy, sau khi kích hoạt hồ sơ trong tập tin config (trong cùng một thư mục), và xóa cơ sở dữ liệu gói của GHC (bạn có thể tìm thấy các vị trí của db toàn cục và người dùng trên ghc-pkg list nonexisting; ghc-pkg unregister packagename nếu bạn có bất kỳ, đổi tên hoặc xóa toàn bộ db người dùng - điều này là cần thiết vì các tập tin world chỉ theo dõi các gói cài đặt một cách rõ ràng, chứ không phải phụ thuộc của họ), lắp đặt tất cả mọi thứ với profiling hỗ trợ nên làm việc như sau:

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

Đầu tiên chạy với --dry-run để kiểm tra các sự cố trước khi thực sự khôi phục ling bất cứ điều gì. Nếu nó sẽ cài đặt lại gói khởi động như process hoặc directory, đó là dấu hiệu xấu, nếu bạn không biết cách xử lý, hãy hỏi kênh #haskell IRC, một trong các danh sách gửi thư hoặc tại đây để được hướng dẫn. Nếu không tìm được gói cài đặt nhất quán do các phiên bản mới trên hackage của một số gói không tương thích với nhau, thường có thể được giải quyết bằng cách chỉnh sửa tệp world và hạn chế các phiên bản cho phép của một số gói.

Sau đó, nếu bạn đang lạc quan rằng không có gì xấu sẽ phá vỡ,

$ cabal install --reinstall world 

và có một nồi tốt đẹp của trà trong khi GHC đang bận biên soạn.

+0

liệu điều này có thực sự cho phép lược tả nếu được đặt thành' True' trong cấu hình không? Khi tôi thực hiện - cài đặt lại các gói hiện có, có vẻ như yêu cầu cờ -p – jberryman

+2

Tôi vừa thử, 'cabal install --reinstall world' đã cài đặt lại với tính năng định cấu hình được bật. Là dòng 'thư viện-profiling: True' perchance nhận xét trong tập tin cấu hình? –

+6

heh, cảm ơn. Tôi đã đọc '--' như một cờ dòng lệnh không bình luận. OOOPS! – jberryman

13

Câu trả lời của Daniel Fischer có vẻ tốt, nhưng vì lý do nào đó thư viện ~/.cabal/world của tôi chỉ chứa các mục cho thư viện được cài đặt trực tiếp chứ không phải phụ thuộc của chúng.

Thay vào đó, tôi đổ ra một danh sách tất cả các thư viện cài đặt bằng

$ ghc-pkg list > list 

này liệt kê các thư viện cài đặt toàn hệ thống và cục bộ. Do đó, tôi đã chỉnh sửa tệp list để xóa phần đầu tiên (chứa các thư viện được cài đặt trên toàn hệ thống) chỉ để lại các dòng sau /home/<user>/.ghc/.... Cuối cùng, tôi đã chạy

$ cabal install --reinstall $(cat list) 

Điều này phù hợp với tôi. Bạn có thể làm --dry-run trước tiên. Sau đó đi làm một nồi trà. Hoặc nướng bánh.

+1

Theo câu trả lời của Daniel ở trên, tập tin trên thế giới chỉ được chứa các gói được cài đặt trực tiếp. Tôi nghĩ ý tưởng là cabal sẽ giải quyết các phụ thuộc cho bạn, và chúng có thể thay đổi theo thời gian. – ntc2

+0

Có một số nhận xét hữu ích bổ sung tại đây: https://github.com/haskell/cabal/issues/275 – Tad

0

Đối với khách 2016+: Chỉ cần cài đặt ghc-prof Systems

Debian Linux:

Systems

sudo apt-get install ghc-prof

Arch Linux:

sudo pacman -S ghc-prof

Các vấn đề liên quan