não Cabal instalação de dependências quando precisar de bibliotecas de perfil?
Pergunta
Eu quero compilar meu programa com profiling, então eu executar:
$ 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'?
...
Então, o problema é, que o comportamento de boas-vindas habitual da cabala ao contrário, cabala não resolver as dependências e instalá-los quando precisar de bibliotecas de perfil.
Eu posso trabalhar em torno dele, resolvendo as dependências manualmente (seguindo erros que aparecem depois de um tempo de compilação):
$ 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
E, em seguida, repita para o meu próximo dependência ..
Existe uma maneira melhor de fazer isso? ou seja fazem Cabal fazer o trabalho por conta própria como faz para bibliotecas normais?
Solução
Eu habilitado library-profiling: True
no meu arquivo ~/.cabal/config
. A partir de então, quaisquer novas instalações permitirão automaticamente profiling.
Infelizmente isso ainda significa que eu tinha que reinstalar manualmente para os antigos pacotes já instalados. Embora, depois de um tempo de fazer isso manualmente, eu agora ter a maioria dos pacotes reinstalado com perfis ativada ...
Outras dicas
A partir de um comentário por Tom Lokhorst:
Eu espero que alguém vai vir junto com uma resposta melhor, que não exigiria me para reinstalar o Plataforma Haskell completa manualmente próxima vez.
Para os futuros visitantes:
A tarefa de instalar versões de perfis de todas as bibliotecas instaladas tornou-se menos de uma tarefa, cabal (cabal-install)
agora mantém o controle do que foi instalado usando-o no arquivo world
no diretório .cabal
(no Linux, que seria $HOME/.cabal
, no Windows algo como C:\Users\%YOU%\AppData\Roaming\cabal\
, em OSX ??).
Assim, após a ativação de perfis no arquivo config
(no mesmo diretório), e limpar banco de dados de pacotes do GHC (você pode encontrar os locais do db global e usuário por ghc-pkg list nonexisting
; remover os pacotes instalados-cabal do banco de dados global com ghc-pkg unregister packagename
se você tiver qualquer, renomear ou apagar toda a db usuário - isto é necessário porque o arquivo world
apenas as faixas pacotes explicitamente instaladas, não suas dependências), a instalação de tudo com perfil de suporte deve funcionar da seguinte forma:
$ cabal install --reinstall world --dry-run
Primeiro correr com --dry-run
para verificar problemas antes de realmente reinstalar qualquer coisa. Se fosse reinstalar pacotes de inicialização como process
ou directory
, isso é um mau sinal, se você não sabe como lidar com isso, pergunte no canal IRC #haskell
, uma das listas de discussão, ou aqui para orientação. Se não conseguir encontrar um consistente instalar plano devido a novas versões sobre hackage de alguns pacotes que são incompatíveis uns com os outros, que normalmente pode ser resolvido editando o arquivo world
e restringindo versões permitidas de alguns pacotes.
Então, se você está otimista de que nada vai mal quebrar,
$ cabal install --reinstall world
e ter um bom pote de chá enquanto GHC está ocupado compilação.
A resposta de Daniel Fischer parece ser bom, mas por alguma razão a minha biblioteca ~ / .cabal / mundo só continha entradas para bibliotecas instalado diretamente, e não suas dependências.
Em vez disso, eu despejei uma lista de todas as bibliotecas instaladas usando
$ ghc-pkg list > list
Isto lista as bibliotecas instaladas em todo o sistema e localmente. Portanto, eu editado o arquivo list
para remover a primeira parte (contendo bibliotecas instaladas em todo o sistema), deixando apenas as linhas após /home/<user>/.ghc/...
. Finalmente, eu corri
$ cabal install --reinstall $(cat list)
Isso funcionou para mim. Você deve talvez fazer --dry-run
primeiro. Então vá fazer um pote de chá. Ou fazer um bolo.
Para os visitantes 2016+: Basta instalar ghc-prof
Sistemas Linux Debian:
sudo apt-get install ghc-prof
Sistemas Linux Arch:
sudo pacman -S ghc-prof