Cabal not installing dependencies when needing profiling libraries?

11,087

Solution 1

I've enabled library-profiling: True in my ~/.cabal/config file. From then on, any new installations will automatically enable profiling.

Unfortunately that still means I had to manually reinstall for the old packages already installed. Although, after a while of doing this manually, I now have most packages reinstalled with profiling enabled...

Solution 2

From a comment by Tom Lokhorst:

I do hope someone will come along with a better answer, one that would not require me to reinstall the complete Haskell Platform manually next time.

For future visitors:

The task of installing profiling versions of all installed libraries has become less of a chore, cabal (cabal-install) now keeps track of what was installed using it in the world file in the .cabal directory (on linux, that would be $HOME/.cabal, on Windows something like C:\Users\%YOU%\AppData\Roaming\cabal\, on OSX ??).

So after enabling profiling in the config file (in the same directory), and clearing GHC's package database (you can find the locations of the global and user db per ghc-pkg list nonexisting; remove the cabal-installed packages from the global database with ghc-pkg unregister packagename if you have any, rename or delete the entire user db - this is necessary because the world file only tracks explicitly installed packages, not their dependencies), installing everything with profiling support should work as follows:

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

First run with --dry-run to check for problems before actually reinstalling anything. If it would reinstall boot packages like process or directory, that's a bad sign, if you don't know how to handle it, ask on the #haskell IRC channel, one of the mailing lists, or here for guidance. If it fails to find a consistent install plan due to new versions on hackage of some packages which are incompatible with each other, that can usually be solved by editing the world file and constraining allowable versions of some packages.

Then, if you are optimistic that nothing will badly break,

$ cabal install --reinstall world

and have a nice pot of tea while GHC is busy compiling.

Solution 3

Daniel Fischer's answer looks good, but for some reason my ~/.cabal/world library only contained entries for libraries directly installed, and not their dependencies.

Instead, I dumped out a list of all installed libraries using

$ ghc-pkg list > list

This lists the libraries installed system-wide and locally. Therefore, I edited the list file to remove the first portion (containing libraries installed system-wide) leaving only the lines after /home/<user>/.ghc/.... Finally, I ran

$ cabal install --reinstall $(cat list) 

This worked for me. You should maybe do --dry-run first. Then go make a pot of tea. Or bake a cake.

Share:
11,087

Related videos on Youtube

yairchu
Author by

yairchu

dude

Updated on August 12, 2020

Comments

  • yairchu
    yairchu almost 4 years

    I want to compile my program with profiling, so I run:

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

    So, the problem is, that unlike cabal's usual welcome behavior, cabal doesn't resolve the dependencies and install them when needing profiling libraries.

    I can work around it by resolving the dependencies manually (by following errors that appear after a while of compiling):

    $ 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
    

    And then repeat for my next dependency..

    Is there a better way to do this? i.e do make cabal do the work on its own as it does for normal libraries?

    • Dave
      Dave over 14 years
      I've enabled library-profiling: True in my ~/.cabal/config file. From then on, any new installations will automatically enable profiling. Unfortunately that still means I had to manually reinstall for the old packages already installed. Although, after a while of doing this manually, I now have most packages reinstalled with profiling enabled...
    • yairchu
      yairchu over 14 years
      @Tom Lokhorst: Thanks. Also, this seems to be the best/only answer. So if you want, you can put it down as an answer so I can accept it
    • Dave
      Dave over 14 years
      Well, it's impolite to say no to free upvotes :-) However, I do hope someone will come along with a better answer, one that would not require me to reinstall the complete Haskell Platform manually next time.
    • Matthias Braun
      Matthias Braun about 5 years
      If you're on Stack and encountering this issue, this question and its answers might help you.
  • jberryman
    jberryman almost 12 years
    will this actually enable profiling if set to True in config? When I do a --reinstall of existing packages it seems to require the -p flag
  • Daniel Fischer
    Daniel Fischer almost 12 years
    I just tried, cabal install --reinstall world did reinstall with profiling enabled. Is the line library-profiling: True perchance commented out in the config file?
  • jberryman
    jberryman almost 12 years
    heh, thanks. I was reading the -- as a command-line flag not comment. OOOPS!
  • Rob Stewart
    Rob Stewart almost 11 years
    I imagine this a familiar routine for many people. If only there was a command to automate this otherwise laborious task e.g. cabal reinstall-all --with-library-profiling-enabled .
  • ntc2
    ntc2 almost 11 years
    According to Daniel's answer above, the world file is only supposed to contain directly installed packages. I think the idea is that cabal will resolve the dependencies for you, and they may change over time.
  • Tad
    Tad over 10 years
    There are some additional helpful comments here: github.com/haskell/cabal/issues/275
  • The_Ghost
    The_Ghost over 10 years
    Is it really needed recompiling of all libraries just to profile my application? Isn't there a way to switch faster between Fully optimized version (without profiling code inside) and Profiling one?
  • RussellStewart
    RussellStewart over 9 years
    After weeks of frustrating reinstalls, I suggest that you completely uninstall everything after making the above update to your ~/.cabal/config. There are a few ways to do this. One is rm -rf ~/.ghc
  • Ford O.
    Ford O. almost 8 years
    I have removed the db in ~usr/lib/ghc/package.conf.d and when I try to run cabal install --reinstall world and I get an error can't find a package database. Are you sure we need to delete the db?
  • Daniel Fischer
    Daniel Fischer almost 8 years
    @FordO. That looks like the global package database, the user db is typically under ~/.ghc/$GHC_Version. Only the user db can be deleted, removing the entire global package database breaks your GHC. If you have a backup of the package db, reinstate that, otherwise I'm afraid you'll need to reinstall GHC. From the global db, only packages installed with cabal should be unregistered.
  • Matthias Braun
    Matthias Braun about 5 years
    There's currently no package ghc-prof in the pacman repositories.