#!/bin/sh
# Copyright (c) 1999-2015, International Business Machines Corporation and
# others. All Rights Reserved.

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

me=`basename $0`
OPTS=

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

If you want to add custom CFLAGS or CXXFLAGS or similar, provide them _before_
the runConfigureICU command:

    CXXFLAGS=xyz path/to/runConfigureICU --enable-debug ...

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

    AIX                 Use the IBM Visual Age xlc_r/xlC_r compilers on AIX
    AIX/GCC             Use the GNU gcc/g++ compilers on AIX
    Cygwin              Use the GNU gcc/g++ compilers on Cygwin
    Cygwin/MSVC         Use the Microsoft Visual C++ compiler on Cygwin
    Cygwin/MSVC2005     Use the Microsoft Visual C++ 2005 compiler on Cygwin
    Cygwin/ICL          Use the Intel C++ compiler on Cygwin
    FreeBSD             Use the clang/clang++ or GNU gcc/g++ compilers on FreeBSD
    HP-UX/ACC           Use the HP ANSI C/Advanced C++ compilers on HP-UX 11
    IBMi                Use the iCC compilers on IBM i, i5/OS, OS/400
    Linux               Use the clang/clang++ or GNU gcc/g++ compilers on Linux
    Linux/gcc           Use the GNU gcc/g++ compilers on Linux
    Linux/ECC           Use the Intel ECC compiler on Linux
    Linux/ICC           Use the Intel ICC compiler on Linux
    Linux/VA            Use the IBM Visual Age compiler on Power PC Linux
    MacOSX              Use the default compilers on MacOS X (Darwin)
    MacOSX/GCC          Use the GNU gcc/g++ compilers on MacOSX (Darwin)
    MinGW               Use the GNU gcc/g++ compilers on MinGW
    MSYS/MSVC           Use the Microsoft Visual C++ computer on MSYS
    QNX                 Use the QNX QCC compiler on QNX/Neutrino
    Solaris             Use the Sun cc/CC compilers on Solaris
    Solaris/GCC         Use the GNU gcc/g++ compilers on Solaris
    SolarisX86          Use the Sun cc/CC compilers on Solaris x86
    TRU64V5.1/CXX       Use the Compaq cxx compiler on Tru64 (OSF)
    zOS                 Use the IBM cxx compiler on z/OS (os/390)
    zOSV1R2             Use the IBM cxx compiler for z/OS 1.2
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
        OPTS="$OPTS --enable-debug"
        ;;
    --disable-release)
        release=0
        OPTS="$OPTS --disable-release"
        ;;
    *)
        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
    AIX)
        THE_OS=AIX
        THE_COMP="xlC_r"
        CC=`which xlc_r`; export CC
        if [ ! -x $CC ]; then
           echo "ERROR: xlc_r was not found, please check the PATH to make sure it is correct."; exit 1
        fi
        CXX=`which xlC_r`; export CXX
        if [ ! -x $CXX ]; then
           echo "ERROR: xlC_r was not found, please check the PATH to make sure it is correct."; exit 1
        fi
        RELEASE_CFLAGS="-O2 -qmaxmem=-1"
        RELEASE_CXXFLAGS="-O2 -qmaxmem=-1"
        ;;
    AIX/GCC)
        THE_OS=AIX
        THE_COMP="the GNU C++"
        CC=gcc; export CC
        CXX=g++; export CXX
        DEBUG_CFLAGS='-g -O0'
        DEBUG_CXXFLAGS='-g -O0'
        ;;
    Solaris)
        THE_OS=SOLARIS
        THE_COMP="Sun's CC"
        CC=`which cc`; export CC
        CXX=`which CC`; export CXX
        RELEASE_CFLAGS="-xO1 -xlibmil"
        RELEASE_CXXFLAGS="-O4 -xlibmil"
        ;;
    Solaris/GCC)
        THE_OS=SOLARIS
        THE_COMP="the GNU C++"
        CC=gcc; export CC
        CXX=g++; export CXX
        RELEASE_CFLAGS=-O1
        RELEASE_CXXFLAGS=-O2
        ;;
    SolarisX86)
        THE_OS="SOLARIS X86"
        THE_COMP="Sun's CC"
        CC=`which cc`; export CC
        CXX=`which CC`; export CXX
        LDFLAGS="${LDFLAGS} -lCrun";export LDFLAGS
        RELEASE_CFLAGS=-xO3
        RELEASE_CXXFLAGS=-O3
        ;;
    HP-UX/ACC)
        THE_OS="HP-UX 11"
        THE_COMP="aCC"
        CC=cc; export CC
        CXX=aCC; export CXX
        RELEASE_CFLAGS='+O2 +Ofltacc'
        RELEASE_CXXFLAGS='+O2 +Ofltacc'
        ;;
    IBMi)
        THE_OS="IBM i"
        THE_COMP="the iCC C++"
        CC=icc; export CC
        CXX=icc; export CXX
        CPP="$CC -c -qpponly"; export CPP
        MAKE=gmake; export MAKE
        U_MAKE=gmake; export U_MAKE
        # gmake is a .pgm and may not be on the path.  Don't use a full path, just use gmake.
        ac_cv_path_U_MAKE=gmake; export ac_cv_path_U_MAKE
        RELEASE_CFLAGS='-O4'
        RELEASE_CXXFLAGS='-O4'
        ;;
    Linux/ECC)
        THE_OS="Linux"
        THE_COMP="Intel ECC 7.1"
        CC=ecc; export CC
        CXX=ecpc; export CXX
        RELEASE_CFLAGS='-O2'
        RELEASE_CXXFLAGS='-O2'
        ;;
    Linux/ICC)
        THE_OS="Linux"
        CC=`which icc`; export CC
        CXX=`which icpc`; export CXX
	ICC_VER=`${CC} -v 2>&1`
        RELEASE_CFLAGS='-O'
        RELEASE_CXXFLAGS='-O'
        export CFLAGS="-fp-model precise"
        export CXXFLAGS="-fp-model precise"
	if [ "${ICC_VER}" = "Version 9.0 " ]; then
		RELEASE_CFLAGS=''
		RELEASE_CXXFLAGS=''
		export CFLAGS="${CFLAGS} -O0"
		export CXXFLAGS="${CXXFLAGS} -O0"
		echo "ICC 9.0 does not work with optimization- disabling optimizations"
	fi
        THE_COMP="Intel ${ICC_VER}"
        ;;
    Linux/VA)
        THE_OS="Linux"
        THE_COMP="IBM Visual Age C++ Compiler"
        CC=`which xlc_r`; export CC
        CXX=`which xlC_r`; export CXX
        RELEASE_CFLAGS="-O2 -qmaxmem=-1"
        RELEASE_CXXFLAGS="-O2 -qmaxmem=-1"
        ;;
    Linux/gcc)
        THE_OS="Linux"
        THE_COMP="the GNU C++"
        CC=gcc; export CC
        CXX=g++; export CXX
        RELEASE_CFLAGS='-O3'
        RELEASE_CXXFLAGS='-O3'
        DEBUG_CFLAGS='-g'
        DEBUG_CXXFLAGS='-g'
        ;;
    Linux*)
        THE_OS="Linux"
        THE_COMP="the clang or else GNU C++"
        RELEASE_CFLAGS='-O3'
        RELEASE_CXXFLAGS='-O3'
        DEBUG_CFLAGS='-g'
        DEBUG_CXXFLAGS='-g'
        ;;
    Cygwin)
        THE_OS="Cygwin"
        THE_COMP="the GNU C++"
        RELEASE_CFLAGS='-O3'
        RELEASE_CXXFLAGS='-O3'
        ;;
    Cygwin/MSVC)
        THE_OS="Windows with Cygwin"
        THE_COMP="Microsoft Visual C++"
        CC=cl; export CC
        CXX=cl; export CXX
        RELEASE_CFLAGS='-Gy -MD'
        RELEASE_CXXFLAGS='-Gy -MD'
        DEBUG_CFLAGS='-Zi -MDd'
        DEBUG_CXXFLAGS='-Zi -MDd'
        DEBUG_LDFLAGS='-DEBUG'
        ;;
    Cygwin/MSVC2005)
        THE_OS="Windows with Cygwin"
        THE_COMP="Microsoft Visual C++ 2005"
        CC=cl; export CC
        CXX=cl; export CXX
        RELEASE_CFLAGS='/Gy /MD'
        RELEASE_CXXFLAGS='/Gy /MD'
        DEBUG_CFLAGS='/Zi /MDd'
        DEBUG_CXXFLAGS='/Zi /MDd'
        DEBUG_LDFLAGS='/DEBUG'
        ;;
    Cygwin/ICL)
        THE_OS="Windows with Cygwin"
        THE_COMP="Intel C++"
        CC=icl; export CC
        CXX=icl; export CXX
        # The Intel compiler has optimization bugs. So we disable optimization.
        RELEASE_CFLAGS='/Od'
        RELEASE_CXXFLAGS='/Od'
        DEBUG_CFLAGS='/Zi'
        DEBUG_CXXFLAGS='/Zi'
        DEBUG_LDFLAGS='/DEBUG'
        ;;
    MacOSX)
        THE_OS="MacOS X (Darwin)"
        THE_COMP="the default"
        RELEASE_CFLAGS='-O2'
        RELEASE_CXXFLAGS='-O2'
        DEBUG_CFLAGS='-g -O0'
        DEBUG_CXXFLAGS='-g -O0'
        ;;
    MacOSX/GCC)
        THE_OS="MacOS X (Darwin)"
        THE_COMP="the GNU C++"
        RELEASE_CFLAGS='-O2'
        RELEASE_CXXFLAGS='-O2'
        DEBUG_CFLAGS='-g -O0'
        DEBUG_CXXFLAGS='-g -O0'
        CC=gcc; export CC
        CXX=g++; export CXX
        ;;
    MinGW)
        THE_OS="MinGW"
        THE_COMP="the GNU C++"
        RELEASE_CFLAGS='-O3'
        RELEASE_CXXFLAGS='-O3'
        CXXFLAGS="--std=c++03"
        export CXXFLAGS
        ;;
    MSYS/MSVC)
        THE_OS="MSYS"
        THE_COMP="Microsoft Visual C++"
        CC=cl; export CC
        CXX=cl; export CXX
        RELEASE_CFLAGS='-Gy -MD'
        RELEASE_CXXFLAGS='-Gy -MD'
        DEBUG_CFLAGS='-Zi -MDd'
        DEBUG_CXXFLAGS='-Zi -MDd'
        DEBUG_LDFLAGS='-DEBUG'
        ;;
    *BSD)
        THE_OS="BSD"
        THE_COMP="the GNU C++"
        DEBUG_CFLAGS='-g -O0'
        DEBUG_CXXFLAGS='-g -O0'
        ;;
    TRU64V5.1/CXX)
        THE_OS="OSF1"
        THE_COMP="Compaq cxx"
        CC=cc; export CC
        CXX=cxx; export CXX
        ;;
    QNX)
        THE_OS="QNX"
        THE_COMP="QNX cc"
        CC=qcc; export CC
        CXX=QCC; export CXX
        ;;
    zOS)
        THE_OS="z/OS (OS/390)"
        THE_COMP="z/OS C/C++"
        CC=xlc; export CC
        CXX=xlC; export CXX
        RELEASE_CFLAGS="-O2 -Wc,'inline(AUTO,NOREPORT,1000,8000)'"
        RELEASE_CXXFLAGS="-O2 -Wc,'inline(AUTO,NOREPORT,1000,8000)'"
        ;;
    zOSV1R2)
        THE_OS="z/OS 1.2"
        THE_COMP="z/OS 1.2 C/C++"
        CC=cc; export CC
        CXX=cxx; export CXX
        export COMPILE_LINK_ENVVAR='_CXX_CICC_VER}=0x41020000 _C89_CVERSION=0x41020000 _CC_CVERSION=0x41020000 _CXX_PVERSION=0x41020000 _C89_PVERSION=0x41020000 _CC_PVERSION=0x41020000'
        export _CXX_CVERSION=0x41020000 _C89_CVERSION=0x41020000 _CC_CVERSION=0x41020000 _CXX_PVERSION=0x41020000 _C89_PVERSION=0x41020000 _CC_PVERSION=0x41020000
        export LDFLAGS="-Wl,'compat=pm3'"
        export CFLAGS="-Wc,'target(zOSV1R2)'"
        export CXXFLAGS="-Wc,'target(zOSV1R2)'"
        RELEASE_CFLAGS="-2 -Wc,'inline(auto,noreport,500,4000)'"
        RELEASE_CXXFLAGS="-2 -Wc,'inline(auto,noreport,500,4000)'"
        ;;
    *)
        >&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="$RELEASE_CFLAGS $CFLAGS"
    fi
    if test "$RELEASE_CXXFLAGS" = ""
    then
        case $CXX in
            g++|*/g++|*-g++-*|*/*-g++-*)
                RELEASE_CXXFLAGS=-O3
                ;;
        esac
    fi
    if test "$RELEASE_CXXFLAGS" != ""
    then
        CXXFLAGS="$RELEASE_CXXFLAGS $CXXFLAGS"
    fi
    if test "$RELEASE_LDFLAGS" != ""
    then
        LDFLAGS="$RELEASE_LDFLAGS $LDFLAGS"
    fi
fi

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

export CFLAGS
export CXXFLAGS
export LDFLAGS

# Run configure

echo "export CPP=$CPP CC=$CC CXX=$CXX CPPFLAGS=$CPPFLAGS CFLAGS=$CFLAGS CXXFLAGS=$CXXFLAGS LDFLAGS=$LDFLAGS MAKE=$MAKE"
echo "Running ./configure $OPTS $@ for $THE_OS using $THE_COMP compiler"
echo
if $configure $OPTS $@
then
	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...
else
	echo $0: ./configure failed
	exit 1
fi
