web-dev-qa-db-ja.com

プロファイリングライブラリが必要なときに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の通常のウェルカム動作とは異なり、cabalは依存関係を解決せず、プロファイリングライブラリが必要なときにそれらをインストールしないことです。

依存関係を手動で解決することで(コンパイルのしばらく後に表示されるエラーを追跡することで)、これを回避できます。

$ 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にそれ自体で作業を行わせるのですか?

44
yairchu

library-profiling: Trueファイルで~/.cabal/configを有効にしました。それ以降、新しいインストールでは自動的にプロファイリングが有効になります。

残念ながら、それでも、すでにインストールされている古いパッケージを手動で再インストールする必要がありました。ただし、これを手動でしばらく行った後、私はほとんどのパッケージをプロファイリングを有効にして再インストールしています...

45
Tom Lokhorst

Tom Lokhorstのコメントから:

誰かがより良い答えを持って来ることを願っています。次回、Haskellプラットフォーム全体を手動で再インストールする必要はありません。

将来の訪問者のために:

インストールされているすべてのライブラリのプロファイリングバージョンをインストールするタスクは面倒ではなくなり、cabal (cabal-install)は、.cabalディレクトリのworldファイルにそれを使用してインストールされたものを追跡するようになりました。 (Linuxでは$HOME/.cabal、WindowsではC:\Users\%YOU%\AppData\Roaming\cabal\、OSXでは??)。

したがって、(同じディレクトリ内の)configファイルでプロファイリングを有効にし、GHCのパッケージデータベースをクリアした後(ghc-pkg list nonexistingごとにグローバルデータベースとユーザーデータベースの場所を見つけることができます。cabalがインストールしたパッケージを削除します。 ghc-pkg unregister packagenameを使用してグローバルデータベースからユーザーデータベース全体の名前を変更または削除します-worldファイルは明示的にインストールされたパッケージのみを追跡し、依存関係は追跡しないため)、すべてをプロファイリングでインストールしますサポートは次のように機能するはずです。

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

実際に何かを再インストールする前に、まず--dry-runで実行して、問題をチェックします。 processdirectoryのようなブートパッケージを再インストールする場合、それは悪い兆候です。処理方法がわからない場合は、#haskell IRCチャネル、メーリングリストの1つ、またはガイダンスについてはこちら。相互に互換性のない一部のパッケージの hackage の新しいバージョンが原因で、一貫したインストールプランが見つからない場合は、これは通常、worldファイルを編集し、一部のパッケージの許容バージョンを制限することで解決できます。

次に、何もひどく壊れないことを楽観視している場合は、

$ cabal install --reinstall world

gHCがコンパイルに忙しい間、素敵なお茶を飲みましょう。

30
Daniel Fischer

Daniel Fischerの答えは良さそうですが、何らかの理由で、私の〜/ .cabal/worldライブラリには、直接インストールされたライブラリのエントリのみが含まれ、依存関係は含まれていませんでした。

代わりに、を使用してインストールされているすべてのライブラリのリストをダンプしました

$ ghc-pkg list > list

これにより、システム全体およびローカルにインストールされたライブラリが一覧表示されます。したがって、listファイルを編集して、最初の部分(システム全体にインストールされたライブラリを含む)を削除し、/home/<user>/.ghc/...の後の行のみを残しました。最後に、私は走った

$ cabal install --reinstall $(cat list) 

これは私のために働いた。最初に--dry-runを実行する必要があります。それからお茶を入れに行きます。またはケーキを焼く。

16
Ben Blackburne
4

2016年以降の訪問者の場合:ghc-profをインストールするだけです

Debian Linuxシステム:

Sudo apt-get install ghc-prof

Arch Linuxシステム:

Sudo pacman -S ghc-prof

0
Ford O.