Cabal on NFS

Note to myself, like most other things in this site:

Suppose your home directory is on NFS or some such. Now suppose you’re sharing your ~/.cabal files with several machines across the network. Some of them are x86, some are x86\_64, etc. All of them are running the same version of RHEL or some such.

When this is the case, and when you hop from terminal to terminal, Cabal won’t be happy with the default configuration; and your finely tuned XMonad will break. You certainly don’t want to nuke your ~/.cabal and ~/.ghc and rebuild everything every time you use a different computer.

I asked the friendly folks in #haskell (this was a while ago, so memory lapses are all mine), and was pleased to learn that there is indeed a solution to this particular nerd-world problem: change the ~/.cabal/config slightly, like so:

install-dirs user
  prefix: /home/sajith/.cabal/$arch
  bindir: $prefix/bin
  libdir: $prefix/lib
  libsubdir: $pkgid/$compiler
  libexecdir: $prefix/libexec
  datadir: $prefix/share
  datasubdir: $pkgid
  docdir: $datadir/doc/$pkgid
  htmldir: $docdir/html
  haddockdir: $htmldir

Adding $arch to prefix does the trick. I suppose you can also use $os and $compiler if you’re the kind of person that runs twelve different versions of GHC on your Amiga-based NetBSD Beowulf cluster.

If you want to find these variables quickly, do a cabal help install or see Cabal docs.

If you use a non-hipster shell, adding this to ~/.profile might be useful:

if [ -d $HOME/.cabal/$(uname -m)/bin ]; then
    PATH=$HOME/.cabal/$(uname -m)/bin:$PATH
fi

export PATH

(On Debian, “uname -i” and “uname -p” prints “unknown”, because, to cite uname documentation, “the kernel does not make this information easily available, as is the case with Linux kernels”. Hey Linux kernel on Debian, behave yourself.)

(Posted on May 13, 2014.)