#!/bin/sh

# runConfigureICU: This script will run the "configure" script for the appropriate platform
# Only supported platforms are recognized

me=`basename $0`

usage()
{
    ec=0$1
    if test $ec -eq 0
    then
        uletter=U
    else
 	uletter=u
    fi
    
    echo "${uletter}sage: $me [ -h, --help ]  [ --enable-debug | --disable-release ] platform [ configurearg ... ]"
    if test $ec -eq 0
    then
	cat <<EOE

Options: -h, --help         Print this message and exit
         --enable-debug	    Enable support for debugging
	 --disable-release  Disable presetting optimization flags

The following names can be supplied as the argument for platform:

    AIX4.1.5xlC             Use xlC on AIX 4.1.5
    AIX4.3xlC               Use xlC on AIX 4.3
    AIX4.3VA                Use the VA compiler on AIX 4.3
    SOLARISCC               Use Sun's CC compiler on Solaris 
    SOL2.7CC                Same as above
    SOLARISGCC              Use the GNU C++ compiler on Solaris
    SOLARISX86              Use Sun's CC compiler on Solaris x86
    LinuxRedHat5.2          Use the GNU C++ compiler on Linux
    LinuxRedHat6.0          Same as above
    HP/UX10.2CC             Use HP's C++ compiler on HP-UX 10.2
    HP/UX10.2ACC            Use the Advanced C++ compiler on HP-UX 10.2
    HP/UX11CC               Use HP's C++ compiler on HP-UX 11
    HP/UX11ACC              Use the Advanced C++ compiler on HP-UX 11
    PTX                     Use C++ on Dynix/PTX v4.5
    ALPHA/LINUXGCC	    Use GCC on Alpha/Linux systems
    ALPHA/LINUXCCC	    Use Compaq C compiler on Alpha/Linux systems
EOE
    fi

    exit $ec
}

# Parse arguments

platform=
debug=0
release=1

while test $# -ne 0
do
    case "$1" in
	-h|--help)
	    usage 0
	    ;;
	--enable-debug)
	    debug=1
	    release=0
	    ;;
	--disable-release)
	    debug=0
	    release=0
	    ;;
	*)
	    platform="$1"
	    shift
	    break
	    ;;
    esac
    shift
done

if test x$platform = x
then
   usage 1
fi

# Go.

rm -f config.cache
rm -f config.log
rm -f config.status

DEBUG_CFLAGS='-g'
DEBUG_CXXFLAGS='-g'

if test x$configure = x
then
    if test -f ./configure
    then
        configuredir=.
    else
        configuredir=`echo $0 | sed 's,[^/]*$,,'`
        if test x$configuredir = x$0
        then
            configuredir=.
        fi
    fi

    if test x$configuredir = x
    then
        configuredir=.
    fi

    configure=$configuredir/configure
fi

