#!/bin/bash
# +-------------------------------------------------------------------+
# !                                                                   !
# ! Name: _build                                                      !
# !                                                                   !
# ! Desc: build Hercules with various options                         !
# !                                                                   !
# ! Usage:                                                            !
# !                                                                   !
# !  >>- build -+------------------------+-+---------------------+->  !
# !             !                        ! !                     !    !
# !             +- -c --+- i586 -------+-+ +- -t -+-- fthread -+-+    !
# !                     !              !          !            !      !
# !                     +- i686 -------+          +-- f -------+      !
# !                     !              !          !            !      !
# !                     +- pentium ----+          +-- pthread -+      !
# !                     !              !          !            !      !
# !                     +- athlon -----+          +-- p -------+      !
# !                     !              !                              !
# !                     +- pentiumpro -+                              !
# !                     !              !                              !
# !                     +- p4 ---------+                              !
# !                     !              !                              !
# !                     +- pentium4 ---+                              !
# !                                                                   !
# !   >---------+-------+------------------------------------------>  !
# !             !       !                                             !
# !             +- -f --+  force rebuilding of configure              !
# !                                                                   !
# !                                                                   !
# !   >---------+-------------------------------------+------------>< !
# !             !                                     !               !
# !             +- -p -- number_of_processors (<=8) --+               !
# !                                                                   !
# !                                                                   !
# ! Defaults:  build -c `uname -m` -t f -p 2                          !
# !                                                                   !
# +-------------------------------------------------------------------+
# !
# ! Change Log: '$Log$
# ! Change Log: 'Revision 1.20  2003/10/12 06:48:13  vbandke
# ! Change Log: 'remove extraneous CR from _build scripts
# ! Change Log: '
# ! Change Log: 'Revision 1.19  2003/10/06 19:51:24  vbandke
# ! Change Log: 'Add support for Linux build.  Add support for -p flag (number of processors)
# ! Change Log: '
# ! Change Log: 'Revision 1.18  2003/08/26 11:53:08  vbandke
# ! Change Log: 'remove reference to ABOUT-NLS.  Add option -f to forece generation of ./configure
# ! Change Log: '
# ! Change Log: 'Revision 1.17  2003/08/15 13:56:14  vbandke
# ! Change Log: 'fixed minor details
# ! Change Log: '
# ! Change Log: 'Revision 1.16  2002/12/16 16:19:17  vbandke
# ! Change Log: 'remove --prefix=`pwd` from ./configure invocation
# ! Change Log: '
# ! Change Log: 'Revision 1.15  2002/12/15 21:56:03  vbandke
# ! Change Log: 'Complete rework.  Include support for P4 processor
# ! Change Log: '
function pause() {
   echo -e -n "${MSG}Press the ${MSGHI}ENTER${MSG} key to continue"
   read dummy
}

