#!/bin/sh

# Copyright (C) 2011-2012 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. Bailing." >&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} ./${OUT}" ; "${SHELL}" -c "${INVOKE} ./${OUT}" "$@")

