#!/bin/sh

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

usage()
{
    echo "runConfigure: Helper script to run \"configure\" for one of the supported platforms"
    echo "Usage: runConfigure \"<platform_name>\" [ args .. ] "
    echo "       where <platform is the platform you want"
    echo "       valid choices are :"
    echo "          1. 'AIX4.1.5xlC' if you are using xlC on AIX4.1.5"
    echo "          2. 'SOLARISCC' if you are using native CC compiler on Solaris"
    echo "          3. 'SOLARISGCC' if you are using GNU C++ compiler on Solaris"
    echo "          4. 'LinuxRedHat5.2 or LinuxRedHat6.0' if you are using GNU C++ compiler on Linux"
    echo "          5. 'HP/UX10.2CC' if you are using native C++ compiler on HP-UX10.2"
    echo "          6. 'HP/UX10.2ACC' if you are using Advanced C++ compiler on HP-UX10.2"
    echo "          7. 'HP/UX11CC' if you are using native C++ compiler on HP-UX11"
    echo "          8. 'HP/UX11ACC' if you are using Advanced C++ compiler on HP-UX11"
    echo "          9. 'AIX4.3xlC' if you are using xlC on AIX4.3"
    echo "          10. 'SOL2.7CC'if you are using native CC compiler on Solaris"
    echo "          11. 'PTX' if you are using c++ on Dynix/PTX v4.5"
    echo "          12. 'SOLARISX86' if you are using the native CC compiler on Solarisx86"
    echo "          13. 'AIX4.3VA' if you are using VA compiler on AIX4.3"
    echo
    echo "Any other options will be passed on to configure. (see 'configure --help')"

 }

if test ${1}o = "o"; then
   usage
   exit 0
fi

if test $1 = "-h"; then
   usage
   exit 0
fi

platform=${1};

shift

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)
                echo Running configure "$@"  for AIX using xlC compiler ...
                CC=/usr/lpp/xlC/bin/xlc; export CC
                CXX=/usr/lpp/xlC/bin/xlC_r; export CXX
                #CPPFLAGS=-I/usr/lpp/xlC/include; export CPPFLAGS
                #LDFLAGS=-L/usr/lpp/xlC/lib; export LDFLAGS
                $configure "$@"  ;;
        AIX4.3xlC)
                echo Running configure "$@"  for AIX using xlC compiler ...
                CC=/usr/ibmcxx/bin/xlc; export CC
                CXX=/usr/ibmcxx/bin/xlC_r; export CXX
                #CPPFLAGS=-I/usr/lpp/xlC/include; export CPPFLAGS
                #LDFLAGS=-L/usr/lpp/xlC/lib; export LDFLAGS
                $configure "$@"  ;;
        AIX4.3VA)
                echo Running configure "$@"  for AIX using xlC compiler ...
                CC=/usr/vacpp/bin/xlc; export CC
                CXX=/usr/vacpp/bin/xlC_r; export CXX
                #CPPFLAGS=-I/usr/lpp/xlC/include; export CPPFLAGS
                #LDFLAGS=-L/usr/lpp/xlC/lib; export LDFLAGS
                $configure "$@"  ;;
        SOLARISCC)
                echo Running configure "$@"  for SOLARIS using native CC compiler ...
                CC=/usr/local/SUNWspro/bin/cc; export CC
                CXX=/usr/local/SUNWspro/bin/CC; export CXX
                $configure "$@"  ;;
        SOLARISGCC)
                echo Running configure "$@"  for Solaris using gcc compiler ...
                CXXFLAGS=-I/usr/local/include/g++; export CXXFLAGS
				LDFLAGS=-R/usr/local/lib; export LDFLAGS
                $configure "$@"  ;;
        SOL2.7CC)
                echo Running configure "$@"  for SOLARIS2.7cc using native CC compiler
                CC=/usr/local/SUNWspro/bin/cc; export CC
                CXX=/usr/local/SUNWspro/bin/CC; export CXX 
                $configure "$@"  ;;

        SOLARISX86)
                echo Running configure "$@" for SOLARISX86 using native CC compiler
                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
                $configure "$@" ;;

        LinuxRedHat*)
                echo Running configure "$@"  for Linux using gcc compiler ...
                CXX=g++; export CXX 
		        CC=gcc; export CC
                CXXFLAGS=-g; export CXXFLAGS
		        CFLAGS=-g; export CFLAGS
                $configure "$@"  ;;
        HP/UX10.2CC)
                echo Running configure "$@"  for HP10.2 using native CC compiler ...
				CC=cc; export CC
				CXX=CC; export CXX
			    $configure "$@" ;;
        HP/UX10.2ACC)
                echo Running configure "$@"  for HP10.2 using aCC compiler ...
				CC=cc; export CC
				CXX=aCC; export CXX
                $configure "$@" ;;
        HP/UX11CC)
                echo Running configure "$@"  for HP11 using native CC compiler ...
                CC=cc; export CC
				CXX=/opt/CC/bin/CC; export CXX
                $configure "$@" ;;
        HP/UX11ACC)
                echo Running configure "$@"  for HP11 using aCC compiler ...
                CC=cc; export CC
				CXX=/opt/aCC/bin/aCC; export CXX
			    $configure "$@" ;;
        PTX)
                echo Running configure "$@"  for PTX using c++ compiler ...
                CC=cc; export CC
				CXX=c++; export CXX
		if test ${XMLINSTALL}o = "o"; then 
			XMLINSTALL=/usr/local; export XMLINSTALL
		fi
		$configure --prefix=$XMLINSTALL "$@" ;;
        *)
                echo I do not recognize the option \"$platform\". Please type ${0} -h for help.
                exit 0;;
esac

echo
echo If the result of the above commands look OK to you, go to the directory
echo $icu/source to build the icu.

