#!/bin/bash
set -x
version=7.10.2
target=/afs/sipb.mit.edu/project/ghc/arch/$ATHENA_SYS/install/$version
extrabin=$target/hackage-bin
test -e process-stack.pl
export PATH=$target/bin:"$PATH"
hash -r
ghc --version

#random things still get written here
if [ -e $HOME/.cabal ]
then exit 1
fi

cabalrc=$target/.cabal
if [ -e $cabalrc ]
then exit 1
fi

mkdir -p $target/bzip2
pushd $target/bzip2
apt-get source bzip2
bzlib=$(find . -maxdepth 1 -type d -name 'bzip2*' -exec basename '{}' \;)
pushd $bzlib
debian/rules build
popd
bzlib=$target/bzip2/$bzlib
popd
test -d $bzlib || exit 1
pushd $target
wget https://www.stackage.org/lts/cabal.config
popd
splicefile=$target/cabal.config.splice
perl process-stack.pl config < $target/cabal.config > $splicefile

which cabal
cabal -V

HOME=$target cabal update
cabalconfig=$target/.cabal/config
perl -plwi.orig -e 'if(/^\s*--\s*logs-dir:/){s/^\s*--\s*//;s,$, '$target'/.cabal/logs,}elsif(/^\s*--\s*constraint:/){open FI,"'$splicefile'" or die;do {local$/;$_=<FI>}}' $cabalconfig

cabal --config-file=$cabalconfig install -v -p --global --prefix=$target cabal-install
hash -r
which cabal
cabal -V

#create new cabal config file with new cabal-install
mv $target/.cabal $target/.cabal-install
HOME=$target cabal update
perl -plwi.orig -e 'if(/^\s*--\s*logs-dir:/){s/^\s*--\s*//;s,$, '$target'/.cabal/logs,}elsif(/^\s*--\s*constraint:/){open FI,"'$splicefile'" or die;do {local$/;$_=<FI>}}' $cabalconfig

#just for fun
diff -u $target/.cabal-install/config.orig $cabalconfig || true
cabal --config-file=$cabalconfig install -v -p --global --prefix=$target --bindir=$extrabin --extra-include-dirs=$bzlib --extra-lib-dirs=$bzlib -fuse_sse2 $(perl process-stack.pl initial < $target/cabal.config)
#haddock part of ghc now, so not needed in initial
export PATH=$extrabin:"$PATH"
hash -r
#use "test" because cabal does not have error status if package failed to install
test "$(which gtk2hsC2hs)"

#the main event
cabal --config-file=$cabalconfig install -v -p --global --prefix=$target --bindir=$extrabin --extra-include-dirs=$bzlib --extra-lib-dirs=$bzlib -fuse_sse2 $(perl process-stack.pl rest < $target/cabal.config)