function log() {
   if [ $# != 0 ] ; then
      THE_TIME=`date +%H:%M:%S`
      echo -e "${MSG}${THE_TIME}${DEFAULT} - ${MSGHI}${1}${DEFAULT}"
      echo -e "${THE_TIME} - ${1}" >>${LOGFILE} 2>&1
   fi
   return
}

function logn() {
   if [ $# != 0 ] ; then
      echo -e "           ${MSGHI}${1}${DEFAULT}"
      echo -e "           ${1}" >>${LOGFILE} 2>&1
   fi
   return
}

function loga() {
   if [ $# != 0 ] ; then
      THE_TIME=`date +%H:%M:%S`
      echo -e "${MSG}${THE_TIME}${DEFAULT} - ${ERRHI}\a${1}${DEFAULT}"
      echo -e "${THE_TIME} - ${1}" >>${LOGFILE} 2>&1
   fi
   return
}

function lower() {
   if [ "${1}X" = "X" ] ; then
      echo ""
   else
      echo -E "${1}" | tr [:upper:] [:lower:]
   fi
}

function upper() {
   if [ "${1}X" = "X" ] ; then
      echo ""
   else
      echo -E "${1}" | tr [:lower:] [:upper:]
   fi
}
function abort() {
    loga "*******************************************************************"
    loga "*                                                                 *"
    loga "*                            A B O R T                            *"
    loga "*                            =========                            *"
    loga "*                                                                 *"
    loga "*******************************************************************"
    logn " "
    logn "${1}"
    logn " "
    logn "Check error messages in logfile ${LOGFILE}"
    logn " "
    pause
    exit
}
clear
. set_color_vars
if [  ${OSTYPE} = cygwin ] ; then
   THIS_CYGWIN=`cygcheck -s | grep -i dll\ version:`
   THIS_CYGWIN=${THIS_CYGWIN##*: }
   DEFTHREAD=fthreads
else
   THIS_CYGWIN=n/a
   DEFTHREAD=posix
fi
MYCMD=`basename ${0}`
LOGFILE=`pwd`/${MYCMD}.log
cat >${LOGFILE}<<!EOF!
*************************************************************************
*
* Name: ${LOGFILE}
*
* Date: `date`
*
* Command line: ${0} ${1} ${2} ${3} ${4} ${5} ${6} ${7} ${8} ${9}
*
*************************************************************************

!EOF!
log "Building Hercules Binaries from Local Source"
THREAD_SET=false
CPU_SET=false
NUMCPU_SET=false
NUMCPU=2
AUTO_SET=false
ANSI_SET=true
CPU_TYPE=auto
THREAD_TYPE=fthread
while getopts :c:fn:p:t: THE_OPT ; do
   THE_OPT=`lower ${THE_OPT}`
   case ${THE_OPT} in
      c) CPU_TYPE=${OPTARG}
         CPU_SET=true
         ;;
      f) rm -f ./configure
         ;;
      n) ANSI_SET=false
         ;;
      p) NUMCPU_SET=true
         NUMCPU=${OPTARG}
         ;;
      t) THREAD_TYPE=${OPTARG}
         THREAD_SET=true
         ;;
      :) abort "Required information is missing"
         ;;
     \?) loga    "Invalid command switch ${OPTARG}\n"
         logn    "Syntax is\n"
         logn    "_build [-c <cputype>] [-t <threadmodel>] [-n] [-f] [-p number_of_CPUs]"
         logn    "         !              !                  !    !    !"
         logn    "         !              !                  !    !    +--- Number of emulated"
         logn    "         !              !                  !    !         Hercules processors"
         logn    "         !              !                  !    +-------- force rebuild of configure"
         logn    "         !              !                  +------------- no-ansi, do not"
         logn    "         !              !                                 use fancy colours"
         logn    "         !              +-------------------------------- thread model to use"
         logn    "         !                                                f or fthread or fish"
         logn    "         !                                                p or pthread or posix"
         logn    "         +----------------------------------------------- target cpu type       "
         logn    "                                                          i586 for Pentium      "
         logn    "                                                          i686 for Pentium Pro  "
         logn    "                                                          p4   for Pentium 4    "
         logn    " "
         logn    " The default is ${MYCMD} -c `uname -m` -t ${DEFTHREAD} -p 2"
         logn    " "
         pause
         exit
         ;;
   esac
done
if ! ${CPU_SET} ; then
   CPU_TYPE=`uname -m`
   HOST_OPT=
fi

if ! ${NUMCPU_SET} ; then
   NUMCPU=2
fi

case ${OSTYPE} in
   cygwin)  OSTEXT=cygwin
   ;;
   linux*)  OSTEXT=linux-gnu
   ;;
   *) abort "This script does not work for OSTYPE=${OSTYPE}"
   ;;
esac

CPU_TYPE=`lower ${CPU_TYPE}`
log "CPU type ................................ ${CPU_TYPE}"
case ${CPU_TYPE} in
   i586 | pentium | athlon)
                              HOST_OPT=--host=i586-pc-${OSTEXT}
                              TARG_CPU=i586
                              ;;
   i686 | pentiumpro)
                              HOST_OPT=--host=i686-pc-${OSTEXT}
                              TARG_CPU=i686
                              ;;
   p4   | pentium4)
                              # HOST_OPT=--host=p4-pc-${OSTEXT}
                              TARG_CPU=p4
                                       OPTOPT="-fomit-frame-pointer -O3 -march=pentium4 -mcpu=pentium4"
                              OPTOPT=${OPTOPT}" -mmmx -msse -msse2 -minline-all-stringops -mfpmath=sse"
                              OPTOPT=${OPTOPT}" -maccumulate-outgoing-args"
                              ;;
   *) abort  "Invalid CPU type ${CPU_TYPE}"
      ;;
