#!/bin/sh
#
# Configure various Makefiles with correct environment variables
#

# Compute home of PAKCS installation:
PAKCSHOME=`(cd \`dirname $0\` > /dev/null ; pwd)`

# Distribution version of the pakcsinitrc file:
PAKCSINITRC=$PAKCSHOME/bin/.pakcs_variables

# check for HOME variable
if [ xx$HOME = xx ] ; then
  echo "Cannot configure PAKCS since environment variable HOME not set!"
  exit 1
fi

# Local version of the pakcsinitrc file:
HOMEINITRC=$HOME/.pakcsinitrc

# The following is only relevant for CVS checkouts:
if [ ! -f $PAKCSINITRC ] ; then
  if [ -f $PAKCSINITRC.init ] ; then
    cp $PAKCSINITRC.init $PAKCSINITRC
  else
    echo "ERROR: Incomplete distribution: $PAKCSINITRC is missing!"
    exit 1
  fi
fi

# override definition of SICSTUS etc with values of last install, if possible:
if [ -f $HOMEINITRC ] ; then
  cp -p $HOMEINITRC $HOMEINITRC.bak
  mv -f $PAKCSINITRC $PAKCSINITRC.bak
  cp -p $PAKCSINITRC.bak $PAKCSINITRC
  # Update $PAKCSINITRC with values of last installation:
  for i in `sed -n '/^[A-Za-z]*=/p' < $HOMEINITRC.bak`
  do 
    VAR=`expr $i : '\(.*\)=.*'`
    VALUE=`expr $i : '.*=\(.*\)'`
    #echo VAR: $VAR \| VALUE: $VALUE
    mv $PAKCSINITRC $PAKCSINITRC.sav
    cat $PAKCSINITRC.sav | sed 's|^'$VAR'=.*$|'$VAR=$VALUE'|' > $PAKCSINITRC
  done
  rm -f $PAKCSINITRC.sav
else
  cp $PAKCSINITRC $HOMEINITRC
fi

# Load the definition of GHC, SICSTUS and other auxiliary tools:
. $PAKCSINITRC

# look and configure GHC if it is necessary to compiler to mcc parser:
if [ -f mccparser/Makefile ] ; then
  # source code of mcc parser available, thus, ghc required to compile:
  if [ -n "$GHC" ] ; then
    # test GHC:
    $GHC --help > /tmp/ghcout$$ 2>&1
    if [ $? -eq 0 ]; then
      rm /tmp/ghcout$$
    else
      echo "ERROR: Cannot execute ghc ($GHC):"
      cat /tmp/ghcout$$
      echo "Please put a correct definition for GHC in $HOMEINITRC !"
      rm /tmp/ghcout$$
      exit 1
    fi
  else
    # try to find a reasonable definition of GHC:
    echo "GHC not defined in $HOMEINITRC, looking for some ghc executable..."
    GHC=`which ghc`
    if [ -x "$GHC" ] ; then
      $GHC --help > /tmp/ghcout$$ 2>&1
      if [ $? -eq 0 ]; then
        rm /tmp/ghcout$$
        echo "GHC found: $GHC"
        echo -n "Should I use this for PAKCS? (y/n) "
        read ANSWER
        if [ xx$ANSWER = xxy ] ; then
          cd bin
          mv $PAKCSINITRC $PAKCSINITRC.sav
  	cat $PAKCSINITRC.sav | sed 's|^GHC=.*$|GHC='$GHC'|' > $PAKCSINITRC
          rm -f $PAKCSINITRC.sav
          echo "Definition of GHC changed in $PAKCSINITRC"
          cd $PAKCSHOME
          export GHC
        else
          echo "Please put a correct definition for GHC in $HOMEINITRC !"
          exit 1
        fi
      else
        rm /tmp/ghcout$$
        echo "No ghc installation found in your path!"
        echo "Please put a correct definition for GHC in $HOMEINITRC !"
        exit 1
      fi
    else
        echo "No ghc installation found in your path!"
        echo "Please put a correct definition for GHC in $HOMEINITRC !"
      exit 1
    fi
  fi
fi

# try to define SICSTUS if it is not defined:
rm -f bin/sicstus # delete possible old definition
if [ -z "$SICSTUS" ] ; then
  SICSTUS=`which sicstus 2> /dev/null`
  if [ -x "$SICSTUS" ] ; then
    echo "halt." | $SICSTUS > /tmp/sicstusout$$ 2>&1
    if [ $? -eq 0 ]; then
      rm /tmp/sicstusout$$
      echo "SICSTUS not defined $HOMEINITRC, but I have found:"
      echo $SICSTUS
      echo -n "Should I use this for PAKCS? (y/n) "
      read ANSWER
      if [ xx$ANSWER = xxy ] ; then
        cd bin
        mv $PAKCSINITRC $PAKCSINITRC.sav
	cat $PAKCSINITRC.sav | sed 's|^SICSTUS=.*$|SICSTUS='$SICSTUS'|' > $PAKCSINITRC
        rm -f $PAKCSINITRC.sav
        echo "Definition of SICSTUS changed in $PAKCSINITRC"
        cd $PAKCSHOME
        export SICSTUS
      else
        SICSTUS=
        if [ -z "$SWIPROLOG" ] ; then
          echo "Please put a correct definition for SICSTUS in $HOMEINITRC"
          echo "if you want to use the PAKCS/Curry2Prolog compiler."
        fi
      fi
    else
      rm /tmp/sicstusout$$
      SICSTUS=
    fi
  else
    SICSTUS=
  fi
