This is a brief and bare-bones guide to getting GHC 7.2 and the cabal-install
tool (the two basic things you'll need to do Haskell development) up and running
on a new Mac OS X 10.7 install.
The instructions given here worked for me, but YMMV.
Downloading and installing GHC 7.2.1 for x86_64 (Darwin) is straightforward.
curl -O http://www.haskell.org/ghc/dist/7.2.1/ghc-7.2.1-x86_64-apple-darwin.tar.bz2
tar -xjvf ghc-7.2.1-x86_64-apple-darwin.tar.bz2
cd ghc-7.2.1
./configure
make install
Downloading, patching and installing the latest version of the cabal-install
tool is not quite so easy, but won't take long if you're careful (and you don't
run into problems that I didn't).
Patching is required because cabal-install
0.10.2 has a very conservative
dependency list and many of the core packages included with GHC 7.2 have version
numbers greater than many of the upper bounds given by cabal-install
's
.cabal
file.
cd -
curl -O http://hackage.haskell.org/packages/archive/cabal-install/0.10.2/cabal-install-0.10.2.tar.gz
tar -xzvf cabal-install-0.10.2.tar.gz
cd cabal-install-0.10.2
curl -O http://hackage.haskell.org/trac/hackage/raw-attachment/ticket/872/ghc7.diff
patch -p0 cabal-install.cabal ghc7.diff
The bootstrap.sh
script is provided by cabal-install
as an easy way to get
cabal-install
and all its dependencies up and running. However, it needs some
changes to work under GHC 7.2.
GHC 7.2 removes the random package from the distribution, so we need to modify
bootstrap.sh
and have it install along with zlib, HTTP and the rest. We also
need to update the list of packages to install to use more recent versions which
will build under GHC 7.2.
Replace the whole block of version numbers and regexps with these new ones:
PARSEC_VER="3.1.1"; PARSEC_VER_REGEXP="[23]\." # == 2.* || == 3.*
NETWORK_VER="2.3.0.5"; NETWORK_VER_REGEXP="2\." # == 2.*
CABAL_VER="1.12.0"; CABAL_VER_REGEXP="1\.12\.[^0]" # == 1.10.* && >= 1.10.1
TRANS_VER="0.2.2.0"; TRANS_VER_REGEXP="0\.2\." # == 0.2.*
MTL_VER="2.0.1.0"; MTL_VER_REGEXP="[12]\." # == 1.* || == 2.*
HTTP_VER="4000.1.2"; HTTP_VER_REGEXP="4000\.[01]\." # == 4000.0.* || 4000.1.*
ZLIB_VER="0.5.3.1"; ZLIB_VER_REGEXP="0\.[45]\." # == 0.4.* || ==0.5.*
TIME_VER="1.2.0.4"; TIME_VER_REGEXP="1\.[12]\." # == 0.1.* || ==0.2.*
RANDOM_VER="1.0.0.3"; RANDOM_VER_REGEXP="1\." # == 1.*
Then add the following lines next to their kin:
info_pkg "random" ${RANDOM_VER} ${RANDOM_VER_REGEXP}
do_pkg "random" ${RANDOM_VER} ${RANDOM_VER_REGEXP}
Since the Cabal library comes with GHC, we also don't need it installed by the bootstrap script, so find the following two lines and comment them out:
# info_pkg "Cabal" ${CABAL_VER} ${CABAL_VER_REGEXP}
# do_pkg "Cabal" ${CABAL_VER} ${CABAL_VER_REGEXP}
We want cabal-install
and its dependencies to be installed globally, as though
they were being installed by something like the Haskell Platform, so the final
change to bootstrap.sh
is to change the installation scope from --user
to
--global
. You can skip this step if you prefer to install cabal-install
and
its dependencies locally.
SCOPE_OF_INSTALLATION="--global"
Finally, run the bootstrap script to install cabal-install
.
sh bootstrap.sh
That should be it. Happy hacking!
I'm sad