case $platform in
        AIX4.1.5xlC)
		THE_OS=AIX
		THE_COMP=xlC
                CC=/usr/lpp/xlC/bin/xlc; export CC
                CXX=/usr/lpp/xlC/bin/xlC_r; export CXX
		RELEASE_CFLAGS="-qignerrno"
		RELEASE_CXXFLAGS="-qignerrno"
                #CPPFLAGS=-I/usr/lpp/xlC/include; export CPPFLAGS
                #LDFLAGS=-L/usr/lpp/xlC/lib; export LDFLAGS
		;;
        AIX4.3xlC)
		THE_OS=AIX
		THE_COMP=xlC
                CC=/usr/ibmcxx/bin/xlc; export CC
                CXX=/usr/ibmcxx/bin/xlC_r; export CXX
		RELEASE_CFLAGS="-qignerrno"
		RELEASE_CXXFLAGS="-qignerrno"
                #CPPFLAGS=-I/usr/lpp/xlC/include; export CPPFLAGS
                #LDFLAGS=-L/usr/lpp/xlC/lib; export LDFLAGS
		;;
        AIX4.3VA)
		THE_OS=AIX
		THE_COMP=xlC
                CC=/usr/vacpp/bin/xlc; export CC
                CXX=/usr/vacpp/bin/xlC_r; export CXX
		#RELEASE_CFLAGS=-O2
		#RELEASE_CXXFLAGS=-O2
                #CPPFLAGS=-I/usr/lpp/xlC/include; export CPPFLAGS
                #LDFLAGS=-L/usr/lpp/xlC/lib; export LDFLAGS
                ;;
        SOL2.7CC)
		THE_OS="SOLARIS 2.7"
		THE_COMP="Sun's CC"
                CC=/usr/local/SUNWspro/bin/cc; export CC
                CXX=/usr/local/SUNWspro/bin/CC; export CXX 
		RELEASE_CFLAGS=-xO3
		RELEASE_CXXFLAGS=-O3
                ;;
        SOLARISX86)
		THE_OS="SOLARIS X86"
		THE_COMP="Sun's CC"
                CC=cc; export CC
                CXX=CC; export CXX
                CXX_FLAGS="-w -O";export CXX_FLAGS
                C_FLAGS="-w -O";export C_FLAGS
                LDFLAGS="-L -lCrun";export LDFLAGS
		RELEASE_CFLAGS=-xO3
		RELEASE_CXXFLAGS=-O3
                ;;
        SOLARISCC)
		THE_OS=SOLARIS
		THE_COMP="Sun's CC"
                CC=/usr/local/SUNWspro/bin/cc; export CC
                CXX=/usr/local/SUNWspro/bin/CC; export CXX
		RELEASE_CFLAGS=-xO3
		RELEASE_CXXFLAGS=-O3
                ;;
        SOLARISGCC)
		THE_OS=SOLARIS
		THE_COMP="the GNU C++"
                CXXFLAGS=-I/usr/local/include/g++; export CXXFLAGS
		LDFLAGS=-R/usr/local/lib; export LDFLAGS
                ;;
        LinuxRedHat*)
		THE_OS=Linux
		THE_COMP="the GNU C++"
                CXX=g++; export CXX 
		CC=gcc; export CC
		;;
        HP/UX10.2CC)
		THE_OS="HP-UX 10.2"
		THE_COMP="HP's CC"
		CC=cc; export CC
		CXX=CC; export CXX
		RELEASE_CFLAGS='+O2 +Ofltacc'
		RELEASE_CXXFLAGS='+O2 +Ofltacc'
		;;
        HP/UX10.2ACC)
		THE_OS="HP-UX 10.2"
		THE_COMP="aCC"
		CC=cc; export CC
		CXX=aCC; export CXX
		RELEASE_CFLAGS='+O2 +Ofltacc'
		RELEASE_CXXFLAGS='+O2 +Ofltacc'
		;;
        HP/UX11CC)
		THE_OS="HP-UX 11"
		THE_COMP="HP's CC"
                CC=cc; export CC
		CXX=/opt/CC/bin/CC; export CXX
		RELEASE_CFLAGS='+O2 +Ofltacc'
		RELEASE_CXXFLAGS='+O2 +Ofltacc'
                ;;
        HP/UX11ACC)
		THE_OS="HP-UX 11"
		THE_COMP="aCC"
                CC=cc; export CC
		CXX=/opt/aCC/bin/aCC; export CXX
		RELEASE_CFLAGS='+O2 +Ofltacc'
		RELEASE_CXXFLAGS='+O2 +Ofltacc'
		;;
        PTX)
		THE_OS="PTX"
		THE_COMP="C++"
                CC=cc; export CC
		CXX=c++; export CXX
		if test ${XMLINSTALL}o = "o"; then 
		    XMLINSTALL=/usr/local; export XMLINSTALL
		fi
		configure="$configure --prefix=$XMLINSTALL"
		;;
	ALPHA/LINUXCCC)
		THE_OS="Linux"
		THE_COMP="Compaq's CC"
		CC=ccc; export CC
		CXX=cxx; export CXX
		;;
	ALPHA/LINUXGCC)
		THE_OS="Linux"
                THE_COMP="the GNU C++"
                CXX=g++; export CXX
                CC=gcc; export CC
		;;
        *)
                >&2 echo "$me: unrecognized platform \"$platform\" (use --help for help)"
                exit 1;;
esac


# Tweak flags

if test $release -eq 1
then
    if test "$RELEASE_CFLAGS" = ""
    then
        case $CC in
            gcc|*/gcc|*-gcc-*|*/*-gcc-*)
                RELEASE_CFLAGS=-O3
                ;;
        esac
    fi
    if test "$RELEASE_CFLAGS" != ""
    then
        CFLAGS="$CFLAGS $RELEASE_CFLAGS"
    fi
    export CFLAGS
    if test "$RELEASE_CXXFLAGS" = ""
    then
        case $CXX in
            g++|*/g++|*-g++-*|*/*-g++-*)
                RELEASE_CXXFLAGS=-O
                ;;
        esac
    fi
    if test "$RELEASE_CXXFLAGS" != ""
    then
        CXXFLAGS="$CXXFLAGS $RELEASE_CXXFLAGS"
    fi
    export CXXFLAGS
fi

if test $debug -eq 1
then
    if test "$DEBUG_CFLAGS" != ""
    then
        CFLAGS="$CFLAGS $DEBUG_CFLAGS"
    fi
    export CFLAGS
    if test "$DEBUG_CXXFLAGS" != ""
    then
        CXXFLAGS="$CXXFLAGS $DEBUG_CXXFLAGS"
    fi
    export CXXFLAGS
fi

# Run configure

echo Running ./configure "$@" for $THE_OS using $THE_COMP compiler
echo
$configure "$@"
echo
echo If the result of the above commands looks okay to you, go to the directory
echo source in the ICU distribution to build ICU. Please remember that ICU needs
echo GNU make to build properly...