esac

log "Number of host processors supported ..... ${NUMCPU}"
if ! ${THREAD_SET} ; then
   if [ ${OSTYPE} = cygwin ] ; then
      THREAD_TYPE=fthread
   else
      THREAD_TYPE=pthread
   fi
fi

THREAD_TYPE=`lower ${THREAD_TYPE}`
log "Threading model being used .............. ${THREAD_TYPE}"
case ${THREAD_TYPE} in
   f | fthread* | fish )  FTHREAD=yes
                          THREAD_TYPE="optimzed thread (Fish)"
                          ;;
   p | pthread* | posix)  FTHREAD=no
                          THREAD_TYPE="standard thread (posix)"
                         ;;
   *) abort "Invalid thread model \"${THREAD_TYPE}\""
      ;;
esac

if test -f Makefile ; then
   log "Cleaning up previous installation"
   log "make uninstall"
cat >>${LOGFILE} <<!EOF!
+------------------------------------------------------------------------
!
!                   make uninstall
!                   ==============
!
+------------------------------------------------------------------------
!EOF!
   make uninstall >>${LOGFILE} 2>&1
   log "make distclean"
cat >>${LOGFILE} <<!EOF!
+------------------------------------------------------------------------
!
!                   make distclean
!                   ==============
!
+------------------------------------------------------------------------
!EOF!
   make distclean >>${LOGFILE} 2>&1
fi
if ! test -f ./configure ; then
  log "Running autogen.sh"
cat >>${LOGFILE} <<!EOF!
+------------------------------------------------------------------------
!
!                   bash autogen.sh
!                   ===============
!
+------------------------------------------------------------------------
!EOF!
  bash autogen.sh >>${LOGFILE} 2>&1 || abort "autogen processing failed"
  log "autogen completed successfully"
fi

logn "./configure ${HOST_OPT}"
logn "            --enable-fthreads=${FTHREAD}"
logn "            --enable-custom=\"compiled for ${TARG_CPU}\""
if [ "${OPTOPT}X" != "X" ] ; then
   logn "            --enable-optimization=\"${OPTOPT:0:27}\"... "
fi
logn "            --enable-multi-cpu=${NUMCPU} "
cat >>${LOGFILE} <<!EOF!
+------------------------------------------------------------------------
!
!                   ./configure
!                   ===========
!
+------------------------------------------------------------------------
!EOF!
while ! test -f Makefile ; do
   if [ "${OPTOPT}X" != "X" ] ; then
       ./configure ${HOST_OPT} \
                   --enable-fthreads=${FTHREAD} \
                   --enable-custom="compiled for ${TARG_CPU}" \
                   --enable-optimization="${OPTOPT}" \
                   --enable-cckd-bzip2 \
                   --enable-het-bzip2 \
                   --enable-multi-cpu=${NUMCPU} >>${LOGFILE} 2>&1
   else
       ./configure ${HOST_OPT} \
                   --enable-fthreads=${FTHREAD} \
                   --enable-custom="compiled for ${TARG_CPU}" \
                   --enable-cckd-bzip2 \
                   --enable-het-bzip2 \
                   --enable-multi-cpu=${NUMCPU} >>${LOGFILE} 2>&1
   fi
done
RC=$?
if [ ${RC} != 0 ] ; then
 abort "./configure script failed"
fi
rm -f version.o 2>/dev/null
log "make"
cat >>${LOGFILE} <<!EOF!
+------------------------------------------------------------------------
!
!                   make
!                   ====
!
+------------------------------------------------------------------------
!EOF!
make                >>${LOGFILE} 2>&1 || abort "make failed"
log "make install-strip"
cat >>${LOGFILE} <<!EOF!
+------------------------------------------------------------------------
!
!                   make install-strip
!                   ==================
!
+------------------------------------------------------------------------
!EOF!
make install-strip  >>${LOGFILE} 2>&1 || abort "make install-strip failed"
cat >>${LOGFILE} <<!EOF!
+------------------------------------------------------------------------
!
!  Time: `date +%H:%M:%S`
!
!                   F I N I T O   ! ! !
!                   ===================
!
+------------------------------------------------------------------------
!EOF!
