#!/bin/sh

# ToDo: Move configuration script and file to the top-level.

echo "Configuration of HGL"
echo "===================="
echo

CONFIG=config.mk

if [ $# -ge 1 ]
then
    if ./isgnumake 3 76 $1
    then
	MAKE=$1
    else
        echo "You need to run GNU Make 3.76 or later."
	exit 1
    fi
else
    if ./isgnumake 3 76 make
    then
        MAKE=make
    elif ./isgnumake 3 76 gmake
    then
        echo "Note that GNU Make 3.76 or later is needed. Use 'gmake'!"
	echo
        MAKE=gmake
    else
        echo "Cannot find GNU Make 3.76 or later."
	exit 1
    fi
fi

# Read old configuration parameters if any.
if [ -f ${CONFIG} ]
then
    OLD_HASKELL_SYSTEM=`awk -F= '/^haskell_system=/ {print $2}' ${CONFIG}`
    OLD_INTERPRET_GC=`awk -F= '/^interpret_GC=/ {print $2}' ${CONFIG}`
    OLD_GC_SOURCE_DIR=`awk -F= '/^GC_source_dir=/ {print $2}' ${CONFIG}`
    OLD_PREFIX=`awk -F= '/^prefix=/ {print $2}' ${CONFIG}`
    OLD_X_DIR=`awk -F= '/^X_dir=/ {print $2}' ${CONFIG}`
fi
DEFAULT_HASKELL_SYSTEM=${OLD_HASKELL_SYSTEM:-hugs}
DEFAULT_INTERPRET_GC=${OLD_INTERPRET_GC:-no}
DEFAULT_GC_SOURCE_DIR=${OLD_GC_SOURCE_DIR:-${HOME}/gc-2.01}
DEFAULT_PREFIX=${OLD_PREFIX:-/usr/local}
DEFAULT_X_DIR=${OLD_X_DIR:-/usr/X11R6}

# Figure out OS type.
SYSTEM=`uname -s`
echo "This apperas to be a ${SYSTEM} system."
case ${SYSTEM} in
    Linux | FreeBSD | NetBSD | SunOS)
	echo "${SYSTEM} is supported, so hopefully there should be no need"
	echo "to make any manual alterations of the makefiles." ;;
    *)
        echo "${SYSTEM} is not supported, so you may have to adapt the"
	echo "makefiles to make things work."
	SYSTEM = Unixlike ;;
esac
echo

# Get desired Haskell system.
echo "Enter desired Haskell system, one of"
echo "  - ghc"
echo "  - hugs"
echo "(default: ${DEFAULT_HASKELL_SYSTEM}):"
PROCEED=""
while [ ! "${PROCEED}" ]
do
    read USER_HASKELL_SYSTEM
    HASKELL_SYSTEM=${USER_HASKELL_SYSTEM:-${DEFAULT_HASKELL_SYSTEM}}
    case ${HASKELL_SYSTEM} in
      ghc | GHC)
	HASKELL_SYSTEM=ghc
	PROCEED="T" ;;      
      hugs | Hugs | HUGS)
	HASKELL_SYSTEM=hugs
	PROCEED="T" ;;      
      *)
        echo "Please select one of the indicated systems or press return."
    esac
done
echo

# Run GreenCard interpreted?
if [ -f "X.c" ]
then

  echo "You already have GreenCard generated files so you probably don't"
  echo "need a copy of GreenCard."
  
  echo "But if you want to modify the library, you may need GreenCard"
  echo "and can choose to use a GreenCard 2 binary (if you have it installed)"
  echo "or you can opt to run GreenCard interpreted by Hugs."
  echo "Would you like to run GreenCard interpreted" \
       "(default: ${DEFAULT_INTERPRET_GC})?"
  echo "Say no if you don't need GreenCard"

else

  echo "If you don't have a GreenCard 2 binary installed, but if you do have"
  echo "Hugs and the GreenCard 2 sources, you can opt to run GreenCard"
  echo "interpreted."
  echo "Would you like to run GreenCard interpreted" \
       "(default: ${DEFAULT_INTERPRET_GC})?"

fi

PROCEED=""
while [ ! "${PROCEED}" ]
do
    read INTERPRET_GC
    INTERPRET_GC=${INTERPRET_GC:-${DEFAULT_INTERPRET_GC}}
    case ${INTERPRET_GC} in
      yes | YES | Yes | y | Y)
	INTERPRET_GC=yes
        PROCEED="T" ;;
      no | NO | No | N | n)
	INTERPRET_GC=no
        PROCEED="T" ;;
      *)
        echo "Please answer yes or no."
        echo "Run GreenCard interpreted (default: ${DEFAULT_INTERPRET_GC})?" ;;
    esac
