#!/bin/bash

if [ -f $HOME/.tls-tools ]; then
  source $HOME/.tls-tools
fi

# Override these in $HOME/.tls-tools if you wish
CVSROOT=${CVSROOT:-:pserver:anonymous@cvs.parisc-linux.org:/var/cvs}
PINSTALL=${PINSTALL:-$HOME/tls}
SRC=${SRC:-$HOME/src}
BUILD=${BUILD:-$HOME/build}
MAKEFLAGS=${MAKEFLAGS:-}
# Environment settings.
# Glibc timeout multiplier for tests
export TIMEOUTFACTOR=10

LOGDATE=`date "+%Y-%m-%d-%R"`
LOGPOSTFIX=${LOGPOSTFIX:-$LOGDATE}

show_help() {
  echo "build-tls-tools [--stage checkout|configure|build|check] [--tool binutils|gcc|glibc] [--help]"
  echo "Separate requested stages or tools with spaces, in quotes"
  exit 0;
}

do_checkout() {
  tool=$1
  oldpwd=$(pwd)
  cd $SRC
  if [ -d $SRC/$tool/CVS ]; then
    echo "Updating $tool in $SRC/$tool"
    cd $SRC/$tool
    cvs up > $SRC/logs/$tool.update-$LOGPOSTFIX.log 2>&1
  else
    echo "Checking out $tool to $SRC"
    cvs -d$CVSROOT co $tool > $SRC/logs/$tool.checkout-$LOGPOSTFIX.log 2>&1
  fi
  cd $oldpwd
}

do_configure() {
  tool=$1
  oldpwd=$(pwd)
  [ -d $BUILD/$tool ] || mkdir -p $BUILD/$tool
  cd $BUILD/$tool
  echo "Configuring $tool in $(pwd)"

  case $tool in
    binutils)
      $SRC/$tool/configure --host=hppa-linux --target=hppa-linux --disable-nls --prefix=$PINSTALL --disable-werror >& $BUILD/logs/$tool.configure-$LOGPOSTFIX.log 
      ;;
    gcc)
      $SRC/$tool/configure --prefix=$PINSTALL --enable-shared --with-system-zlib --disable-nls --enable-debug --with-as=$PINSTALL/bin/as --with-ld=$PINSTALL/bin/ld --host=hppa-linux --target=hppa-linux --disable-libmudflap --enable-languages=c >& $BUILD/logs/$tool.configure-$LOGPOSTFIX.log 
      ;;
    glibc)
      CC=$PINSTALL/bin/gcc $SRC/$tool/configure --host=hppa-linux --target=hppa-linux --build=hppa-linux --prefix=$PINSTALL --enable-add-ons=linuxthreads --enable-all-warnings --with-binutils=$PINSTALL/bin --enable-kernel=2.4.0 --with-headers=/usr/include --enable-tls --enable-__thread >& $BUILD/logs/$tool.configure-$LOGPOSTFIX.log
      ;;
    glibc-nptl)
      CC=$PINSTALL/bin/gcc $SRC/$tool/configure --host=hppa-linux --target=hppa-linux --build=hppa-linux --prefix=$PINSTALL --enable-add-ons=nptl --enable-all-warnings --with-binutils=$PINSTALL/bin --with-headers=/usr/include --enable-tls --enable-__thread >& $BUILD/logs/$tool.configure-$LOGPOSTFIX.log
      ;;
  esac
  cd $oldpwd
}

do_build() {
  tool=$1
  oldpwd=$(pwd)
  [ -d $BUILD/$tool ] || mkdir -p $BUILD/$tool
  cd $BUILD/$tool
  echo "Building $tool in $BUILD/$tool"
  make $MAKEFLAGS > $BUILD/logs/$tool.build-$LOGPOSTFIX.log 2>&1
  cd $oldpwd
}

do_install() {
  tool=$1
  oldpwd=$(pwd)

  echo "Installing $tool in $PINSTALL"
  cd $BUILD/$tool
  make $MAKEFLAGS install > $BUILD/logs/$tool.install-$LOGPOSTFIX.log 2>&1
  cd $oldpwd
}

do_check() {
  tool=$1
  oldpwd=$(pwd)

  echo "Checking $tool in $BUILD/$tool"
  cd $BUILD/$tool
  # Don't stop on error so use -k
  make -k $MAKEFLAGS check > $BUILD/logs/$tool.check-$LOGPOSTFIX.log 2>&1
  cd $oldpwd
}


ARGS=$(getopt -o t:s:h --long tool:,stage:,help -n 'build-tls-tools' -- "$@")
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi

eval set -- "$ARGS"

while true ; do
  case "$1" in
    -t|--tool) TOOLS="$2"; shift 2 ;;
    -s|--stage) STAGES="$2"; shift 2 ;;
    -h|--help) show_help; shift ;;
    --) shift; break; ;;
  esac
done

[ -n "$TOOLS" ] || TOOLS="binutils gcc glibc"
[ -n "$STAGES" ] || STAGES="checkout configure build check install"
[ -d $BUILD/logs ] || mkdir -p $BUILD/logs
[ -d $SRC/logs ] || mkdir -p $SRC/logs

for tool in $TOOLS; do
  for stage in $STAGES; do
    case $stage in
      checkout) do_checkout $tool ;;
      configure) do_configure $tool ;;
      build) do_build $tool ;;
      check) do_check $tool ;;
      install) do_install $tool ;;
    esac
  done
done

