#!/usr/bin/env bash

# This script can be used to generate some unregisterised .hc files
# for bootstrapping GHC on a new/unsupported platform.  It involves a
# two-stage bootstrap: the first stage builds an unregisterised set of
# libraries & RTS, and the second stage builds an unregisterised
# compiler.  

# Take the .hc files from the libraries of stage 1, and the compiler
# of stage 2, to the target system and bootstrap from these to get a
# working (unregisterised) compiler.

set -e

base=`pwd`

# set this to the location of your source tree
fptools_dir=$HOME/fptools

if [ ! -f b1-stamp ]; then
  mkdir b1
  cd b1
  lndir $fptools_dir
  cd ..

  cd b1
   ./configure

   # For cross-compilation, at this stage you may want to set up a source
   # tree on the target machine, run the configure script there, and bring
   # the resulting mk/config.h file back into this tree before building
   # the libraries.

   touch mk/build.mk
   echo "GhcUnregisterised = YES" >> mk/build.mk
   echo "GhcLibHcOpts = -O -H32m -fvia-C -keep-hc-files" >> mk/build.mk
   echo "GhcLibWays =" >> mk/build.mk
   echo "SplitObjs = NO" >> mk/build.mk

   # We could optimise slightly by not building hslibs here.  Also, building
   # the RTS is not necessary (and might not be desirable if we're using
   # a config.h from the target system).
   make stage1

  cd ..

  touch b1-stamp
fi

# exit 0

if [ ! -f b2-stamp ]; then
  mkdir b2
  cd b2
  lndir $fptools_dir
  cd ..

  cd b2
   ./configure --with-ghc=$base/b1/ghc/compiler/stage1/ghc-inplace

   touch mk/build.mk
   # The bootstrapped compiler should probably generate unregisterised
   # code too.  If you don't want it to, then comment out this line:
   echo "GhcUnregisterised = YES" >> mk/build.mk
   echo "SRC_HC_OPTS += -keep-hc-file -fvia-C" >> mk/build.mk
   echo "GhcWithNativeCodeGen = NO" >> mk/build.mk
   echo "GhcWithInterpreter = NO" >> mk/build.mk

   # we just need to build the compiler and utils...
   (cd glafp-utils && make boot && make)
   (cd ghc && make boot)
   (cd ghc/utils && make)
   (cd ghc/compiler && make stage=1)
  cd ..

  touch b2-stamp
fi
