Issue #2165 - Build ICU as a shared library if we're building Spidermonkey shared.

It seems that if we're going to enable JS_SHARED_LIBRARY, we need ICU to be a
shared library too in order to prevent code duplication in mozjs.dll bloating
it to a whopping 21 MB.
This unfortunately means we have to fold icudata back to icu itself. But since
icudata is still separated from libxul (which is what really matters for #1451),
I think this is a fair compromise.
Building ICU as shared is offered as an option via --enable-shared-icu. But
technically you really need --enable-shared-icu if you're going to use
--enable-shared-js. Unfortunately I can't make configure exit with an error if
MOZ_SHARED_ICU is not defined when JS_SHARED_LIBRARY is enabled, because options
are controlled by different configure scripts (icu is based on bash, while js is
based on python), and I have no idea how to pass MOZ_SHARED_ICU to js's
moz.configure.

Tag #62
This commit is contained in:
Job Bautista 2023-03-19 00:08:48 +08:00 • committed by roytam1
commit bad884a7c7
6 changed files with 31 additions and 30 deletions

View file

@ -34,11 +34,10 @@ if test -n "$USE_ICU"; then
ICU_DATA_FILE="icudt${version}l.dat" ICU_DATA_FILE="icudt${version}l.dat"
dnl We won't build ICU data as a separate file when building dnl We won't build ICU data as a separate file when building
dnl JS standalone so that embedders don't have to deal with it. dnl ICU as a shared library, as we need to fold the data into
dnl We also don't do it on Windows because sometimes the file goes dnl the shared library in order for consumers like Spidermonkey
dnl missing -- possibly due to overzealous antivirus software? -- dnl to use it without code duplication.
dnl which prevents the browser from starting up :( if test -z "$MOZ_SHARED_ICU"; then
if test -z "$JS_STANDALONE"; then
MOZ_ICU_DATA_ARCHIVE=1 MOZ_ICU_DATA_ARCHIVE=1
else else
MOZ_ICU_DATA_ARCHIVE= MOZ_ICU_DATA_ARCHIVE=
@ -50,13 +49,15 @@ AC_SUBST(ENABLE_INTL_API)
AC_SUBST(USE_ICU) AC_SUBST(USE_ICU)
AC_SUBST(ICU_DATA_FILE) AC_SUBST(ICU_DATA_FILE)
AC_SUBST(MOZ_ICU_DATA_ARCHIVE) AC_SUBST(MOZ_ICU_DATA_ARCHIVE)
AC_SUBST(MOZ_SHARED_ICU)
if test -n "$USE_ICU"; then if test -n "$USE_ICU"; then
if test -z "$YASM" -a -z "$GNU_AS" -a "$COMPILE_ENVIRONMENT"; then if test -z "$YASM" -a -z "$GNU_AS" -a "$COMPILE_ENVIRONMENT"; then
AC_MSG_ERROR([Building ICU requires either yasm or a GNU assembler. If you do not have either of those available for this platform you must use --without-intl-api]) AC_MSG_ERROR([Building ICU requires either yasm or a GNU assembler. If you do not have either of those available for this platform you must use --without-intl-api])
fi fi
dnl We build ICU as a static library. if test -z "$MOZ_SHARED_ICU"; then
AC_DEFINE(U_STATIC_IMPLEMENTATION) AC_DEFINE(U_STATIC_IMPLEMENTATION)
fi
dnl Source files that use ICU should have control over which parts of the ICU dnl Source files that use ICU should have control over which parts of the ICU
dnl namespace they want to use. dnl namespace they want to use.
AC_DEFINE(U_USING_ICU_NAMESPACE,0) AC_DEFINE(U_USING_ICU_NAMESPACE,0)

View file

@ -226,6 +226,7 @@ def old_configure_options(*options):
'--enable-safe-browsing', '--enable-safe-browsing',
'--enable-sandbox', '--enable-sandbox',
'--enable-security-sqlstore', '--enable-security-sqlstore',
'--enable-shared-icu',
'--enable-shared-media', '--enable-shared-media',
'--enable-signmar', '--enable-signmar',
'--enable-simulator', '--enable-simulator',

View file

@ -3,8 +3,6 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this # License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
Library('icu')
DIRS += [ DIRS += [
'common', 'common',
'data', 'data',
@ -14,5 +12,8 @@ DIRS += [
if CONFIG['MOZ_ICU_DATA_ARCHIVE']: if CONFIG['MOZ_ICU_DATA_ARCHIVE']:
DIRS += ['stubdata'] DIRS += ['stubdata']
USE_LIBS += ['icustubdata'] USE_LIBS += ['icustubdata']
Library('icu')
else: else:
USE_LIBS += ['icudata'] USE_LIBS += ['icudata']
SharedLibrary('icu')
SHARED_LIBRARY_NAME = 'icu' + CONFIG['MOZ_ICU_VERSION']

View file

@ -24,7 +24,10 @@ include('objs.mozbuild')
UNIFIED_SOURCES += intl_unicharutil_util_cppsrcs UNIFIED_SOURCES += intl_unicharutil_util_cppsrcs
Library('unicharutil_external_s') # This line breaks building ICU as a shared library due to a
# SandboxValidationError from the frontend reader.
if not CONFIG['MOZ_SHARED_ICU']:
Library('unicharutil_external_s')
FORCE_STATIC_LIB = True FORCE_STATIC_LIB = True

View file

@ -611,27 +611,21 @@ if CONFIG['JS_SHARED_LIBRARY']:
GeckoSharedLibrary('js', linkage=None) GeckoSharedLibrary('js', linkage=None)
SHARED_LIBRARY_NAME = CONFIG['JS_LIBRARY_NAME'] SHARED_LIBRARY_NAME = CONFIG['JS_LIBRARY_NAME']
SDK_LIBRARY = True SDK_LIBRARY = True
if CONFIG['MOZ_ICU_DATA_ARCHIVE']: USE_LIBS += [
USE_LIBS += [ 'icu',
'icudata', ]
]
else: else:
Library('js') Library('js')
FORCE_STATIC_LIB = True FORCE_STATIC_LIB = True
STATIC_LIBRARY_NAME = 'js_static' STATIC_LIBRARY_NAME = 'js_static'
NO_EXPAND_LIBS = True NO_EXPAND_LIBS = True
if CONFIG['MOZ_ICU_DATA_ARCHIVE']:
if not CONFIG['MOZ_ICU_DATA_ARCHIVE']: # Linking 'icu' will pull in the stubdata library,
USE_LIBS += [ # which the shell doesn't want, so link the other bits.
'icu', USE_LIBS += [
] 'icui18n',
else: 'icuuc',
# Linking 'icu' will pull in the stubdata library, ]
# which the shell doesn't want, so link the other bits.
USE_LIBS += [
'icui18n',
'icuuc',
]
USE_LIBS += [ USE_LIBS += [
'nspr', 'nspr',

View file

@ -5144,12 +5144,13 @@ AC_SUBST(WIN32_REDIST_DIR)
AC_SUBST(WIN_UCRT_REDIST_DIR) AC_SUBST(WIN_UCRT_REDIST_DIR)
dnl ======================================================== dnl ========================================================
dnl ICU Support dnl ICU Shared Library Support
dnl ======================================================== dnl ========================================================
if test "$MOZ_WIDGET_TOOLKIT" = "cocoa"; then MOZ_ARG_ENABLE_BOOL(shared-icu,
USE_ICU=1 [ --enable-shared-icu Build ICU as a shared library],
fi MOZ_SHARED_ICU=1,
MOZ_SHARED_ICU=)
MOZ_CONFIG_ICU() MOZ_CONFIG_ICU()