## -*-sh-*-
## BEGIN of icu-config-bottom.
## Copyright (c) 2002-2013, International Business Machines Corporation and
## others. All Rights Reserved.

ICUUC_FILE="${libdir}/${ICULIBS_COMMON_LIB_NAME}"
ICUUC_FILE_A="${libdir}/${ICULIBS_COMMON_LIB_NAME_A}"

#  echo ENABLE RPATH $ENABLE_RPATH and RPATHLDFLAGS=${RPATH_LDFLAGS}
if [ "x$PKGDATA_MODE" = "x" ]; then
    PKGDATA_MODE=dll
fi

}

## The actual code of icu-config goes here.

ME=`basename "$0"`

allflags()
{
    echo "  --noverify             Don't verify that ICU is actually installed."
    echo "  --bindir               Print binary directory path (bin)"
    echo "  --cc                   Print C compiler used [CC]"
    echo "  --cflags               Print C compiler flags [CFLAGS]"
    echo "  --cflags-dynamic       Print additional C flags for"
    echo "                             building shared libraries."
    echo "  --cppflags             Print C Preprocessor flags [CPPFLAGS]"
    echo "  --cppflags-dynamic     Print additional C Preprocessor flags for"
    echo "                             building shared libraries."
    echo "  --cppflags-searchpath  Print only -I include directives  (-Iinclude)"
    echo "  --cxx                  Print C++ compiler used [CXX]"
    echo "  --cxxflags             Print C++ compiler flags [CXXFLAGS]"
    echo "  --cxxflags-dynamic     Print additional C++ flags for"
    echo "                             building shared libraries."
    echo "  --detect-prefix        Attempt to detect prefix based on PATH"
    echo "  --exec-prefix          Print prefix for executables (/bin)"
    echo "  --exists               Return with 0 status if ICU exists else fail"
    echo "  --help, -?, --usage    Print this message"
    echo "  --icudata              Print shortname of ICU data file (icudt21l)"
    echo "  --icudata-install-dir  Print path to install data to - use as --install option to pkgdata(1)"
    echo "  --icudata-mode         Print default ICU pkgdata mode (dll) - use as --mode option to pkgdata(1)."
    echo "  --icudatadir           Print path to packaged archive data. Can set as [ICU_DATA]"
    echo "  --invoke               Print commands to invoke an ICU program"
    echo "  --invoke=<prog>        Print commands to invoke an ICU program named <prog> (ex: genrb)"
    echo "  --ldflags              Print -L search path and -l libraries to link with ICU [LDFLAGS].  This is for the data, uc (common), and i18n libraries only.  "
    echo "  --ldflags-layout       Print ICU layout engine link directive. Use in addition to --ldflags"
    echo "  --ldflags-libsonly     Same as --ldflags, but only the -l directives"
    echo "  --ldflags-searchpath   Print only -L (search path) directive"
    echo "  --ldflags-system       Print only system libs ICU links with (-lpthread, -lm)"
    echo "  --ldflags-icuio        Print ICU icuio link directive. Use in addition to --ldflags "
    echo "  --ldflags-obsolete     Print ICU obsolete link directive. Use in addition to --ldflags. (requires icuapps/obsolete to be built and installed.) "
    echo "  --mandir               Print manpage (man) path"
    echo "  --prefix               Print PREFIX to icu install (/usr/local)"
    echo "  --prefix=XXX           Set prefix to XXX for remainder of command"
    echo "  --sbindir              Print system binary path (sbin) "
    echo "  --shared-datadir       Print shared data (share) path. This is NOT the ICU data dir."
    echo "  --shlib-c              Print the command to compile and build C shared libraries with ICU"
    echo "  --shlib-cc             Print the command to compile and build C++ shared libraries with ICU"
    echo "  --sysconfdir           Print system config (etc) path"
    echo "  --unicode-version      Print version of Unicode data used in ICU ($UNICODE_VERSION)"
    echo "  --version              Print ICU version ($VERSION)"
    echo "  --incfile              Print path to Makefile.inc"
    echo "  --incpkgdatafile       Print path to pkgdata.inc (for -O option of pkgdata)"
    echo "  --install              Print path to install-sh"
    echo "  --mkinstalldirs        Print path to mkinstalldirs"
}

## Print the normal usage message
shortusage()
{
    echo "usage: ${ME} " `allflags | cut -c-25 | sed -e 's%.*%[ & ]%'`
}


