[Nix-dev] How to set up your Haskell environment (was: Help with ghc errors after nix-channel --update)

Peter Simons simons at cryp.to
Tue Dec 16 14:17:59 CET 2014


Hi Carlo,

 > for completeness, could you post a version in which this approach is
 > used in conjunction with ghcWithPackages?

first of all, your ~/.bashrc should contain these settings:

 | NIX_GHC_VERSION=$(ghc --numeric-version)
 | export NIX_GHC="$HOME/.nix-profile/bin/ghc"
 | export NIX_GHCPKG="$HOME/.nix-profile/bin/ghc-pkg"
 | export NIX_GHC_DOCDIR="$HOME/.nix-profile/share/doc/ghc/html"
 | export NIX_GHC_LIBDIR="$HOME/.nix-profile/lib/ghc-${NIX_GHC_VERSION}"

People who use more than one profile and who don't want to commit to a
single location for their active Haskell environment can use the
following instead:

 | NIX_GHC=$(type -p ghc)
 | if [ -n "$NIX_GHC" ]; then
 |   eval $(grep export "$NIX_GHC")
 | fi

The advantage of the first snippet is that you don't need to re-source
your ~/.bashrc after an nix-env update. The advantage of the second
snippet is that these variables will point directly into the /nix store,
so it doesn't matter what the exact path of your profile is.

Now, here is the setup of the Haskell environment:

 | # ~/.nixpkgs/config.nix
 |
 | {
 |   packageOverrides = super: let self = super.pkgs; in
 |   {
 |     haskellDevEnv = self.haskellPackages.ghcWithPackages (p: with p; [
 |       async attoparsec caseInsensitive fgl GLUT GLURaw haskellSrc
 |       hashable html HTTP HUnit mtl network OpenGL OpenGLRaw parallel
 |       parsec QuickCheck random regexBase regexCompat regexPosix split stm
 |       syb text transformers unorderedContainers vector /*xhtml*/ zlib
 |       # tools
 |       cabalInstall
 |       ghcMod
 |       xmonad xmonadContrib xmonadExtras xmobar
 |       haskintex
 |     ]);
 |
 |     haskellPackages = super.haskellPackages.override {
 |       extension = self: super: {
 |         abcnotation = self.callPackage ./abcnotation.nix {};
 |         prettify = self.callPackage ./prettify.nix {};
 |       };
 |     };
 |   };
 | }

The first stanza defines a derivation that contains GHC plus all those
listed libraries. (Note that because of a bug in GHC 7.8.3 the 'xhtml'
package cannot be included into such a generated environment, so the
package is commented out.) To include this derivation into your user
profile, run "nix-env -iA haskellDevEnv". The argument to
haskellPackages.ghcWithPackages is a function that takes the Haskell
package set as an argument and returns a list of packages to be merged
into one derivation. Taking the package set as an argument allows the
list of libraries to be agnostic of the compiler version you're using.
For example:

  haskellPackages_ghc704.ghcWithPackages (p: [p.mtl]);
  haskellPackages_ghc783.ghcWithPackages (p: [p.mtl]);

Both derivations give you an environment with GHC plus the 'mtl' library,
but one is based on GHC 7.0.4 and the other is based on GHC 7.8.3.

The second stanza extends the standard Haskell package set from Nixpkgs
with two locally defined packages that were created by running:

 $ cabal2nix cabal://prettify >~/.nixpkgs/prettify.nix
 $ cabal2nix cabal://abcnotation >~/.nixpkgs/abcnotation.nix

These packages are available like any other Nixpkgs Haskell library and
can be used in combination with ghcWithPackages.

Best regards,
Peter



More information about the nix-dev mailing list