#!/bin/bash

# Build script for sifdecode
# version for Bourne/bash shell

# syntax: install_sifdecode

# N. Gould, D. Orban & Ph. Toint
# ( Last modified on 6 February 2013 at 07:15 GMT )

#  check input arguments (if any)

if [ $# != 0 ]; then
   echo "Use: install_sifdecode"
   exit 1
fi

. ./bin/sifdecode_envcheck

#  determine the platform and operating system used

CORRECT_PLATFORM="false"
while [ $CORRECT_PLATFORM == "false" ]; do
   echo -e ' Select platform\n'
   echo '   (1) Compaq (DEC) alpha'
   echo '   (2) Cray'
   echo '   (3) HP workstation'
   echo '   (4) IBM PowerPC'
   echo '   (5) PC'
   echo '   (6) PC with generic 64-bit processor'
   echo '   (7) PC with 64-bit Itanium processor'
   echo '   (8) PC with 64-bit Opteron processor'
   echo '   (9) PC with 64-bit Athlon processor'
   echo '  (10) SGI workstation'
   echo '  (11) SUN workstation'
   echo '  (12) MAC OS/X'
   echo '  (13) 64-bit MAC OS/X'

   read CHOICE

   case  $CHOICE  in
       "1")
            CORRECT_PLATFORM="true"
            export MCH="alp"
            export MACHINE="Compaq Alpha"

            CORRECT_OS="false"
            while [ $CORRECT_OS == "false" ]; do

               echo -e ' Select operating system\n'
               echo '   (1) Digital Unix'
               echo '   (2) Tru-64 Unix'
               echo '   (3) Linux'

               read CHOICE

               case  $CHOICE  in
               1)
                  CORRECT_OS="true"
                  export OS="dux"
                  export OPSYS="Digital Unix"
;;
               2)
                  CORRECT_OS="true"
                  export OS="t64"
                  export OPSYS="Tru-64 Unix"
;;
               3)
                  CORRECT_OS="true"
                  export OS="lnx"
                  export OPSYS="Linux"
;;
               *)
                  echo ' Please give an integer between 1 and 3'
               esac
            done
;;
       "2")
            CORRECT_PLATFORM="true"
            export MCH="cry"
            export MACHINE="CRAY T3E"
            export OS="unc"
            export OPSYS="UNICOS"
;;
       "3")
            CORRECT_PLATFORM="true"
            export MCH="hp"
            export MACHINE="HP workstation"

            CORRECT_OS="false"
            while [ $CORRECT_OS == "false" ]; do

               echo ' Select operating system'
               echo
               echo '   (1) HP-UX'
               echo '   (2) Linux'

               read CHOICE

               case  $CHOICE  in
               1)
                  CORRECT_OS="true"
                  export OS="hpu"
                  export OPSYS="HP-UX"
;;
               2)
                  CORRECT_OS="true"
                  export OS="lnx"
                  export OPSYS="Linux"
;;
               *)
                  echo ' Please give an integer between 1 and 2'
               esac
            done
;;
       "4")
            CORRECT_PLATFORM="true"
            export MCH="ppc"
            export MACHINE="IBM PowerPC"

            CORRECT_OS="false"
            while [ $CORRECT_OS == "false" ]; do

               echo -e ' Select operating system\n'
               echo '   (1) AIX'
               echo '   (2) Linux'

               read CHOICE

               case  $CHOICE  in
               1)
                  CORRECT_OS="true"
                  export OS="aix"
                  export OPSYS="AIX"
;;
               2)
                  CORRECT_OS="true"
                  export OS="lnx"
                  export OPSYS="Linux"
;;
               *)
                  echo ' Please give an integer between 1 and 2'
               esac
            done
;;
       "5")
            CORRECT_PLATFORM="true"
            export MCH="pc"
            export MACHINE="Intel-like PC"

            CORRECT_OS="false"
            while [ $CORRECT_OS == "false" ]; do

               echo -e ' Select operating system\n'
               echo '   (1) Windows 2000/XP with MinGW/Msys'
               echo '   (2) Linux'

               read CHOICE

               case  $CHOICE  in
               1)
                  CORRECT_OS="true"
                  export OS="mgw"
                  export OPSYS="MGW"
