2009-11-09 7 views
43

quiero compilar mi programa con perfiles, por lo que corren:¿Cabal no instala dependencias cuando necesita bibliotecas de creación de perfiles?

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

Por lo tanto, el problema es que, a diferencia de comportamiento de bienvenida habitual de cábala, cábala no resuelve las dependencias e instalarlas cuando se necesitan bibliotecas de perfiles.

puedo evitar que al resolver 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 repetir para mi próximo dependencia ..

¿Existe una mejor manera de hacer esto? Es decir, ¿hace que él haga el trabajo por sí mismo como lo hace con las bibliotecas normales?

+9

He activado ' biblioteca-profilin g: True' en mi archivo '~/.cabal/config'. A partir de ese momento, cualquier instalación nueva habilitará automáticamente el perfil. Lamentablemente, eso significa que tuve que volver a instalar manualmente los paquetes antiguos que ya estaban instalados. Aunque, después de un tiempo de hacerlo manualmente, tengo la mayoría de los paquetes reinstalados con el perfil habilitado ... –

+0

@Tom Lokhorst: Gracias. Además, esta parece ser la mejor/única respuesta. Entonces, si lo desea, puede dejarlo como una respuesta para que pueda aceptarlo – yairchu

+0

Bueno, es de mala educación decir que no a los votos libres :-) Sin embargo, sí espero que alguien presente una mejor respuesta, una respuesta que no requiere que reinstale la plataforma Haskell completa manualmente la próxima vez. –

Respuesta

45

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

Lamentablemente, eso significa que tuve que volver a instalar manualmente los paquetes anteriores que ya estaban instalados. Aunque, después de un tiempo de hacer esto manualmente, que ahora tienen la mayoría de los paquetes reinstalados con seguimiento permitido ...

+7

Me imagino que esta es una rutina familiar para muchas personas. Si solo hubiera un comando para automatizar esta tarea, por lo demás laboriosa, p. 'cabal reinstall-all --with-library-profiling-enabled'. –

+0

¿Realmente es necesario recompilar todas las bibliotecas solo para perfilar mi aplicación? ¿No hay una manera de cambiar más rápido entre la versión completamente optimizada (sin código de creación de perfiles dentro) y la creación de perfiles? –

+3

Después de semanas de reinstalaciones frustrantes, le sugiero que desinstale completamente todo después de realizar la actualización anterior a su '~/.cabal/config'. Hay algunas maneras de hacer esto. Uno de ellos es 'rm -rf ~/.ghc' – RussellStewart

30

De un comentario de Tom Lokhorst:

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

para futuros visitantes:

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

Así que después de activar perfiles en el archivo config (en el mismo directorio), y la limpieza de base de paquetes de GHC (se puede encontrar la ubicación de la base de datos global y usuario por ghc-pkg list nonexisting; eliminar los paquetes Cabal-instalado de la base de datos global ghc-pkg unregister packagename si tiene alguno, renombrar o borrar toda la base de datos de usuario - esto es necesario porque el archivo world sólo controla los paquetes instalados de forma explícita, no sus dependencias), la instalación de todo con perfiles de apoyo debería funcionar de la siguiente manera:

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

Primera ejecutar con --dry-run para verificar si hay problemas antes de volver a instalar ling cualquier cosa. Si reinstalaría paquetes de arranque como process o directory, eso es una mala señal, si no sabe cómo manejarlo, pregunte en el #haskell canal de IRC, una de las listas de correo, o aquí para obtener orientación. Si no puede encontrar un plan de instalación coherente debido a las nuevas versiones en hackage de algunos paquetes que son incompatibles entre sí, esto generalmente se puede resolver editando el archivo world y limitando las versiones permitidas de algunos paquetes.

Entonces, si usted es optimista de que nada va mal romper,

$ cabal install --reinstall world 

y tienen una buena taza de té mientras está ocupado GHC compilación.

+0

¿Esto realmente habilitará la creación de perfiles si se establece en' True' en config? Cuando hago un --reinstall de paquetes existentes, parece requerir el indicador -p – jberryman

+2

. Acabo de intentarlo, 'cabal install --reinstall world' se reinstaló con el perfil habilitado. Es la línea 'library-profiling: True' tal vez comentada en el archivo de configuración? –

+6

heh, gracias. Estaba leyendo '--' como un indicador de línea de comando sin comentarios. OOOPS! – jberryman

13

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

En cambio, me deshice de una lista de todas las bibliotecas instaladas usando

$ ghc-pkg list > list 

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

$ cabal install --reinstall $(cat list) 

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

+1

Según la respuesta de Daniel anterior, se supone que el archivo mundial solo contiene paquetes instalados directamente. Creo que la idea es que Cabal resolverá las dependencias por usted, y pueden cambiar con el tiempo. – ntc2

+0

Hay algunos comentarios útiles adicionales aquí: https://github.com/haskell/cabal/issues/275 – Tad

0

Para los visitantes 2016+: Sólo tiene que instalar sistemas ghc-prof

Debian Linux:

Sistemas

sudo apt-get install ghc-prof

Arch Linux:

sudo pacman -S ghc-prof

Cuestiones relacionadas