build/autoconf/icu.m4
author Mike Hommey <mh+mozilla@glandium.org>
Tue, 20 May 2014 08:47:44 +0900
changeset 192326 ddae11a4c73140c8afdb4c1570cf8fc2bdd3a39a
parent 188993 d421723d3a0fea8f9506c651436489e74ede7098
permissions -rw-r--r--
Bug 1011797 - Add GNU/kFreeBSD to the list of ECMAScript i18n API supported platforms. r=mshal, a=NPOTB

dnl This Source Code Form is subject to the terms of the Mozilla Public
dnl License, v. 2.0. If a copy of the MPL was not distributed with this
dnl file, You can obtain one at http://mozilla.org/MPL/2.0/.

dnl Set the MOZ_ICU_VERSION variable to denote the current version of the
dnl ICU library, and also the MOZ_SHARED_ICU which would be true if we are
dnl linking against a shared library of ICU, either one that we build from
dnl our copy of ICU or the system provided library.

AC_DEFUN([MOZ_CONFIG_ICU], [

ICU_LIB_NAMES=
MOZ_NATIVE_ICU=
MOZ_ARG_WITH_BOOL(system-icu,
[  --with-system-icu
                          Use system ICU (located with pkgconfig)],
    MOZ_NATIVE_ICU=1)

if test -n "$MOZ_NATIVE_ICU"; then
    PKG_CHECK_MODULES(MOZ_ICU, icu-i18n >= 50.1)
    MOZ_SHARED_ICU=1
else
    MOZ_ICU_CFLAGS='-I$(topsrcdir)/intl/icu/source/common -I$(topsrcdir)/intl/icu/source/i18n'
    AC_SUBST(MOZ_ICU_CFLAGS)
fi

AC_SUBST(MOZ_NATIVE_ICU)

MOZ_ARG_WITH_STRING(intl-api,
[  --with-intl-api, --with-intl-api=build, --without-intl-api
    Determine the status of the ECMAScript Internationalization API.  The first
    (or lack of any of these) builds and exposes the API.  The second builds it
    but doesn't use ICU or expose the API to script.  The third doesn't build
    ICU at all.],
    _INTL_API=$withval)

ENABLE_INTL_API=
EXPOSE_INTL_API=
case "$_INTL_API" in
no)
    ;;
build)
    ENABLE_INTL_API=1
    ;;
yes)
    ENABLE_INTL_API=1
    EXPOSE_INTL_API=1
    ;;
*)
    AC_MSG_ERROR([Invalid value passed to --with-intl-api: $_INTL_API])
    ;;
esac

if test -n "$EXPOSE_INTL_API"; then
    AC_DEFINE(EXPOSE_INTL_API)
fi

dnl Settings for the implementation of the ECMAScript Internationalization API
if test -n "$ENABLE_INTL_API"; then
    AC_DEFINE(ENABLE_INTL_API)

    icudir="$_topsrcdir/intl/icu/source"
    if test ! -d "$icudir"; then
        icudir="$_topsrcdir/../../intl/icu/source"
        if test ! -d "$icudir"; then
            AC_MSG_ERROR([Cannot find the ICU directory])
        fi
    fi

    version=`sed -n 's/^[[:space:]]*#[[:space:]]*define[[:space:]][[:space:]]*U_ICU_VERSION_MAJOR_NUM[[:space:]][[:space:]]*\([0-9][0-9]*\)[[:space:]]*$/\1/p' "$icudir/common/unicode/uvernum.h"`
    if test x"$version" = x; then
       AC_MSG_ERROR([cannot determine icu version number from uvernum.h header file $lineno])
    fi
    MOZ_ICU_VERSION="$version"

    if test -z "${JS_STANDALONE}" -a -n "${JS_SHARED_LIBRARY}${MOZ_NATIVE_ICU}"; then
        MOZ_SHARED_ICU=1
    fi

    AC_SUBST(MOZ_ICU_VERSION)
    AC_SUBST(MOZ_SHARED_ICU)

    if test -z "$MOZ_NATIVE_ICU"; then
        case "$OS_TARGET" in
            WINNT)
                ICU_LIB_NAMES="icuin icuuc icudt"
                if test -n "$MOZ_SHARED_ICU"; then
                    DBG_SUFFIX=
                    if test -n "$MOZ_DEBUG"; then
                        DBG_SUFFIX=d
                    fi
                    MOZ_ICU_LIBS='$(foreach lib,$(ICU_LIB_NAMES),$(DEPTH)/intl/icu/target/lib/$(LIB_PREFIX)$(lib)$(DBG_SUFFIX).$(LIB_SUFFIX))'
                fi
                ;;
            Darwin)
                ICU_LIB_NAMES="icui18n icuuc icudata"
                if test -n "$MOZ_SHARED_ICU"; then
                   MOZ_ICU_LIBS='$(foreach lib,$(ICU_LIB_NAMES),$(DEPTH)/intl/icu/target/lib/$(DLL_PREFIX)$(lib).$(MOZ_ICU_VERSION)$(DLL_SUFFIX))'
                fi
                ;;
            Linux|DragonFly|FreeBSD|NetBSD|OpenBSD|GNU/kFreeBSD)
                ICU_LIB_NAMES="icui18n icuuc icudata"
                if test -n "$MOZ_SHARED_ICU"; then
                   MOZ_ICU_LIBS='$(foreach lib,$(ICU_LIB_NAMES),$(DEPTH)/intl/icu/target/lib/$(DLL_PREFIX)$(lib)$(DLL_SUFFIX).$(MOZ_ICU_VERSION))'
                fi
                ;;
            *)
                AC_MSG_ERROR([ECMAScript Internationalization API is not yet supported on this platform])
        esac
        if test -z "$MOZ_SHARED_ICU"; then
            MOZ_ICU_LIBS='$(call EXPAND_LIBNAME_PATH,$(ICU_LIB_NAMES),$(DEPTH)/intl/icu/target/lib)'
        fi
    fi
