#!/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
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

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
		RELEASE_CXXFLAGS=+O2
		;;
        HP/UX10.2ACC)
		THE_OS="HP-UX 10.2"
		THE_COMP="aCC"
		CC=cc; export CC
		CXX=aCC; export CXX
		RELEASE_CFLAGS=+O2
		RELEASE_CXXFLAGS=+O2
		;;
        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
		RELEASE_CXXFLAGS=+O2
                ;;
        HP/UX11ACC)
		THE_OS="HP-UX 11"
		THE_COMP="aCC"
                CC=cc; export CC
		CXX=/opt/aCC/bin/aCC; export CXX
		RELEASE_CFLAGS=+O2
		RELEASE_CXXFLAGS=+O2
		;;
        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"
		;;
        *)
                >&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...