fi

# Create symbolic link bin/sicstus if SICSTUS is defined:
cd bin
if [ -n "$SICSTUS" ] ; then
  # test SICSTUS:
  echo "halt." | $SICSTUS > /tmp/sicstusout$$ 2>&1
  if [ $? -ne 0 ]; then
    echo "ERROR: Cannot execute SICStus-Prolog ($SICSTUS):"
    cat /tmp/sicstusout$$
    echo "Please put a correct definition for SICSTUS in $HOMEINITRC !"
    rm /tmp/sicstusout$$
    exit 1
  else
    ln -s .pakcs_wrapper sicstus
    rm /tmp/sicstusout$$
  fi
  # test SPLD:
  if [ xx$SPLD != xx ] ; then
    $SPLD -h > /tmp/spldout$$ 2>&1
    if [ $? -eq 0 ]; then
      rm /tmp/spldout$$
    else
      echo "ERROR: Cannot execute SICStus-Prolog application builder ($SPLD):"
      cat /tmp/spldout$$
      echo "Please put a correct definition for SPLD in $HOMEINITRC !"
      rm /tmp/spldout$$
      exit 1
    fi
  fi
fi
cd $PAKCSHOME

# try to define SWIPROLOG if SICSTUS and SWIPROLOG are not defined:
rm -f bin/swiprolog # delete possible old definition
if [ -z "$SICSTUS" -a -z "$SWIPROLOG" ] ; then
  echo "No SICStus-Prolog defined or found, looking for SWI-Prolog..."
  SWIPROLOG=`which pl 2> /dev/null`
  if [ -x "$SWIPROLOG" ] ; then
    echo "halt." | $SWIPROLOG > /tmp/swiprologout$$ 2>&1
    if [ $? -eq 0 -a `grep -c SWI-Prolog /tmp/swiprologout$$` -gt 0 ]; then
      rm /tmp/swiprologout$$
      echo "SWIPROLOG not defined $HOMEINITRC, but I have found:"
      echo $SWIPROLOG
      echo -n "Should I use this for PAKCS? (y/n) "
      read ANSWER
      if [ xx$ANSWER = xxy ] ; then
        cd bin
        mv $PAKCSINITRC $PAKCSINITRC.sav
	cat $PAKCSINITRC.sav | sed 's|^SWIPROLOG=.*$|SWIPROLOG='$SWIPROLOG'|' > $PAKCSINITRC
        rm -f $PAKCSINITRC.sav
        echo "Definition of SWIPROLOG changed in $PAKCSINITRC"
        cd $PAKCSHOME
        export SWIPROLOG
        cd bin ; ln -s .pakcs_wrapper swiprolog
      else
        SWIPROLOG=
        echo "Please put a correct definition for SICSTUS or SWIPROLOG in $HOMEINITRC"
        echo "if you want to use the PAKCS/Curry2Prolog compiler."
      fi
    else
      rm /tmp/swiprologout$$
      SWIPROLOG=
    fi
  else
    SWIPROLOG=
  fi
fi
cd $PAKCSHOME

# Create symbolic link bin/swiprolog if SWIPROLOG is correctly defined:
cd bin
if [ -n "$SWIPROLOG" ] ; then
  # test SWIPROLOG:
  echo "halt." | $SWIPROLOG > /tmp/swiprologout$$ 2>&1
  if [ $? -ne 0 ]; then
    echo "ERROR: Cannot execute SWI-Prolog ($SWIPROLOG):"
    cat /tmp/swiprologout$$
    echo "Please put a correct definition for SWIPROLOG in $HOMEINITRC !"
    rm /tmp/swiprologout$$
    exit 1
  else
    ln -s .pakcs_wrapper swiprolog
    rm /tmp/swiprologout$$
  fi
fi
cd $PAKCSHOME


# Adjust mccparser/src/Makefile:
if [ -d mccparser/src ] ; then
  cd mccparser/src
  mv Makefile Makefile~
  cat Makefile~ | \
    sed 's|^HC *=.*$|HC='$GHC'|' > Makefile
  cd $PAKCSHOME
fi

# Adjust tc2java/curry/Makefile:
if [ -d tc2java/curry ] ; then
  cd tc2java/curry
  mv Makefile Makefile~
  cat Makefile~ | \
    sed 's|^PIZZAC=.*$|PIZZAC='$PIZZAC'|' | \
    sed 's|^PAKCSCLASSPATH=.*$|PAKCSCLASSPATH='$CLASSPATH'|' > Makefile
  cd $PAKCSHOME
fi

# Save current values for future installations:
cp $PAKCSINITRC $HOMEINITRC
chmod 644 $PAKCSINITRC

# Report current values:
echo '======================================================================'
echo 'PAKCS installation configured with (saved in '$HOME'/.pakcsinitrc):'
echo "SICSTUS=$SICSTUS"
echo "SWIPROLOG=$SWIPROLOG"
echo "SPLD=$SPLD"
if [ -n "$GHC"    ] ; then echo "GHC=$GHC" ; fi
echo '======================================================================'
