| #!/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} $*") |