usage()
{
    echo "${ME}: icu-config: ICU configuration helper script"
    echo
    echo "The most commonly used options will be --cflags, --cxxflags, --cppflags, and --ldflags."
    echo 'Example (in make):   CPFLAGS=$(shell icu-config --cppflags)'
    echo '                     LDFLAGS=$(shell icu-config --ldflags)'
    echo "                     (etc).."
    echo
    echo "Usage:"
    allflags

    echo
    echo " [Brackets] show MAKE variable equivalents,  (parenthesis) show example output"
    echo
    echo "Copyright (c) 2002-2013, International Business Machines Corporation and others. All Rights Reserved."
    echo
    echo "NOTE: Please consider using the pkg-config (.pc) files instead of icu-config."
    echo " See: <http://userguide.icu-project.org/howtouseicu#TOC-pkg-config> "
}

## Check the sanity of current variables
sanity()
{
    if [ ! -f "${ICUUC_FILE}" -a ! -f "${ICUUC_FILE_A}" ] && [ ${IGNORE_ICUUC_FILE_CHECK} = "no" ] && [ ${SANITY} = "sane" ];
    then
	echo "### $ME: Can't find ${ICUUC_FILE} - ICU prefix is wrong."  1>&2
	echo "###      Try the --prefix= option " 1>&2
	echo "###      or --detect-prefix" 1>&2
        echo "###      (If you want to disable this check, use  the --noverify option)" 1>&2
	echo "### $ME: Exitting." 1>&2
	exit 2
    fi
}

## Main starts here.

if [ $# -lt 1 ]; then
    shortusage
    exit 1
fi

# For certain options (e.g. --detect-prefix) don't check for icuuc library file.

IGNORE_ICUUC_FILE_CHECK="no";

SANITY="sane"

case "$1" in
--noverify)
    SANITY="nosanity"
    shift
    ;;
esac

case "$1" in
*prefix*)
    IGNORE_ICUUC_FILE_CHECK="yes"
    ;;
esac

# Load our variables from autoconf
# ALWAYS load twice because of dependencies
loaddefs
loaddefs

if [ $# -gt 0 -a $1 = "--selfcheck" ];
then
	echo "passed"
	exit
	# EXIT for self check
fi

sanity

while [ $# -gt 0 ];
do
    arg="$1"
    var=`echo $arg | sed -e 's/^[^=]*=//'`
#    echo "### processing $arg" 1>&2
    case "$arg" in

        # undocumented.
        --debug)
	    set -x
	    ;;

        --noverify)
            echo "### $ME: Error: --noverify must be the first argument." 1>&2
            exit 1
            ;;

    --so)
        echo $SO
        ;;

	--bindir)
	    echo $bindir
	    ;;

	--libdir)
	    echo $libdir
	    ;;

	--exists)
	    sanity
	    ;;

	--sbindir)
	    echo $sbindir
	    ;;

	--mkinstalldirs)
	    echo ${MKINSTALLDIRS}
	    ;;

	--install)
	    echo ${INSTALL}
	    ;;

	--invoke=*)
	    QUOT="\""
            CMD="${var}"

            # If it's not a locally executable command (1st choice) then
            # search for it in the ICU directories.
            if [ ! -x ${CMD} ]; then
                if [ -x ${bindir}/${var} ]; then
                    CMD="${bindir}/${var}"
                fi
                if [ -x ${sbindir}/${var} ]; then
                    CMD="${sbindir}/${var}"
                fi
            fi

	    echo "env ${QUOT}${LDLIBRARYPATH_ENVVAR}=${libdir}:"'${'"${LDLIBRARYPATH_ENVVAR}"'}'${QUOT} ${CMD}
	    ;;

	--invoke)
	    QUOT="\""
	    echo "env ${QUOT}${LDLIBRARYPATH_ENVVAR}=${libdir}:"'${'"${LDLIBRARYPATH_ENVVAR}"'}'${QUOT}
	    ;;

	--cflags)
	    echo $ECHO_N "${CFLAGS} ${ECHO_C}"
	    ;;

	--cc)
	    echo $ECHO_N "${CC} ${ECHO_C}"
	    ;;

	--cxx)
	    echo $ECHO_N "${CXX} ${ECHO_C}"
	    ;;

	--cxxflags)
	    echo $ECHO_N "${CXXFLAGS} ${ECHO_C}"
	    ;;

	--cppflags)
	    # Don't echo the -I. - it's unneeded.
	    echo $ECHO_N "${CPPFLAGS} ${ECHO_C}" | sed -e 's/-I. //'
	    ;;

	--cppflags-searchpath)
	    echo $ECHO_N "-I${prefix}/include ${ECHO_C}"
	    ;;

	--cppflags-dynamic)
	    echo $ECHO_N "${SHAREDLIBCPPFLAGS} ${ECHO_C}"
	    ;;

	--cxxflags-dynamic)
	    echo $ECHO_N "${SHAREDLIBCXXFLAGS} ${ECHO_C}"
	    ;;

	--cflags-dynamic)
	    echo $ECHO_N "${SHAREDLIBCFLAGS} ${ECHO_C}"
	    ;;

	--ldflags-system)
	    echo $ECHO_N "${LIBS} ${ECHO_C}"
	    ;;

	--ldflags)
	    echo $ECHO_N "${LDFLAGS} ${ICULIBS} ${ECHO_C}"