;;
               2)
                  CORRECT_OS="true"
                  export OS="lnx"
                  export OPSYS="Linux"
;;
               *)
                  echo ' Please give an integer between 1 and 2'
               esac
            done
;;
       "6")
            CORRECT_PLATFORM="true"
            export MCH="pc64"
            export MACHINE="Intel-like PC with a 64-bit processor"

            CORRECT_OS="false"
            while [ $CORRECT_OS == "false" ]; do

               echo -e ' Select operating system\n'
               echo '   (1) Windows 2000/XP with MinGW/Msys'
               echo '   (2) Linux'

               read CHOICE

               case  $CHOICE  in
               1)
                  CORRECT_OS="true"
                  export OS="mgw"
                  export OPSYS="MGW"
;;
               2)
                  CORRECT_OS="true"
                  export OS="lnx"
                  export OPSYS="Linux"
;;
               *)
                  echo ' Please give an integer between 1 and 2'
               esac
            done
;;
       "7")
            CORRECT_PLATFORM="true"
            export MCH="i64"
            export MACHINE="Intel-like PC with a 64-bit Itanium processor"
            export OS="lnx"
            export OPSYS="Linux"
;;
       "8")
            CORRECT_PLATFORM="true"
            export MCH="opt"
            export MACHINE="AMD-like PC with a 64-bit Opteron processor"
            export OS="lnx"
            export OPSYS="Linux"
;;
       "9")
            CORRECT_PLATFORM="true"
            export MCH="ath"
            export MACHINE="AMD-like PC with a 64-bit Athlon processor"
            export OS="lnx"
            export OPSYS="Linux"
;;
       "10")
            CORRECT_PLATFORM="true"
            export MCH="sgi"
            export MACHINE="SGI workstation"

            CORRECT_OS="false"
            while [ $CORRECT_OS == "false" ]; do

               echo -e ' Select operating system\n'
               echo '   (1) IRIX'
               echo '   (2) Linux'

               read CHOICE

               case  $CHOICE  in
               1)
                  CORRECT_OS="true"
                  export OS="irx"
                  export OPSYS="IRIX"
;;
               2)
                  CORRECT_OS="true"
                  export OS="lnx"
                  export OPSYS="Linux"
;;
               *)
                  echo ' Please give an integer between 1 and 2'
               esac
            done
;;
       "11")
            CORRECT_PLATFORM="true"
            export MCH="sun"
            export MACHINE="Sun workstation"

            CORRECT_OS="false"
            while [ $CORRECT_OS == "false" ]; do

               echo -e ' Select operating system\n'
               echo '   (1) Solaris'
               echo '   (2) Linux'

               read CHOICE

               case  $CHOICE  in
               1)
                  CORRECT_OS="true"
                  export OS="sol"
                  export OPSYS="Solaris"
;;
               2)
                  CORRECT_OS="true"
                  export OS="lnx"
                  export OPSYS="Linux"
;;
               *)
                  echo ' Please give an integer between 1 and 2'
               esac
            done
;;
       "12")
             CORRECT_PLATFORM="true"
             export MCH="mac"
             export MACHINE="Mac"
             export OS="osx"
             export OPSYS="MacOSX"
;;
       "13")
             CORRECT_PLATFORM="true"
             export MCH="mac64"
             export MACHINE="64-bit Mac"
             export OS="osx"
             export OPSYS="MacOSX"
;;
       *)
         echo ' Please give an integer between 1 and 13'
   esac
done

unalias source 2>/dev/null

source $ARCH/system.$OS

export SIFDECODE=`dirs -l`
export SIFDECODE=`echo $SIFDECODE | $SED 's"/tmp_mnt""'`

echo -e ' Select compiler\n'

