#!/bin/sh
#
# Copyright (C) 2017 and later: Unicode, Inc. and others.
# License & terms of use: http://www.unicode.org/copyright.html
#
# 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 ! fgrep -q -s noverify "${ICU_CONFIG}" ;
then
    rm -rf  "${ICU_CONFIG}".junk
    grep -v '^sanity$' < "${ICU_CONFIG}" > "${ICU_CONFIG}".junk
    chmod u+rwx  "${ICU_CONFIG}".junk
    ICU_CONFIG="${ICU_CONFIG}.junk"
else
    SANITY_OPTS=--noverify
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=${SANITY_OPTS}
    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} $*")
