It all started with the
2013 Christmas Tree Lecture. Professor Knuth challenged the audience to explore skew ternary trees and their relationship with a subclass of rooted planar graphs. I decided it might be fun to rewrite his
SKEW-TERNARY-CALC program in Haskell, but in order to maximize its utility, it should target its front-end to the web browser. I learned out about the
Fay monad and decided to give a try (see <future post>, hopefully). So as a first step, I tried to
cabal install fay, only to find that I had a
Dependency Mess™. Fine, I could use a fresh Haskell install. Unfortunately my laptop is currently stuck on Ubuntu 12.04, which is stuck at
ghc-7.4. So I purged all my GHC and cabal data, temporarily installed a
ghc-7.4 binary to bootstrap the new GHC, and went on building it. In light of the confusing package database issues, I figured it would be easiest to simply install everything to a user-writable directory,
~/local/opt/ghc-7.6.3 and
~/local/opt/haskell-platform-2013.2.0.0, so that I can then add
--global as a default
cabal-install option and operate out of a single package db.
$ cd ~/Downloads/ghc-7.6.3
$ sudo aptitude install ghc
$ OPT=$HOME/local/opt
$ ./configure --prefix=$OPT/ghc-7.6.3
$ make && make install
This went fine (though it took a few hours on my laptop), so I was now ready to install the Haskell platform. I eventually tracked down the right configure flags:
$ cd ~/Downloads/haskell-platform-2013.2.0.0
$ sudo aptitude purge ghc
$ ./configure \
--prefix=$OPT/haskell-platform-2013.2.0.0 \
--enable-shared \
--enable-profiling \
--disable-user-install
$ make && make install
Now the fun starts
Unfortunately,
make failed. It turns out that
scripts/build.sh sets
GHC_PACKAGE_PATH in its
build_pkg function when it builds with Cabal, and Cabal is incompatible with this option. Fine, we can fix that:
$ sed -i '/GHC_PACKAGE_PATH=/ s/^/#/' scripts/build.sh
$ make && make install
Not surprisingly, this also fails, a little later in the process. This time,
alex is failing to build without
happy. But
happy is supposed to be part of the Haskell platform, and it should be smart enough to build its dependencies in the right order. Indeed, there's a
bug on this that's been open for a year (and the original reporter even included a patch!). I rearranged the dependencies and went on my way.
Another error. Apparently
happy also needs
happy to build. Great, so there's no way around bootstrapping with a binary distribution. I found out right afterwards that
alex has the same bootstrapping problem.
$ sudo aptitude install happy alex
$ make && make install
$ sudo aptitude purge happy alex
Now it looks like we're good to go. Cleaning things up a bit,
$ cd ~/local/opt
$ ln -s ghc-7.6.3 ghc
$ ln -s haskell-platform-2013.2.0.0 haskell-platform
$ for a in ghc/bin/*; do
ln -s ../opt/$a bin/
done
$ echo PATH=$OPT/haskell-platform/bin:\$PATH \
>> ~/.bashrc
$ . ~/.bashrc
$ sed -i '/user-install/ s/.*/user-install: False/g' \
~/.cabal/config
Installing Fay
Finally, it's time to actually install Fay.
$ cabal update
$ cabal install fay
The first invocation of
cabal update tells me to run
cabal install cabal-install, but I'm a bit paranoid because
ghc-pkg list tells me that
Cabal-1.16.0 is installed, but the new
cabal-install wants to bring in
Cabal-1.18.0. Let's not start screwing up the dependencies just yet, thank you. However, there was a failure installing
pretty-show. Cabal didn't give me a useful message, but attempting to install
pretty-show directly reveals that it needs a higher version of
happy. Happy doesn't need to install any libraries, so I'm not as worried about installing it.
$ cabal install happy
$ cabal install fay
This works, but tells me I also need to install
fay-base. No problem.
$ cabal install fay-base
Stay tuned for another post later about skew ternary trees!