#!/bin/sh

# Copyright (C) 2011-2014 IBM Corporation and Others. All Rights Reserved.
#
# This is designed for building and running single-source-file ICU programs.
#
# You can always download the latest from http://source.icu-project.org/repos/icu/tools/trunk/scripts/icurun
# Or, as an unofficial link, http://bit.ly/icu-run
#
# In its simplest usage,  simply type:
#
#     icurun  yourprogram.c
#       (or .cpp if it is a C++ program)
#
#  The tool will compile and then run the program
#
#  FINDING ICU
#  To find ICU, the following search order is used by priority:
#
#  1)    "-i <path>" .. the <path> will be searched for either a direct path to icu-config,
#            or a directory containing it, or a directory containing '/bin' containing it.
#        In other words, if icu-config is  /opt/local/bin/icu-config, any of the following will work:
#                 -i /opt/local
#                 -i /opt/local/bin
#                 -i /opt/local/bin/icu-config
#
#         Additionally, /icu/source is a built ICU source directory, either of the following will work:
#
#                 -i /icu
#                 -i /icu/source
#
#         Also, if /build is an out-of-source build, this will work:
#
#                 -i /build
#
#  2)    If there is an executable ~/.icurunrc script, it can set the variable "ICU_CONFIG" to point
#        directly to the icu-config file.
#        An example ~/.icurunrc script  contains just this line:
#
#              ICU_CONFIG=/home/srl/E/II/bin/icu-config
#
#  3)    ICU_CONFIG can be set in the environment to point to icu-config  ( it's overridden by the .icurunrc script )
#
#  4)    if "icu-config" is on the PATH, it will be used.
#
#
#  RUNNING
#   Any additional arguments following the file will be passed to the application.
#
#  TODO
#   * should support pkg-config, which is preferred over icu-config, although icu-config makes this usage
#     easier
#
#   * need to test the $PATH and $ICU_CONFIG usage models

SCRIPTVER='$Revision$'


ICU_OVERRIDE=""

usage()
{
    echo "Script Version ${SCRIPTVER}"
    echo "Usage: $0 [ -i /path/to/icu | -i /path/to/icu-config ]  file.c{pp} [ program args ...]"
}

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

if [ "$1" = "-?" -o $1 = "-h" ];
then
        usage
        exit 0
fi


if [ $1 = "-i" ];
then
        shift
        ICU_OVERRIDE=$1
        shift
fi

if [ $1 = "-O" ];
then
    shift
    XTRA_OPTS=$1
    shift
fi

if [ ! -x "${ICU_CONFIG}" ];
then
    ICU_CONFIG=`which icu-config 2>/dev/null || echo`
fi


# now, search
if [ -x ~/.icurunrc ];
then
        . ~/.icurunrc
fi

IN_SOURCE=
ICU_CONFIG_OPTS=

if [ "x${ICU_OVERRIDE}" != "x" ];
then
        if [ -f "${ICU_OVERRIDE}" -a -x "${ICU_OVERRIDE}" ];
        then
                ICU_CONFIG="${ICU_OVERRIDE}"
        elif [ -x "${ICU_OVERRIDE}/icu-config" ];
        then
                ICU_CONFIG="${ICU_OVERRIDE}/icu-config"
        elif [ -x "${ICU_OVERRIDE}/bin/icu-config" ];
        then
                ICU_CONFIG="${ICU_OVERRIDE}/bin/icu-config"
        elif [ -x "${ICU_OVERRIDE}/source/config/icu-config" ];
        then
                ICU_CONFIG="${ICU_OVERRIDE}/source/config/icu-config"
                IN_SOURCE="${ICU_OVERRIDE}/source"
        elif [ -x "${ICU_OVERRIDE}/config/icu-config" ];
        then
                ICU_CONFIG="${ICU_OVERRIDE}/config/icu-config"
                IN_SOURCE="${ICU_OVERRIDE}"
        else
                echo "$0: Don't know what to do with $ICU_OVERRIDE - not an executable or a directory containing ICU source or install" >&2
                exit 1
        fi
fi

if [ ! -x "${ICU_CONFIG}" ];
then
    echo "$0: Error: \"${ICU_CONFIG}\" is not an icu-config script. Goodbye." >&2
    exit 1
fi

if [ -d "${IN_SOURCE}" ];
then
    echo "ICU workspace dir:" "${IN_SOURCE}"
    # revisit
    if [ -f "${IN_SOURCE}/common/unicode/utypes.h" ];
    then
        top_srcdir="${IN_SOURCE}"
    else
        top_srcdir=`sed -n -e 's%^top_srcdir = \(.*\)%\1%p' < "${IN_SOURCE}/Makefile"`
        if [ ! -d "${top_srcdir}" ];
        then
            echo "Sorry: cannot find top_srcdir from ${IN_SOURCE}/Makefile"
            exit 1
        fi
    fi
    if [ ! -f "${top_srcdir}/common/unicode/utypes.h" ];
    then
        echo Sorry: cannot find "${top_srcdir}/common/unicode/utypes.h"
        exit 1
    fi
    echo "ICU top level source dir:" "${top_srcdir}"

    ICU_CONFIG_OPTS=--noverify
    LINKOPTS="--ldflags-libsonly --ldflags-system --ldflags-icuio"
    OURLIBPATH=${IN_SOURCE}/lib:${IN_SOURCE}/stubdata:${IN_SOURCE}/tools/ctestfw
    SRC_OPTS="-I${top_srcdir}/common -I${top_srcdir}/i18n  -I${top_srcdir}/io -I${top_srcdir}/tools/ctestfw -I${top_srcdir}/tools/toolutil -I${IN_SOURCE}/common -L${IN_SOURCE}/lib -L${IN_SOURCE}/stubdata -L${IN_SOURCE}/tools/ctestfw"
    INVOKE=`${ICU_CONFIG} ${ICU_CONFIG_OPTS} --invoke`:"${OURLIBPATH}"
else
    # no cppflags for in-source
    CPPOPTS="--cppflags"
    LINKOPTS="--ldflags --ldflags-icuio"
    INVOKE=`${ICU_CONFIG} ${ICU_CONFIG_OPTS} --invoke`
fi

echo 'ICU ' version: `${ICU_CONFIG} ${ICU_CONFIG_OPTS} --version` prefix: `${ICU_CONFIG} ${ICU_CONFIG_OPTS} --prefix`

FILE=$1
shift

if [ ! -f "${FILE}" ];
then
    echo "$0: Can't open ${FILE}" >&2
    usage
    exit 1
fi



case "${FILE}" in
     *.cpp)
        COMP=`${ICU_CONFIG} ${ICU_CONFIG_OPTS} --cxx --cxxflags ${CPPOPTS} ${LINKOPTS}`
        OUT=`basename ${FILE} .cpp`
     ;;

     *.c)
        COMP=`${ICU_CONFIG}  ${ICU_CONFIG_OPTS} --cc --cflags ${CPPOPTS} ${LINKOPTS}`
        OUT=`basename ${FILE} .c`
     ;;

     *)
        echo "$0: error, don't know what to do with ${FILE}" >&2
        exit 1
     ;;
esac

echo "# ${COMP}" "${SRC_OPTS}" -o "${OUT}" "${FILE}" "${XTRA_OPTS}"
( ${COMP} ${SRC_OPTS} -o "${OUT}" "${FILE}" ${XTRA_OPTS} || (rm -f "${OUT}" ; exit 1) )  && ( echo "# ${INVOKE} ${LEAK_CHECKER} ./${OUT}" "$@" ; "${SHELL}" -c "${INVOKE} ${LEAK_CHECKER} ./${OUT} $*")