done
echo
if [ ${INTERPRET_GC} = "yes" ]
then
    echo "Please enter the top-level directory of the GreenCard 2 source"
    echo "installation (default: $DEFAULT_GC_SOURCE_DIR):"
    PROCEED=""
    while [ ! "${PROCEED}" ]
    do
	read GC_SOURCE_DIR
	GC_SOURCE_DIR=${GC_SOURCE_DIR:-${DEFAULT_GC_SOURCE_DIR}}
	if [ -f "${GC_SOURCE_DIR}/src/GreenCard.lhs" ]
	then
	    PROCEED="T"
	else
	    echo "${GC_SOURCE_DIR} does not exist or does not appear to be" \
		 "the GreenCard root."
	    echo "GreenCard source root (default: ${DEFAULT_GC_SOURCE_DIR}):"
	fi
    done
    echo
fi

# Get installation prefix.
echo "Where do you want to install HGL?"
echo "Please choose an existing directory with subdirectories lib and doc"
echo "(default: ${DEFAULT_PREFIX}):"
PROCEED=""
while [ ! "${PROCEED}" ]
do
    read USER_PREFIX
    PREFIX=${USER_PREFIX:-${DEFAULT_PREFIX}}
    if [ -d "${PREFIX}" ]
    then
	PROCEED="T"
    else
        echo "${PREFIX} does not exist or is not a directory."
	echo -n "Please choose an existing directory "
	echo "(default: ${DEFAULT_PREFIX}):"
    fi
done
echo

# Get X root.
echo "Enter X root directory (default: ${DEFAULT_X_DIR}):"
PROCEED=""
while [ ! "${PROCEED}" ]
do
    read USER_X_DIR
    X_DIR=${USER_X_DIR:-${DEFAULT_X_DIR}}
    if [ -f "${X_DIR}/lib/libX11.a" -o -f "${X_DIR}/lib/libX11.so" ]
    then
	PROCEED="T"
    else
        echo "${X_DIR} does not exist or does not seem to be the X root."
        echo "Enter X root directory (default: ${DEFAULT_X_DIR}):"
    fi
done
echo

# Get confirmation.
echo "HGL will be configured as follows:"
echo "  - system         = ${SYSTEM}"
echo "  - haskell_system = ${HASKELL_SYSTEM}"
echo "  - interpret_GC   = ${INTERPRET_GC}"
if [ ${INTERPRET_GC} = "yes" ]
then
    echo "  - GC_source_dir  = ${GC_SOURCE_DIR}"
fi
echo "  - prefix         = ${PREFIX}"
echo "  - X_dir          = ${X_DIR}"
echo "OK (yes/no)?"
PROCEED=""
while [ ! "${PROCEED}" ]
do
    read CONFIRM
    case ${CONFIRM} in
      yes | YES | Yes | y | Y)
        PROCEED="T" ;;
      no | NO | No | N | n)
        echo "Aborted."
        exit 1 ;;
      *)
        echo "Please answer yes or no."
        echo "OK (yes/no)?" ;;
    esac
done
echo

# Generate the new configuration file.
echo "# HGL configuration" > ${CONFIG}.tmp
echo "# Generated automatically; do NOT edit." >> ${CONFIG}.tmp
echo  >> ${CONFIG}.tmp
echo "system=${SYSTEM}" >> ${CONFIG}.tmp
echo "haskell_system=${HASKELL_SYSTEM}" >> ${CONFIG}.tmp
echo "interpret_GC=${INTERPRET_GC}" >> ${CONFIG}.tmp
if [ ${INTERPRET_GC} = "yes" ]
then
    echo "GC_source_dir=${GC_SOURCE_DIR}" >> ${CONFIG}.tmp
fi
echo "prefix=${PREFIX}" >> ${CONFIG}.tmp
echo "X_dir=${X_DIR}" >> ${CONFIG}.tmp

# Make sure everything is really clean after a re-configuration.
# We need to do this _before_ changing any old configuration file!
[ -f ${CONFIG} ] && ${MAKE} really-clean

# Preserve a backup of any old configuration file and activate the new one.
[ -f ${CONFIG} ] && cp ${CONFIG} ${CONFIG}.old
mv ${CONFIG}.tmp ${CONFIG}

echo "Done!"