# $RPATH_LDFLAGS
	    ;;

	--ldflags-libsonly)
	    echo $ECHO_N "${ICULIBS_I18N} ${ICULIBS_COMMON} ${ICULIBS_DATA} ${ECHO_C}"
	    ;;

	--ldflags-icuio)
	    echo $ECHO_N " ${ICULIBS_ICUIO} ${ECHO_C}"
	    ;;

	--ldflags-obsolete)
	    echo $ECHO_N "${ICULIBS_OBSOLETE} ${ECHO_C}"
	    ;;

	--ldflags-toolutil)
	    echo $ECHO_N " ${ICULIBS_TOOLUTIL} ${ECHO_C}"
	    ;;

	--ldflags-layout)
	    echo $ECHO_N "${ICULIBS_LAYOUT} ${ICULIBS_LAYOUTEX} ${ECHO_C}"
	    ;;

	--ldflags-searchpath)
	    echo $ECHO_N "-L${libdir} ${ECHO_C}"
	    ;;

	--detect-prefix)
	    HERE=`echo $0 | sed -e "s/$ME//g"`
	    if [ -f "${HERE}/../lib/${ICULIBS_COMMON_LIB_NAME}" -o -f  "${HERE}/../lib/${ICULIBS_COMMON_LIB_NAME_A}"  ]; then
		prefix="${HERE}/.."
		echo "## Using --prefix=${prefix}" 1>&2
	    fi
	    loaddefs
	    loaddefs
	    ;;

	--exec-prefix)
	    echo $exec_prefix
	    ;;

	--prefix)
	    echo $prefix
	    ;;

	--prefix=*)
	    prefix=$var
	    loaddefs
	    loaddefs
	    ;;

	--sysconfdir)
	    echo $sysconfdir
	    ;;

	--mandir)
	    echo $mandir
	    ;;

	--shared-datadir)
	    echo $ECHO_N "${datadir} ${ECHO_C}"
	    ;;

        --incfile)
	    echo $ECHO_N "${pkglibdir}/Makefile.inc ${ECHO_C}"
	    ;;

	--incpkgdatafile)
	    echo $ECHO_N "${pkglibdir}/pkgdata.inc ${ECHO_C}"
	    ;;

	--icudata)
	    echo $ECHO_N "${ICUDATA_NAME} ${ECHO_C}"
	    ;;

	--icudata-mode)
	    echo $ECHO_N "${PKGDATA_MODE} ${ECHO_C}"
	    ;;

	--icudata-install-dir)
        echo $ECHO_N "${ICUPKGDATA_DIR} ${ECHO_C}"
	    ;;

	--icudatadir)
	    echo $ECHO_N "${ICUDATA_DIR} ${ECHO_C}"
	    ;;

	--shlib-c)
	    echo $ECHO_N "${SHLIB_c} ${ECHO_C}"
	    ;;

	--shlib-cc)
	    echo $ECHO_N "${SHLIB_cc} ${ECHO_C}"
	    ;;

	--version)
	    echo $ECHO_N $VERSION
	    ;;

	--unicode-version)
	    echo $ECHO_N $UNICODE_VERSION
	    ;;

	--host)
	    echo $host
	    exit 0
	    ;;

	--help)
	    usage
	    exit 0
	    ;;

	--usage)
	    usage
	    exit 0
	    ;;

#	--enable-rpath=*)
#	    ENABLE_RPATH=$var
#	    loaddefs
#	    ;;

	-?)
	    usage
	    exit 0
	    ;;

        *)
	    echo ${ME}: ERROR Unknown Option $arg 1>&2
            echo 1>&2
            shortusage 1>&2
	    echo "### $ME: Exitting." 1>&2
            exit 1;
            ;;
    esac
    shift

    # Reset the ignore icuuc file check flag
    if [ $IGNORE_ICUUC_FILE_CHECK = "yes" ]; then
        IGNORE_ICUUC_FILE_CHECK="no"
        sanity
    fi
done
echo
# Check once before we quit (will check last used prefix)
sanity
## END of icu-config-bottom

exit 0