COMP=( `$LS $ARCH/compiler.${MCH}.${OS}.* $ARCH/compiler.all.all.* 2>/dev/null` )
NUMBER=${#COMP[@]}
LIST=( ${COMP[@]} )
let count=-1
for i  in  ${COMP[@]}; do
  (( count++ ))
  COMP[$count]="`$SED q $i | $SED 's/^[# ]*//'`"
done

CORRECT_COMPILER="false"

let count=-1
for i  in  ${LIST[@]}; do
  (( count++ ))
  let counter=count+1
  echo "        ($counter) ${COMP[$count]}"
done

while [ $CORRECT_COMPILER == "false" ]; do
   read CHOICE
   let CHOICE=CHOICE-1
   if (( 0 <= CHOICE && CHOICE < NUMBER )); then
     CORRECT_COMPILER="true"
     COMPILER=${LIST[$CHOICE]##*/}
     CMP=${COMPILER##*\.} #${LIST[$CHOICE]%*\.}
     COMPUSED="${COMP[$CHOICE]}"
   else
     echo " Please give an integer between 1 and $NUMBER"
   fi
done

source $ARCH/$COMPILER

VERSION=${MCH}.${OS}.${CMP}
#PREFIX=$VERSION
#OD='$SIFDECODE'/objects/$VERSION

#PLPLOTUSED="unused"
#PLPLOT=""

if [[ -e $SIFDECODE/versions/$VERSION ]]; then
    warning " There is already a SIFDECODE installation with version $VERSION."
    yesno_default_no ' Do you wish to proceed ... existing version will be destroyed'
    [[ $? == 0 ]] && exit 4
fi

#echo $CMP

#  create architecture-dependent object and module directories

OBJDIR=$SIFDECODE/objects/$VERSION
MODDIR=$SIFDECODE/modules/$VERSION

echo "$MACHINE ($OPSYS) $COMPUSED" > $SIFDECODE/versions/$VERSION

if [[ ! -e $OBJDIR ]]; then
    $MKDIR $OBJDIR
    $MKDIR $OBJDIR/double $OBJDIR/single
else
    if [[ ! -e $OBJDIR/double ]]; then
        $MKDIR $OBJDIR/double
    fi
    if [[ ! -e $OBJDIR/single ]]; then
        $MKDIR $OBJDIR/single
    fi
fi

if [[ ! -e $MODDIR ]]; then
    $MKDIR $MODDIR
    $MKDIR $MODDIR/double $MODDIR/single
else
    if [[ ! -e $MODDIR/double ]]; then
        $MKDIR $MODDIR/double
    fi
    if [[ ! -e $MODDIR/single ]]; then
        $MKDIR $MODDIR/single
    fi
fi

#  write out the sifdecode/bin/sys file for this architecture

SYSFILE=$SIFDECODE/bin/sys/$VERSION

echo 'RM="'$RM'"'                                                  >  $SYSFILE
echo 'MAKE="'$MAKE'"'                                              >> $SYSFILE
echo 'CAT="'$CAT'"'                                                >> $SYSFILE
echo 'SED="'$SED'"'                                                >> $SYSFILE
echo 'MV="'$MV'"'                                                  >> $SYSFILE
echo 'LS="'$LS'"'                                                  >> $SYSFILE
echo 'LN="'$LN'"'                                                  >> $SYSFILE
echo 'GREP="'$GREP'"'                                              >> $SYSFILE
echo 'AWK="'$AWK'"'                                                >> $SYSFILE
echo 'HEAD="'HEAD'"'                                               >> $SYSFILE
echo 'TAIL="'$TAIL'"'                                              >> $SYSFILE
echo 'FORTRAN="'$FORTRAN'"'                                        >> $SYSFILE
MOD='$SIFDECODE/modules/'$VERSION'/$PRECIS'
FFLAGS="$LIBCMD"' '`eval echo $MODCMD`' '"$F90"
echo 'FFLAGS="'$FFLAGS' '$OPENMP'"'                                >> $SYSFILE
echo 'PROBFLAGS="'$FFLAGS' '$BASIC' '$OPTIMIZATION' '$F77' "'      >> $SYSFILE
#echo 'CUTERUSED="'$CUTERUSED'"'                                   >> $SYSFILE
echo 'BLAS="'$BLAS'"'                                              >> $SYSFILE
echo 'LAPACK="'$LAPACK'"'                                          >> $SYSFILE
#echo 'HSL="'$HSL'"'                                               >> $SYSFILE
#echo 'METIS="'$METIS'"'                                           >> $SYSFILE
#echo 'PARDISO="'$PARDISO'"'                                        >> $SYSFILE
#echo 'WSMP="'$WSMP'"'                                              >> $SYSFILE
#echo 'PLPLOT="'$PLPLOT'"'                                          >> $SYSFILE

#  write out the sifdecode/makefile/ file for this architecture

MAKEFILE=$SIFDECODE/makefiles/$VERSION

echo ' '                                                           >  $MAKEFILE
echo '#  Architecture dependent makefile'                          >> $MAKEFILE
echo '#  (automatically generated by install_sifdecode)'           >> $MAKEFILE
echo ' '                                                           >> $MAKEFILE
echo 'VERSION = '$VERSION                                          >> $MAKEFILE
echo ' '                                                           >> $MAKEFILE
echo '#  Basic system commands'                                    >> $MAKEFILE
echo ' '                                                           >> $MAKEFILE
echo 'CP = '$CP                                                    >> $MAKEFILE
echo 'MV = '$MV                                                    >> $MAKEFILE
echo 'RM = '$RM                                                    >> $MAKEFILE
echo 'SED = '$SED                                                  >> $MAKEFILE
echo 'GREP = '$GREP                                                >> $MAKEFILE
echo 'AR = '$AR                                                    >> $MAKEFILE
echo 'ARREPFLAGS = '$ARREPFLAGS                                    >> $MAKEFILE
echo 'RANLIB = '$RANLIB                                            >> $MAKEFILE
echo ' '                                                           >> $MAKEFILE
echo '#  Directory for binaries'                                   >> $MAKEFILE
echo ' '                                                           >> $MAKEFILE
echo 'PRECIS = double'                                             >> $MAKEFILE
echo 'OBJ = $(SIFDECODE)/objects/$(VERSION)/$(PRECIS)'             >> $MAKEFILE
echo 'OBJS = $(SIFDECODE)/objects/$(VERSION)/single'               >> $MAKEFILE
echo 'OBJD = $(SIFDECODE)/objects/$(VERSION)/double'               >> $MAKEFILE
echo 'MOD = $(SIFDECODE)/modules/$(VERSION)/$(PRECIS)'             >> $MAKEFILE
echo 'SEDS = $(SIFDECODE)/seds/$(PRECIS).sed'                      >> $MAKEFILE
echo 'MVMODS = '"$MVMODS"                                          >> $MAKEFILE
echo ' '                                                           >> $MAKEFILE
echo '#  Compiler options'                                         >> $MAKEFILE
echo ' '                                                           >> $MAKEFILE
echo 'FORTRAN = '$FORTRAN                                          >> $MAKEFILE
echo 'BASIC = '$BASIC                                              >> $MAKEFILE
MODTMP="$LIBCMD"' '`echo $MODCMD | $SED 's/MOD/(MOD)/g'`
echo 'MODULES = '$MODTMP                                           >> $MAKEFILE
echo 'OPTIMIZATION = '$OPTIMIZATION                                >> $MAKEFILE
echo 'NOOPTIMIZATION = '$NOOPTIMIZATION                            >> $MAKEFILE
echo 'DEBUG = '$DEBUG                                              >> $MAKEFILE
echo 'OPENMP = '$OPENMP                                            >> $MAKEFILE
echo 'F77 = '$F77                                                  >> $MAKEFILE
echo 'F90 = '$F90                                                  >> $MAKEFILE
echo 'F95 = '$F95                                                  >> $MAKEFILE
echo 'NOFMAIN = '$NOFMAIN                                          >> $MAKEFILE
echo 'USUAL = '$USUAL                                              >> $MAKEFILE
echo 'SPECIAL = '$SPECIAL                                          >> $MAKEFILE
echo 'F77SUFFIX = '$F77SUFFIX                                      >> $MAKEFILE
echo 'F95SUFFIX  = '$F95SUFFIX                                     >> $MAKEFILE
echo 'TIMER = '$TIMER                                              >> $MAKEFILE
echo 'NOT95 = '$NOT95                                              >> $MAKEFILE
echo 'NOT64 = '$NOT64                                              >> $MAKEFILE
#echo 'PLPLOTUSED = '$PLPLOTUSED                                   >> $MAKEFILE
echo ' '                                                           >> $MAKEFILE
echo 'AMPLDIR   = '$AMPLLIBDIR                                     >> $MAKEFILE
echo 'CC        = '$CC                                             >> $MAKEFILE
echo 'CCBASIC   = '$CCBASIC                                        >> $MAKEFILE
echo 'CCISO     = '$CCISO                                          >> $MAKEFILE
echo 'CCONDEF   = '$CCONDEF                                        >> $MAKEFILE
echo 'CCDEBUG   = '$CCDEBUG                                        >> $MAKEFILE
echo ' '                                                           >> $MAKEFILE
echo '#  Special flags'                                            >> $MAKEFILE
echo ' '                                                           >> $MAKEFILE
echo ' '                                                           >> $MAKEFILE
echo '#  Libraries'                                                >> $MAKEFILE
echo ' '                                                           >> $MAKEFILE
echo 'BLAS = '$BLAS                                                >> $MAKEFILE
echo 'LAPACK = '$LAPACK                                            >> $MAKEFILE
#echo 'HSL = '$HSL                                                 >> $MAKEFILE
#echo 'METIS = '$METIS                                             >> $MAKEFILE
#echo 'PARDISO = '$PARDISO                                         >> $MAKEFILE
#echo 'WSMP = '$WSMP                                               >> $MAKEFILE
#echo 'PLPLOT = '$PLPLOT                                           >> $MAKEFILE
#echo 'CUTERUSED = '$CUTERUSED                                     >> $MAKEFILE
echo 'CUTERUSED = '                                                >> $MAKEFILE
echo ' '                                                           >> $MAKEFILE
echo '#  Shell used'                                               >> $MAKEFILE
echo ' '                                                           >> $MAKEFILE
echo 'BINSHELL = '$BINSHELL                                        >> $MAKEFILE
echo ' '                                                           >> $MAKEFILE
echo '#  Set directories for optional packages'                    >> $MAKEFILE
echo ' '                                                           >> $MAKEFILE
echo 'include $(SIFDECODE)/src/makedefs/packages'                  >> $MAKEFILE
echo ' '                                                           >> $MAKEFILE
echo '#  Body of makefile'                                         >> $MAKEFILE
echo ' '                                                           >> $MAKEFILE
echo 'include $(PWD)/makemaster'                                   >> $MAKEFILE

#  optionally edit the compiler and platform settings

yesno_default_no ' Would you like to review and modify if necessary the compiler settings'
[[ $? == 1 ]] && ${FCEDIT:-${VISUAL:-${EDITOR:-vim}}} $PWD/makefiles/$VERSION

yesno_default_no ' Would you like to review and modify if necessary the system commands'
[[ $? == 1 ]] && ${FCEDIT:-${VISUAL:-${EDITOR:-vim}}} $PWD/bin/sys/$VERSION

#  optionally compile the selected packages

yesno_default_yes ' Do you now wish to compile the package ...'

if [[ $? == 1 ]]; then
    cd $SIFDECODE/src/

    echo -e "\nInstalling the double precision version"
    OPTIONS="-s -f $SIFDECODE/makefiles/$VERSION"
    MACROS="PRECIS=double PWD=$SIFDECODE/src SIFDECODE=$SIFDECODE"
    $MAKE $OPTIONS all $MACROS
    if [[ $? != 0 ]]; then
        error 'A compilation error occurred.'
        exit 2
    fi
    success 'SIFdecode successfully installed.'

    echo -e "\n Remember to set the environment variable"
    echo "  SIFDECODE to $SIFDECODE"
    echo " In addition, please update your MANPATH to include"
    echo "    $SIFDECODE/man"
    echo " and your PATH to include"
    echo "    $SIFDECODE/bin"
    echo ''
    echo " (see $SIFDECODE/doc/README.bashrc"
    echo -e "  for an example on how to do that).\n"
fi
exit 0