fi

AC_SUBST(DBG_SUFFIX)
AC_SUBST(ENABLE_INTL_API)
AC_SUBST(ICU_LIB_NAMES)
AC_SUBST(MOZ_ICU_LIBS)

if test -n "$ENABLE_INTL_API" -a -z "$MOZ_NATIVE_ICU"; then
    dnl We build ICU as a static library for non-shared js builds and as a shared library for shared js builds.
    if test -z "$MOZ_SHARED_ICU"; then
        AC_DEFINE(U_STATIC_IMPLEMENTATION)
    fi
    dnl Source files that use ICU should have control over which parts of the ICU
    dnl namespace they want to use.
    AC_DEFINE(U_USING_ICU_NAMESPACE,0)
fi


])

AC_DEFUN([MOZ_SUBCONFIGURE_ICU], [

if test -z "$BUILDING_JS" -o -n "$JS_STANDALONE"; then

    if test -n "$ENABLE_INTL_API" -a -z "$MOZ_NATIVE_ICU"; then
        # Set ICU compile options
        ICU_CPPFLAGS=""
        # don't use icu namespace automatically in client code
        ICU_CPPFLAGS="$ICU_CPPFLAGS -DU_USING_ICU_NAMESPACE=0"
        # don't include obsolete header files
        ICU_CPPFLAGS="$ICU_CPPFLAGS -DU_NO_DEFAULT_INCLUDE_UTF_HEADERS=1"
        # remove chunks of the library that we don't need (yet)
        ICU_CPPFLAGS="$ICU_CPPFLAGS -DUCONFIG_NO_LEGACY_CONVERSION"
        ICU_CPPFLAGS="$ICU_CPPFLAGS -DUCONFIG_NO_TRANSLITERATION"
        ICU_CPPFLAGS="$ICU_CPPFLAGS -DUCONFIG_NO_REGULAR_EXPRESSIONS"
        ICU_CPPFLAGS="$ICU_CPPFLAGS -DUCONFIG_NO_BREAK_ITERATION"
        # make sure to not accidentally pick up system-icu headers
        ICU_CPPFLAGS="$ICU_CPPFLAGS -I$icudir/common -I$icudir/i18n"

        ICU_CROSS_BUILD_OPT=""
        ICU_SRCDIR=""
        if test "$HOST_OS_ARCH" = "WINNT"; then
    	ICU_SRCDIR="--srcdir=$(cd $srcdir/intl/icu/source; pwd -W)"
        fi

        if test "$CROSS_COMPILE"; then
    	# Building host tools.  It is necessary to build target binary.
    	case "$HOST_OS_ARCH" in
    	    Darwin)
    		ICU_TARGET=MacOSX
    		;;
    	    Linux)
    		ICU_TARGET=Linux
    		;;
    	    WINNT)
    		ICU_TARGET=MSYS/MSVC
    		;;
            DragonFly|FreeBSD|NetBSD|OpenBSD|GNU_kFreeBSD)
    		ICU_TARGET=BSD
    		;;
    	esac
    	# Remove _DEPEND_CFLAGS from HOST_FLAGS to avoid configure error
    	HOST_ICU_CFLAGS="$HOST_CFLAGS"
    	HOST_ICU_CXXFLAGS="$HOST_CXXFLAGS"

    	HOST_ICU_CFLAGS=`echo $HOST_ICU_CFLAGS | sed "s|$_DEPEND_CFLAGS||g"`
    	HOST_ICU_CXXFLAGS=`echo $HOST_ICU_CFXXLAGS | sed "s|$_DEPEND_CFLAGS||g"`

    	# ICU requires RTTI
    	if test "$GNU_CC"; then
    	    HOST_ICU_CXXFLAGS=`echo $HOST_ICU_CXXFLAGS | sed 's|-fno-rtti|-frtti|g'`
    	elif test "$_MSC_VER"; then
    	    HOST_ICU_CXXFLAGS=`echo $HOST_ICU_CXXFLAGS | sed 's|-GR-|-GR|g'`
    	fi

    	HOST_ICU_BUILD_OPTS=""
    	if test -n "$MOZ_DEBUG"; then
    	    HOST_ICU_BUILD_OPTS="$HOST_ICU_BUILD_OPTS --enable-debug"
    	fi

    	abs_srcdir=`(cd $srcdir; pwd)`
    	mkdir -p $_objdir/intl/icu/host
    	(cd $_objdir/intl/icu/host
    	 MOZ_SUBCONFIGURE_WRAP([.],[
    	 AR="$HOST_AR" RANLIB="$HOST_RANLIB" \
    	 CC="$HOST_CC" CXX="$HOST_CXX" LD="$HOST_LD" \
    	 CFLAGS="$HOST_ICU_CFLAGS $HOST_OPTIMIZE_FLAGS" \
    	 CPPFLAGS="$ICU_CPPFLAGS" \
    	 CXXFLAGS="$HOST_ICU_CXXFLAGS $HOST_OPTIMIZE_FLAGS" \
    	 LDFLAGS="$HOST_LDFLAGS" \
    		$SHELL $abs_srcdir/intl/icu/source/runConfigureICU \
    		$HOST_ICU_BUILD_OPTS \
    		$ICU_TARGET \
    	dnl Shell quoting is fun.
    		${ICU_SRCDIR+"$ICU_SRCDIR"} \
    		--enable-static --disable-shared \
    		--enable-extras=no --enable-icuio=no --enable-layout=no \
    		--enable-tests=no --enable-samples=no || exit 1
    	 ])
    	) || exit 1
    	# generate config/icucross.mk
    	$GMAKE -C $_objdir/intl/icu/host/ config/icucross.mk

    	# --with-cross-build requires absolute path
    	ICU_HOST_PATH=`cd $_objdir/intl/icu/host && pwd`
    	ICU_CROSS_BUILD_OPT="--with-cross-build=$ICU_HOST_PATH"
    	ICU_TARGET_OPT="--build=$build --host=$target"
        else
    	# CROSS_COMPILE isn't set build and target are i386 and x86-64.
    	# So we must set target for --build and --host.
    	ICU_TARGET_OPT="--build=$target --host=$target"
        fi

        if test -z "$MOZ_SHARED_ICU"; then
    	# To reduce library size, use static linking
    	ICU_LINK_OPTS="--enable-static --disable-shared"
        else
    	ICU_LINK_OPTS="--disable-static --enable-shared"
        fi
        # Force the ICU static libraries to be position independent code
        ICU_CFLAGS="$DSO_PIC_CFLAGS $CFLAGS"
        ICU_CXXFLAGS="$DSO_PIC_CFLAGS $CXXFLAGS"

        ICU_BUILD_OPTS=""
        if test -n "$MOZ_DEBUG" -o "MOZ_DEBUG_SYMBOLS"; then
    	ICU_CFLAGS="$ICU_CFLAGS $MOZ_DEBUG_FLAGS"
    	ICU_CXXFLAGS="$ICU_CXXFLAGS $MOZ_DEBUG_FLAGS"
    	if test -n "$CROSS_COMPILE" -a "$OS_TARGET" = "Darwin" \
    		-a "$HOST_OS_ARCH" != "Darwin"
    	then
    	    # Bug 951758: Cross-OSX builds with non-Darwin hosts have issues
    	    # with -g and friends (like -gdwarf and -gfull) because they try
    	    # to run dsymutil
    	    changequote(,)
    	    ICU_CFLAGS=`echo $ICU_CFLAGS | sed 's|-g[^ \t]*||g'`
    	    ICU_CXXFLAGS=`echo $ICU_CXXFLAGS | sed 's|-g[^ \t]*||g'`
    	    changequote([,])
    	fi

    	ICU_LDFLAGS="$MOZ_DEBUG_LDFLAGS"
    	if test -z "$MOZ_DEBUG"; then
    	    # To generate debug symbols, it requires MOZ_DEBUG_FLAGS.
    	    # But, not debug build.
    	    ICU_CFLAGS="$ICU_CFLAGS -UDEBUG -DNDEBUG"
    	    ICU_CXXFLAGS="$ICU_CXXFLAGS -UDEBUG -DNDEBUG"
    	else
    	    ICU_BUILD_OPTS="$ICU_BUILD_OPTS --enable-debug"
    	fi
        fi
        if test -z "$MOZ_OPTIMIZE"; then
    	ICU_BUILD_OPTS="$ICU_BUILD_OPTS --disable-release"
        else
    	ICU_CFLAGS="$ICU_CFLAGS $MOZ_OPTIMIZE_FLAGS"
    	ICU_CXXFLAGS="$ICU_CXXFLAGS $MOZ_OPTIMIZE_FLAGS"
        fi

        if test "$am_cv_langinfo_codeset" = "no"; then
    	# ex. Android
    	ICU_CPPFLAGS="$ICU_CPPFLAGS -DU_HAVE_NL_LANGINFO_CODESET=0"
        fi

        # ICU requires RTTI
        if test "$GNU_CC"; then
    	ICU_CXXFLAGS=`echo $ICU_CXXFLAGS | sed 's|-fno-rtti|-frtti|g'`
        else
    	if test "$_MSC_VER"; then
    	    ICU_CXXFLAGS=`echo $ICU_CXXFLAGS | sed 's|-GR-|-GR|g'`
    	fi

    	# Add RTL flags for MSVCRT.DLL
    	if test -n "$MOZ_DEBUG"; then
    	    ICU_CFLAGS="$ICU_CFLAGS -MDd"
    	    ICU_CXXFLAGS="$ICU_CXXFLAGS -MDd"
    	else
    	    ICU_CFLAGS="$ICU_CFLAGS -MD"
    	    ICU_CXXFLAGS="$ICU_CXXFLAGS -MD"
    	fi

    	# add disable optimize flag for workaround for bug 899948
    	if test -z "$MOZ_OPTIMIZE"; then
    	    ICU_CFLAGS="$ICU_CFLAGS -Od"
    	    ICU_CXXFLAGS="$ICU_CXXFLAGS -Od"
    	fi
        fi

        # We cannot use AC_OUTPUT_SUBDIRS since ICU tree is out of spidermonkey.
        # When using AC_OUTPUT_SUBDIRS, objdir of ICU is out of objdir
        # due to relative path.
        # If building ICU moves into root of mozilla tree, we can use
        # AC_OUTPUT_SUBDIR instead.
        mkdir -p $_objdir/intl/icu/target
        (cd $_objdir/intl/icu/target
         MOZ_SUBCONFIGURE_WRAP([.],[
           AR="$AR" CC="$CC" CXX="$CXX" LD="$LD" \
           ARFLAGS="$ARFLAGS" \
           CPPFLAGS="$ICU_CPPFLAGS $CPPFLAGS" \
           CFLAGS="$ICU_CFLAGS" \
           CXXFLAGS="$ICU_CXXFLAGS" \
           LDFLAGS="$ICU_LDFLAGS $LDFLAGS" \
           $SHELL $_topsrcdir/intl/icu/source/configure \
    		$ICU_BUILD_OPTS \
    		$ICU_CROSS_BUILD_OPT \
    		$ICU_LINK_OPTS \
    		${ICU_SRCDIR+"$ICU_SRCDIR"} \
    		$ICU_TARGET_OPT \
    		--disable-extras --disable-icuio --disable-layout \
    		--disable-tests --disable-samples || exit 1
           ])
        ) || exit 1
    fi

fi

])