Cabal no instala dependencias cuando necesita bibliotecas de perfiles?


Quiero compilar mi programa con perfiles, así que corro:

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

Entonces, el problema es que, a diferencia del comportamiento habitual de bienvenida de cabal, cabal no resuelve las dependencias ni las instala cuando necesita bibliotecas de perfiles.

Puedo solucionarlo resolviendo las dependencias manualmente (siguiendo los errores que aparecen después de un tiempo de compilación):

$ 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

Y luego repite para mi siguiente dependencia..

¿Hay una mejor manera de hacer esto? es decir, hacer que la cábala haga el ¿trabaja por su cuenta como lo hace para bibliotecas normales?

Author: yairchu, 2009-11-10

5 answers

He habilitado library-profiling: True en mi archivo ~/.cabal/config. A partir de ese momento, cualquier nueva instalación habilitará automáticamente la creación de perfiles.

Desafortunadamente eso todavía significa que tuve que reinstalar manualmente para los paquetes antiguos ya instalados. Aunque, después de un tiempo de hacer esto manualmente, ahora tengo la mayoría de los paquetes reinstalados con la creación de perfiles habilitada...

 45
Author: Tom Lokhorst,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-10 17:41:02

De un comentario de Tom Lokhorst:

Espero que alguien venga con una mejor respuesta, una que no me requiera reinstalar la plataforma completa de Haskell manualmente la próxima vez.

Para futuros visitantes:

La tarea de instalar versiones de perfiles de todas las bibliotecas instaladas se ha convertido en una tarea menor, cabal (cabal-install) ahora realiza un seguimiento de lo que se instaló usándolo en el archivo world en el directorio .cabal (en linux, que sería $HOME/.cabal, en Windows algo como C:\Users\%YOU%\AppData\Roaming\cabal\, en OSX ??).

Así que después de habilitar la creación de perfiles en el archivo config (en el mismo directorio), y limpiar la base de datos de paquetes de GHC (puede encontrar las ubicaciones de la base de datos global y de usuario por ghc-pkg list nonexisting; elimine los paquetes instalados en cabal de la base de datos global con ghc-pkg unregister packagename si tiene alguno, cambie el nombre o elimine toda la base de datos de usuario-esto es necesario porque el archivo world solo rastrea los paquetes instalados explícitamente, no sus dependencias), instalando todo con el apoyo debe funcionar de la siguiente manera:

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

Primero ejecute --dry-run para comprobar si hay problemas antes de reinstalar nada. Si reinstala paquetes de arranque como process o directory, eso es una mala señal, si no sabe cómo manejarlo, pregunte en el canal de IRC #haskell, una de las listas de correo, o aquí para obtener orientación. Si no encuentra un plan de instalación coherente debido a nuevas versiones en hackage de algunos paquetes que son incompatibles entre sí, que generalmente puede ser solucionado editando el archivo world y restringiendo las versiones permitidas de algunos paquetes.

Entonces, si eres optimista de que nada se romperá mal, {[17]]}

$ cabal install --reinstall world

Y tomar un buen té mientras GHC está ocupado compilando.

 30
Author: Daniel Fischer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-23 17:33:31

La respuesta de Daniel Fischer se ve bien, pero por alguna razón mi ~/.la biblioteca cabal / world solo contenía entradas para bibliotecas instaladas directamente, y no para sus dependencias.

En su lugar, descargué una lista de todas las bibliotecas instaladas usando

$ ghc-pkg list > list

Esto enumera las bibliotecas instaladas en todo el sistema y localmente. Por lo tanto, edité el archivo list para eliminar la primera parte (que contiene bibliotecas instaladas en todo el sistema) dejando solo las líneas después de /home/<user>/.ghc/.... Finalmente, corrí

$ cabal install --reinstall $(cat list) 

Esto funcionó para mí. Tal vez deberías hacer --dry-run primero. Entonces ve a hacer una taza de té. O hornear un pastel.

 14
Author: Ben Blackburne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-01 12:24:45
 4
Author: Gerold Meisinger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-21 20:32:19

Para visitantes 2016+: Simplemente instale ghc-prof

Sistemas Debian Linux:

sudo apt-get install ghc-prof

Arch Sistemas Linux:

sudo pacman -S ghc-prof

 0
Author: Ford O.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-11 16:16:13