The current haskell platform requires ghc 7.0.3. I need this to run on some RHEL 5.6 machines. Whilst this OS update was released in Jan 2011, it’s based on old software. In particular, it’s built with libc 2.5, which was released back in 2006. It’s not able to use the prebuilt generic binary release from the ghc downloads page. It says:
NOTE: If you have too old a version of libc, then you will get an error like “floating point exception” from the binaries in these bindists. You will need to either upgrade your libc (we’re not sure what the minimum version required is), or use a binary package built for your distribution instead.
I sure don’t want to upgrade libc, and to the best of my knowledge there’s no binary package built for RHEL. So, I’ll need to build it myself from source. But we need ghc to compile ghc, and to make it worse, we need a version >= 6.10, and the binaries for these won’t work with libc 2.5 either.
So, our approach needs to be:
- Compile and install 6.10.4 using 6.8.3
- Compile a binary distribution of 7.0.3 using 6.10.4
- Install the 7.0.3 binary distribution
- Compile and install the haskell platform 2011.2.0.1
But wait, as it turns out, the RHEL 5.6 C compiler (gcc 4.1.2) doesn’t seem to be compatible with recent ghc builds either, giving errors like:
rts/dist/build/RtsStartup.dyn_o: relocation R_X86_64_PC32 against `StgRun' can not be used when making a shared object; recompile with -fPIC
(there are some details on the building and troubleshooting ghc page)
So, you need a more recent gcc also. I could have build this from source also, but luckily I had a working gcc 4.4.3 build already present.
For reference, I needed to download:
And here’s the commands used:
# General setup # Assumes downloaded files are in $BASE/downloads BASE=/tmp/ghc-dev GCC443DIR=/opt/gcc4.4.3/bin mkdir -p $BASE/install mkdir -p $BASE/build # Start with a 6.8.3 binary cd $BASE/build tar -xjf $BASE/downloads/ghc-6.8.3-x86_64-unknown-linux.tar.bz2 export PATH=/usr/bin:/sbin:/bin cd $BASE/build/ghc-6.8.3 ./configure --prefix $BASE/install/ghc-6.8.3 make install # Build 6.10.4 from src cd $BASE/build tar -xjf $BASE/downloads/ghc-6.10.4-src.tar.bz2 export PATH=$BASE/install/ghc-6.8.3/bin:/usr/sbin:/usr/bin:/sbin:/bin cd $BASE/build/ghc-6.10.4 ./configure --prefix $BASE/install/ghc-6.10.4 make make install # Build 7.0.3 from src, using 6.10.4 and gcc 4.4.3 # (gcc 4.1.2 from RHEL doesn't seem to work) cd $BASE/build tar -xjf $BASE/downloads/ghc-7.0.3-src.tar.bz2 export PATH=$BASE/install/ghc-6.10.4/bin:$GCC443DIR:/usr/sbin:/usr/bin:/sbin:/bin cd $BASE/build/ghc-7.0.3 ./configure make make binary-dist # Unpack and install the 7.0.3 bin-dist cd /tmp rm -rf /tmp/ghc-7.0.3 tar -xjf $BASE/build/ghc-7.0.3/ghc-7.0.3-x86_64-unknown-linux.tar.bz2 cd /tmp/ghc-7.0.3 ./configure --prefix $BASE/install/ghc-7.0.3 make install # Unpack and install the haskell platform cd $BASE/build export PATH=$BASE/install/ghc-7.0.3/bin:$GCC443DIR:/usr/sbin:/usr/bin:/sbin:/bin tar -xzf $BASE/downloads/haskell-platform-2011.2.0.1.tar.gz cd $BASE/build/haskell-platform-2011.2.0.1 ./configure --prefix $BASE/install/ghc-7.0.3 make make install
Be prepared to chew up some CPU cycles! Pleasingly, once I sorted out the gcc version issue, all of the above worked without problems.