#!/bin/sh

# Copyright (C) 2011 IBM Corporation and Others. All Rights Reserved.
#
# This is designed for building and running single-source-file ICU programs.
#
# 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}/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}" -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}" "$@")

