WASM: add initial support for Emscripten cross build

- configure with:
- --host=wasm64-local-emscripten
- had to make a few externals optional, so adding:
  - --disable-nss
  - --disable-cmis
  - --disable-curl

Change-Id: I48d1c73d2675ad2e2beaf2c341578199efbd24ee
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/111130
Tested-by: Jenkins
Reviewed-by: Thorsten Behrens <thorsten.behrens@allotropia.de>
diff --git a/.gitignore b/.gitignore
index d89e5b1..1e21014 100644
--- a/.gitignore
+++ b/.gitignore
@@ -175,3 +175,9 @@ LibreOffice.VC.VC.opendb

# vim-ide-integration
/compile_commands.json

# Some emscripten configure artifacts
/a.out
/a.wasm
/a.out.js
/a.out.wasm
diff --git a/README.md b/README.md
index 35a68bc..20912732 100644
--- a/README.md
+++ b/README.md
@@ -48,6 +48,10 @@ run and compile LibreOffice, also used by the TDF builds:
    * Build: Xcode 9.3 and iPhone SDK 11.4
* Android:
    * Build: NDK r19c and SDK 22.6.2
* Emscripten / WASM:
    * Runtime: a browser with SharedMemory support (threads + atomics)
    * Build: Qt 5.15 with Qt supported Emscripten 1.39.8
    * See README.wasm

If you want to use Clang with the LibreOffice compiler plugins, the minimal
version of Clang is 5.0.2. Since Xcode doesn't provide the compiler plugin
diff --git a/Repository.mk b/Repository.mk
index 6af72d7..db52290 100644
--- a/Repository.mk
+++ b/Repository.mk
@@ -552,9 +552,13 @@ $(eval $(call gb_Helper_register_libraries_for_install,PLAINLIBS_URE,ure, \
	) \
	log_uno_uno \
	unsafe_uno_uno \
	$(if $(filter MSC,$(COM)), \
        $(if $(filter INTEL,$(CPUNAME)),msci, \
		$(if $(filter AARCH64,$(CPUNAME)),msca,mscx)),gcc3)_uno \
	$(if $(filter EMSCRIPTEN,$(OS)),, \
		$(if $(filter MSC,$(COM)), \
			$(if $(filter INTEL,$(CPUNAME)),msci_uno) \
			$(if $(filter X86_64,$(CPUNAME)),mscx_uno) \
			$(if $(filter AARCH64,$(CPUNAME)),msca_uno) \
		, gcc3_uno) \
	) \
))

$(eval $(call gb_Helper_register_libraries_for_install,PRIVATELIBS_URE,ure, \
diff --git a/autogen.sh b/autogen.sh
index 1779de77..bef1f7f 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -295,15 +295,21 @@ if (defined $ENV{NOCONFIGURE}) {
    push @args, "--srcdir=$src_path";
    push @args, "--enable-option-checking=$option_checking";

    print "Running ./configure with '" . join (" ", @args), "'\n";

    # When running a shell script from Perl on WSL, weirdly named
    # environment variables like the "ProgramFiles(x86)" one don't get
    # imported by the shell. So export it as PROGRAMFILESX86 instead.
    my $building_for_linux = 0;
    my $building_with_emscripten = 0;
    foreach my $arg (@args) {
        $building_for_linux = 1 if ($arg =~ /--host=x86_64.*linux/);
        $building_with_emscripten = 1 if ($arg =~ /^--host=wasm.*-emscripten$/);
    }

    unshift @args, "./configure";
    unshift @args, "emconfigure" if ($building_with_emscripten);

    print "Running '" . join (" ", @args), "'\n";

    if (`wslsys 2>/dev/null` ne "" && !$building_for_linux) {
        if (!$ENV{"ProgramFiles(x86)"}) {
            print STDERR "To build for Windows on WSL, you need to set the WSLENV environment variable in the Control Panel to 'ProgramFiles(x86)'\n";
@@ -313,7 +319,7 @@ if (defined $ENV{NOCONFIGURE}) {
        $ENV{"PROGRAMFILESX86"} = $ENV{"ProgramFiles(x86)"};
    }

    system ("./configure", @args) && die "Error running configure";
    system (@args) && die "Error running configure";
}

# Local Variables:
diff --git a/bridges/Module_bridges.mk b/bridges/Module_bridges.mk
index 3016bf2..1c7fb17 100644
--- a/bridges/Module_bridges.mk
+++ b/bridges/Module_bridges.mk
@@ -9,6 +9,7 @@

$(eval $(call gb_Module_Module,bridges))

ifneq ($(OS),EMSCRIPTEN)
$(eval $(call gb_Module_add_targets,bridges,\
	Library_cpp_uno \
	$(if $(ENABLE_JAVA),\
@@ -29,5 +30,6 @@ else ifneq ($(words $(bridges_SELECTED_BRIDGE)),1)
$(call gb_Output_error,multiple bridges selected for build: $(bridges_SELECTED_BRIDGE))
endif
endif
endif

# vim: set noet sw=4 ts=4:
diff --git a/config_host.mk.in b/config_host.mk.in
index b6012d7..5cc02e3 100644
--- a/config_host.mk.in
+++ b/config_host.mk.in
@@ -325,6 +325,7 @@ export KF5_LIBS=$(gb_SPACE)@KF5_LIBS@
export KRB5_LIBS=@KRB5_LIBS@
export LCMS2_CFLAGS=$(gb_SPACE)@LCMS2_CFLAGS@
export LCMS2_LIBS=$(gb_SPACE)@LCMS2_LIBS@
export LD=@LD@
export LD_GC_SECTIONS=@LD_GC_SECTIONS@
export LD_PLUGIN=@LD_PLUGIN@
@x_LDFLAGS@ export LDFLAGS=@LDFLAGS@
@@ -474,6 +475,16 @@ export PERL=@PERL@
export PKGFORMAT=@PKGFORMAT@
export PKGMK=@PKGMK@
export PKG_CONFIG=@PKG_CONFIG@
ifneq (@PKG_CONFIG_PATH@,)
export PKG_CONFIG_PATH=@PKG_CONFIG_PATH@
else
unexport PKG_CONFIG_PATH
endif
ifneq (@PKG_CONFIG_LIBDIR@,)
export PKG_CONFIG_LIBDIR=@PKG_CONFIG_LIBDIR@
else
unexport PKG_CONFIG_LIBDIR
endif
export PLATFORMID=@PLATFORMID@
export POPPLER_CFLAGS=$(gb_SPACE)@POPPLER_CFLAGS@
export POPPLER_LIBS=$(gb_SPACE)@POPPLER_LIBS@
@@ -506,6 +517,7 @@ export QT5_LIBS=$(gb_SPACE)@QT5_LIBS@
export QT5_GOBJECT_CFLAGS=$(gb_SPACE)@QT5_GOBJECT_CFLAGS@
export QT5_GOBJECT_LIBS=$(gb_SPACE)@QT5_GOBJECT_LIBS@
export QT5_HAVE_GOBJECT=@QT5_HAVE_GOBJECT@
export QT5_PLATFORMS_SRCDIR=@QT5_PLATFORMS_SRCDIR@
export QXP_CFLAGS=$(gb_SPACE)@QXP_CFLAGS@
export QXP_LIBS=$(gb_SPACE)@QXP_LIBS@
export RANLIB=@RANLIB@
@@ -639,6 +651,7 @@ export USE_XINERAMA=@USE_XINERAMA@
export UPDATE_CONFIG=@UPDATE_CONFIG@
export UUIDGEN=@UUIDGEN@
export VALGRIND_CFLAGS=$(gb_SPACE)@VALGRIND_CFLAGS@
export VCL_PLUGIN_INFO=@VCL_PLUGIN_INFO@
export VCVER=@VCVER@
export DEVENV=@DEVENV@
export VISIO_CFLAGS=$(gb_SPACE)@VISIO_CFLAGS@
diff --git a/configure.ac b/configure.ac
index 1b05216..e5ce556 100644
--- a/configure.ac
+++ b/configure.ac
@@ -804,6 +804,8 @@ dnl Sequential to keep the logic very simple
dnl These values may be checked and reset later.
dnl ===================================================================
#defaults unless the os test overrides this:
test_cmis=yes
test_curl=yes
test_randr=yes
test_xrender=yes
test_cups=yes
@@ -957,6 +959,7 @@ darwin*|macos*) # macOS
;;

ios*) # iOS
    test_cmis=no
    test_randr=no
    test_xrender=no
    test_freetype=no
@@ -1104,6 +1107,29 @@ haiku*)
    _os=Haiku
    ;;

emscripten)
    build_gstreamer_1_0=no
    enable_lpsolve=no
    enable_report_builder=no
    with_theme="breeze"
    test_cmis=no
    test_cups=no
    test_curl=no
    test_dbus=no
    test_fontconfig=no
    test_freetype=no
    test_gtk=no
    test_randr=no
    test_xrender=no
    enable_postgresql_sdbc=no
    enable_firebird_sdbc=no
    enable_mariadb_sdbc=no
    with_system_zlib=no
    _os=Emscripten

    BUILD_TYPE="$BUILD_TYPE FONTCONFIG FREETYPE"
    ;;

*)
    AC_MSG_ERROR([$host_os operating system is not suitable to build LibreOffice for!])
    ;;
@@ -1254,10 +1280,24 @@ if test $_os != "WINNT"; then
fi
AC_SUBST(DLOPEN_LIBS)

AC_ARG_ENABLE(ios-simulator,
    AS_HELP_STRING([--enable-ios-simulator],
        [build for iOS simulator])
)
dnl ===================================================================
dnl Sanity checks for Emscripten SDK setup
dnl ===================================================================

if test "$_os" = "Emscripten"; then
    EMSCRIPTEN_ERROR=0
    if ! which emconfigure >/dev/null 2>&1; then
        AC_MSG_WARN([emconfigure must be in your \$PATH])
        EMSCRIPTEN_ERROR=1
    fi
    if test -z "$EMMAKEN_JUST_CONFIGURE"; then
	AC_MSG_WARN(["\$EMMAKEN_JUST_CONFIGURE wasn't set by emconfigure. Prefix configure or use autogen.sh])
        EMSCRIPTEN_ERROR=1
    fi
    if test $EMSCRIPTEN_ERROR -ne 0; then
        AC_MSG_ERROR(["Please fix your EMSDK setup to build with Emscripten!"])
    fi
fi

###############################################################################
# Extensions switches --enable/--disable
@@ -1272,6 +1312,11 @@ AC_ARG_ENABLE(ios-simulator,
# if you use --disable-extension-integration. Is that really the
# case?

AC_ARG_ENABLE(ios-simulator,
    AS_HELP_STRING([--enable-ios-simulator],
        [build for iOS simulator])
)

libo_FUZZ_ARG_ENABLE(extension-integration,
    AS_HELP_STRING([--disable-extension-integration],
        [Disable integration of the built extensions in the installer of the
@@ -1462,7 +1507,8 @@ libo_FUZZ_ARG_ENABLE(optimized,
        [Whether to compile with optimization flags.
         By default, disabled for --enable-debug and --enable-dbgutil, enabled
         otherwise. Using 'debug' will try to use only optimizations that should
         not interfere with debugging.]))
         not interfere with debugging. For Emscripten we default to optimized (-O1)
         debug build, as otherwise biaries become too large.]))

libo_FUZZ_ARG_ENABLE(runtime-optimizations,
    AS_HELP_STRING([--disable-runtime-optimizations],
@@ -1789,6 +1835,13 @@ libo_FUZZ_ARG_ENABLE(cipher-openssl-backend,
        [Enable using OpenSSL as the actual implementation of the rtl/cipher.h functionality.
         Requires --enable-openssl.]))

AC_ARG_ENABLE(nss,
    AS_HELP_STRING([--disable-nss],
        [Disable using NSS. If disabled,
         components will either use GNUTLS or openssl. Work in progress,
         use only if you are hacking on it.]),
,enable_nss=yes)

AC_ARG_ENABLE(library-bin-tar,
    AS_HELP_STRING([--enable-library-bin-tar],
        [Enable the building and reused of tarball of binary build for some 'external' libraries.
@@ -1832,6 +1885,16 @@ libo_FUZZ_ARG_ENABLE(librelogo,
        [Do not build LibreLogo.]),
,enable_librelogo=yes)

AC_ARG_ENABLE(cmis,
    AS_HELP_STRING([--disable-cmis],
        [Disable CMIS support.]),
,enable_cmis=yes)

AC_ARG_ENABLE(curl,
    AS_HELP_STRING([--disable-curl],
        [Disable CURL support.]),
,enable_curl=yes)

dnl ===================================================================
dnl Optional Packages (--with/without-)
dnl ===================================================================
@@ -2817,7 +2880,7 @@ dnl "desktop" one but a "mobile" one, we are always cross-compiling.
dnl Note the direction of the implication; there is no assumption that
dnl cross-compiling would imply a non-desktop OS.

if test $_os != iOS -a $_os != Android -a "$enable_fuzzers" != "yes"; then
if test $_os != iOS -a $_os != Android -a $_os != Emscripten -a "$enable_fuzzers" != "yes"; then
    BUILD_TYPE="$BUILD_TYPE DESKTOP"
    AC_DEFINE(HAVE_FEATURE_DESKTOP)
    AC_DEFINE(HAVE_FEATURE_MULTIUSER_ENVIRONMENT)
@@ -2868,7 +2931,7 @@ fi
if test -z "$enable_scripting"; then
    # Disable scripting for iOS unless specifically overridden
    # with --enable-scripting.
    if test $_os != iOS; then
    if test $_os != iOS -o $_os = Emscripten; then
        enable_scripting=yes
    fi
fi
@@ -2882,7 +2945,7 @@ else
    SCPDEFS="$SCPDEFS -DDISABLE_SCRIPTING"
fi

if test $_os = iOS -o $_os = Android; then
if test $_os = iOS -o $_os = Android -o $_os = Emscripten; then
    # Disable dynamic_loading always for iOS and Android
    enable_dynamic_loading=no
elif test -z "$enable_dynamic_loading"; then
@@ -4105,6 +4168,8 @@ if test "$COM_IS_CLANG" = TRUE; then
        [my_apple_clang=yes],[my_apple_clang=])
    if test "$my_apple_clang" = yes; then
        AC_MSG_RESULT([assumed yes (Apple Clang)])
    elif test "$_os" = Emscripten; then
        AC_MSG_RESULT([assumed yes (Emscripten Clang)])
    else
        if test "$_os" = WINNT; then
            dnl In which case, assume clang-cl:
@@ -4186,7 +4251,7 @@ fi
# ===================================================================

HAVE_GCC_GGDB2=
if test "$GCC" = "yes"; then
if test "$GCC" = "yes" -a "$_os" != "Emscripten"; then
    AC_MSG_CHECKING([whether $CC_BASE supports -ggdb2])
    save_CFLAGS=$CFLAGS
    CFLAGS="$CFLAGS -Werror -ggdb2"
@@ -4414,7 +4479,7 @@ fi
AC_SUBST(USE_LD)

HAVE_LD_BSYMBOLIC_FUNCTIONS=
if test "$GCC" = "yes"; then
if test "$GCC" = "yes" -a "$_os" != Emscripten ; then
    AC_MSG_CHECKING([for -Bsymbolic-functions linker support])
    bsymbolic_functions_ldflags_save=$LDFLAGS
    LDFLAGS="$LDFLAGS -Wl,-Bsymbolic-functions"
@@ -4600,7 +4665,7 @@ elif test "$enable_optimized" = debug; then
    ENABLE_OPTIMIZED_DEBUG=TRUE
    AC_MSG_RESULT([yes (debug)])
    HAVE_GCC_OG=
    if test "$GCC" = "yes"; then
    if test "$GCC" = "yes" -a "$_os" != "Emscripten"; then
        AC_MSG_CHECKING([whether $CC_BASE supports -Og])
        save_CFLAGS=$CFLAGS
        CFLAGS="$CFLAGS -Werror -Og"
@@ -4612,7 +4677,7 @@ elif test "$enable_optimized" = debug; then
            AC_MSG_RESULT([no])
        fi
    fi
    if test -z "$HAVE_GCC_OG"; then
    if test -z "$HAVE_GCC_OG" -a "$_os" != "Emscripten"; then
        AC_MSG_ERROR([The compiler does not support optimizations suitable for debugging.])
    fi
else
@@ -5055,6 +5120,25 @@ solaris*)
    SOLARINC="$SOLARINC -I/usr/local/include"
    ;;

emscripten*)
    COM=GCC
    USING_X11=
    OS=EMSCRIPTEN
    RTL_OS=Emscripten
    P_SEP=:

    case "$host_cpu" in
    wasm32|wasm64)
        ;;
    *)
        AC_MSG_ERROR([Unsupported host_cpu $host_cpu for host_os $host_os])
        ;;
    esac
    CPUNAME=INTEL
    RTL_ARCH=x86
    PLATFORMID=linux_x86
    ;;

*)
    AC_MSG_ERROR([$host_os operating system is not suitable to build LibreOffice for!])
    ;;
@@ -5179,9 +5263,10 @@ if test "$cross_compiling" = "yes"; then
    (
    unset COM USING_X11 OS CPUNAME
    unset CC CXX SYSBASE CFLAGS
    unset AR NM OBJDUMP PKG_CONFIG RANLIB READELF STRIP
    unset AR LD NM OBJDUMP PKG_CONFIG RANLIB READELF STRIP
    unset CPPUNIT_CFLAGS CPPUNIT_LIBS
    unset LIBXML_CFLAGS LIBXML_LIBS LIBXSLT_CFLAGS LIBXSLT_LIBS XSLTPROC PKG_CONFIG_LIBDIR
    unset LIBXML_CFLAGS LIBXML_LIBS LIBXSLT_CFLAGS LIBXSLT_LIBS XSLTPROC
    unset PKG_CONFIG_LIBDIR PKG_CONFIG_PATH
    if test -n "$CC_FOR_BUILD"; then
        export CC="$CC_FOR_BUILD"
        CC_BASE=`first_arg_basename "$CC"`
@@ -5193,6 +5278,7 @@ if test "$cross_compiling" = "yes"; then
    test -n "$PKG_CONFIG_FOR_BUILD" && export PKG_CONFIG="$PKG_CONFIG_FOR_BUILD"
    cd CONF-FOR-BUILD

    # Handle host configuration, which affects the cross-toolset too
    sub_conf_opts=""
    test -n "$enable_ccache" && sub_conf_opts="$sub_conf_opts --enable-ccache=$enable_ccache"
    test -n "$with_ant_home" && sub_conf_opts="$sub_conf_opts --with-ant-home=$with_ant_home"
@@ -5227,6 +5313,7 @@ if test "$cross_compiling" = "yes"; then
        --disable-gstreamer-1-0 \
        --disable-gtk3 \
        --disable-mariadb-sdbc \
        --disable-nss \
        --disable-online-update \
        --disable-opencl \
        --disable-pdfimport \
@@ -5249,7 +5336,9 @@ if test "$cross_compiling" = "yes"; then
    PERMITTED_BUILD_TARGETS="
        AVMEDIA
        BOOST
        CAIRO
        CLUCENE
        CURL
        DBCONNECTIVITY
        DESKTOP
        DYNLOADING
@@ -6062,9 +6151,12 @@ if test "$_os" != "WINNT"; then
fi
AC_SUBST(AR)
AC_SUBST(DLLTOOL)
AC_SUBST(LD)
AC_SUBST(NM)
AC_SUBST(OBJDUMP)
AC_SUBST(PKG_CONFIG)
AC_SUBST(PKG_CONFIG_PATH)
AC_SUBST(PKG_CONFIG_LIBDIR)
AC_SUBST(RANLIB)
AC_SUBST(READELF)
AC_SUBST(STRIP)
@@ -7054,7 +7146,7 @@ dnl ===================================================================
dnl Check for system libcmis
dnl ===================================================================
# libcmis requires curl and we can't build curl for iOS
if test $_os != iOS; then
if test "$test_cmis" = "yes" -a "$enable_cmis" = "yes"; then
    libo_CHECK_SYSTEM_MODULE([libcmis],[LIBCMIS],[libcmis-0.5 >= 0.5.2])
    ENABLE_LIBCMIS=TRUE
else
@@ -9207,6 +9299,9 @@ if test "$with_system_libxml" = "auto"; then
    WINNT|iOS|Android)
        with_system_libxml="$with_system_libs"
        ;;
    Emscripten)
        with_system_libxml=no
        ;;
    *)
        if test "$enable_fuzzers" != "yes"; then
            with_system_libxml=yes
@@ -9349,7 +9444,11 @@ no|disable)
        # Python is required to build LibreOffice. In theory we could separate the build-time Python
        # requirement from the choice whether to include Python stuff in the installer, but why
        # bother?
        AC_MSG_ERROR([Python is required at build time.])
        if test "$cross_compiling" = yes; then
            enable_python=system
        else
            AC_MSG_ERROR([Python is required at build time.])
        fi
    fi
    enable_python=no
    AC_MSG_RESULT([none])
@@ -10037,7 +10136,7 @@ if test "$with_system_curl" = "auto"; then
    with_system_curl="$with_system_libs"
fi

if test "$with_system_curl" = "yes"; then
if test "$test_curl" = "yes" -a "$enable_curl" = "yes" -a "$with_system_curl" = "yes"; then
    AC_MSG_RESULT([external])
    SYSTEM_CURL=TRUE

@@ -10069,6 +10168,8 @@ if test "$with_system_curl" = "yes"; then
    fi

    ENABLE_CURL=TRUE
elif test "$test_curl" = "no"; then
    AC_MSG_RESULT([none])
else
    AC_MSG_RESULT([internal])
    SYSTEM_CURL=
@@ -10211,7 +10312,7 @@ AC_SUBST(SYSTEM_OPENLDAP)
dnl ===================================================================
dnl Check for system NSS
dnl ===================================================================
if test "$enable_fuzzers" != "yes"; then
if test "$enable_fuzzers" != "yes" -a "$enable_nss" = "yes"; then
    libo_CHECK_SYSTEM_MODULE([nss],[NSS],[nss >= 3.9.3 nspr >= 4.8])
    AC_DEFINE(HAVE_FEATURE_NSS)
    ENABLE_NSS="TRUE"
@@ -11372,6 +11473,8 @@ if test -z "$build_vcl_plugins"; then
    build_vcl_plugins="none"
fi
AC_MSG_NOTICE([VCLplugs to be built: $build_vcl_plugins])
VCL_PLUGIN_INFO=$R
AC_SUBST([VCL_PLUGIN_INFO])

dnl ===================================================================
dnl check for dbus support
@@ -12412,6 +12515,7 @@ MOC5="moc"
QT5_GOBJECT_CFLAGS=""
QT5_GOBJECT_LIBS=""
QT5_HAVE_GOBJECT=""
QT5_PLATFORMS_SRCDIR=""
if test \( "$test_kf5" = "yes" -a "$ENABLE_KF5" = "TRUE" \) -o \
        \( "$test_qt5" = "yes" -a "$ENABLE_QT5" = "TRUE" \) -o \
        \( "$test_gtk3_kde5" = "yes" -a "$ENABLE_GTK3_KDE5" = "TRUE" \)
diff --git a/desktop/Library_sofficeapp.mk b/desktop/Library_sofficeapp.mk
index 33deef0..fd4dc5c 100644
--- a/desktop/Library_sofficeapp.mk
+++ b/desktop/Library_sofficeapp.mk
@@ -30,8 +30,8 @@ $(eval $(call gb_Library_use_externals,sofficeapp, \
    icu_headers \
    icui18n \
    icuuc \
    $(if $(filter-out iOS,$(OS)), \
    curl \
    $(if $(filter-out EMSCRIPTEN iOS,$(OS)), \
        curl \
    )\
    $(if $(ENABLE_ONLINE_UPDATE_MAR),\
        orcus-parser \
diff --git a/external/apr/ExternalProject_apr.mk b/external/apr/ExternalProject_apr.mk
index 1c94480..7f3a631 100644
--- a/external/apr/ExternalProject_apr.mk
+++ b/external/apr/ExternalProject_apr.mk
@@ -30,7 +30,7 @@ $(call gb_ExternalProject_get_state_target,apr,build):
	$(call gb_Trace_StartRange,apr,EXTERNAL)
	+$(call gb_ExternalProject_run,build,\
		 $(if $(ENABLE_MACOSX_SANDBOX),ac_cv_func_fdatasync=no) \
		./configure \
		$(gb_RUN_CONFIGURE) ./configure \
			--enable-static --disable-shared \
			--with-pic \
			$(if $(filter YES,$(CROSS_COMPILING)),--build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM))\
diff --git a/external/apr/ExternalProject_apr_util.mk b/external/apr/ExternalProject_apr_util.mk
index a311f32..a94b0e3 100644
--- a/external/apr/ExternalProject_apr_util.mk
+++ b/external/apr/ExternalProject_apr_util.mk
@@ -31,7 +31,7 @@ else
$(call gb_ExternalProject_get_state_target,apr_util,build):
	$(call gb_Trace_StartRange,apr_util,EXTERNAL)
	+$(call gb_ExternalProject_run,build,\
		./configure \
		$(gb_RUN_CONFIGURE) ./configure \
			--enable-static --disable-shared \
			--with-pic \
			$(if $(filter YES,$(CROSS_COMPILING)),--build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM))\
diff --git a/external/boost/UnpackedTarball_boost.mk b/external/boost/UnpackedTarball_boost.mk
index bdacdcd..c10ed5a 100644
--- a/external/boost/UnpackedTarball_boost.mk
+++ b/external/boost/UnpackedTarball_boost.mk
@@ -46,6 +46,7 @@ $(eval $(call gb_UnpackedTarball_set_patchlevel,boost,3))

$(eval $(call gb_UnpackedTarball_add_patches,boost,\
	$(foreach patch,$(boost_patches),external/boost/$(patch)) \
    external/boost/boost-emscripten-noshm.patch.0 \
))

# vim: set noet sw=4 ts=4:
diff --git a/external/boost/boost-emscripten-noshm.patch.0 b/external/boost/boost-emscripten-noshm.patch.0
new file mode 100644
index 0000000..f9d27b0
--- /dev/null
+++ b/external/boost/boost-emscripten-noshm.patch.0
@@ -0,0 +1,11 @@
--- boost/interprocess/detail/workaround.hpp.orig	2020-12-15 06:31:51.037665526 +0100
+++ boost/interprocess/detail/workaround.hpp	2020-12-15 06:32:39.741281893 +0100
@@ -31,7 +31,7 @@
    //////////////////////////////////////////////////////
    //Check for XSI shared memory objects. They are available in nearly all UNIX platforms
    //////////////////////////////////////////////////////
-   #if !defined(__QNXNTO__) && !defined(__ANDROID__) && !defined(__HAIKU__) && !(__VXWORKS__)
+   #if !defined(__QNXNTO__) && !defined(__ANDROID__) && !defined(__HAIKU__) && !(__VXWORKS__) && !defined(__EMSCRIPTEN__)
       #define BOOST_INTERPROCESS_XSI_SHARED_MEMORY_OBJECTS
    #endif
 
diff --git a/external/breakpad/ExternalProject_breakpad.mk b/external/breakpad/ExternalProject_breakpad.mk
index 9e7e724..56a7be9 100644
--- a/external/breakpad/ExternalProject_breakpad.mk
+++ b/external/breakpad/ExternalProject_breakpad.mk
@@ -21,7 +21,7 @@ else # !ifeq($(COM),MSC)
$(call gb_ExternalProject_get_state_target,breakpad,build) :
	$(call gb_Trace_StartRange,breakpad,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		./configure CXXFLAGS="-O2 $(gb_VISIBILITY_FLAGS)" \
		$(gb_RUN_CONFIGURE) ./configure CXXFLAGS="-O2 $(gb_VISIBILITY_FLAGS)" \
		&& $(MAKE) \
	)
	$(call gb_Trace_EndRange,breakpad,EXTERNAL)
diff --git a/external/cairo/ExternalProject_cairo.mk b/external/cairo/ExternalProject_cairo.mk
index 41e7621..471ae61 100644
--- a/external/cairo/ExternalProject_cairo.mk
+++ b/external/cairo/ExternalProject_cairo.mk
@@ -64,14 +64,15 @@ else
$(call gb_ExternalProject_get_state_target,cairo,build) :
	$(call gb_Trace_StartRange,cairo,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
	./configure \
	$(gb_RUN_CONFIGURE) ./configure \
		$(if $(debug),STRIP=" ") \
		$(if $(filter ANDROID iOS,$(OS)),CFLAGS="$(if $(debug),-g) $(ZLIB_CFLAGS) $(gb_VISIBILITY_FLAGS)") \
		$(if $(filter-out ANDROID iOS,$(OS)),CFLAGS="$(if $(debug),-g) $(ZLIB_CFLAGS)" ) \
		$(if $(filter EMSCRIPTEN,$(OS)),CFLAGS=" $(ZLIB_CFLAGS)" --enable-pthread=yes PTHREAD_LIBS="") \
		$(if $(filter-out EMSCRIPTEN ANDROID iOS,$(OS)),CFLAGS="$(if $(debug),-g) $(ZLIB_CFLAGS)" ) \
		$(if $(filter ANDROID iOS,$(OS)),PKG_CONFIG=./dummy_pkg_config) \
		LIBS="$(ZLIB_LIBS)" \
		$(if $(filter -fsanitize=%,$(LDFLAGS)),LDFLAGS="$(LDFLAGS) -fuse-ld=bfd") \
		pixman_CFLAGS="-I$(call gb_UnpackedTarball_get_dir,pixman)/pixman" \
		pixman_CFLAGS="-I$(call gb_UnpackedTarball_get_dir,pixman)/pixman -pthread" \
		pixman_LIBS="-L$(call gb_UnpackedTarball_get_dir,pixman)/pixman/.libs -lpixman-1 \
			$(if $(filter LINUX,$(OS)),-Wl$(COMMA)-z$(COMMA)origin \
					-Wl$(COMMA)-rpath$(COMMA)\\\$$\$$ORIGIN) \
@@ -84,7 +85,7 @@ $(call gb_ExternalProject_get_state_target,cairo,build) :
		$(if $(SYSTEM_FONTCONFIG),,FONTCONFIG_CFLAGS="-I$(call gb_UnpackedTarball_get_dir,fontconfig)") \
		$(if $(verbose),--disable-silent-rules,--enable-silent-rules) \
		$(if $(filter TRUE,$(DISABLE_DYNLOADING)),--disable-shared,$(if $(filter ANDROID,$(OS)),--disable-shared,--disable-static)) \
		$(if $(filter ANDROID iOS,$(OS)),--disable-xlib --disable-xcb,$(if $(filter TRUE,$(DISABLE_GUI)),--disable-xlib --disable-xcb,--enable-xlib --enable-xcb)) \
		$(if $(filter EMSCRIPTEN ANDROID iOS,$(OS)),--disable-xlib --disable-xcb,$(if $(filter TRUE,$(DISABLE_GUI)),--disable-xlib --disable-xcb,--enable-xlib --enable-xcb)) \
		$(if $(filter iOS,$(OS)),--enable-quartz --enable-quartz-font) \
		--disable-valgrind \
		$(if $(filter iOS,$(OS)),--disable-ft,--enable-ft --enable-fc) \
diff --git a/external/cairo/ExternalProject_pixman.mk b/external/cairo/ExternalProject_pixman.mk
index fec9437..03dffbd 100644
--- a/external/cairo/ExternalProject_pixman.mk
+++ b/external/cairo/ExternalProject_pixman.mk
@@ -34,11 +34,12 @@ else
$(call gb_ExternalProject_get_state_target,pixman,build) :
	$(call gb_Trace_StartRange,pixman,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		./configure \
		$(gb_RUN_CONFIGURE) ./configure \
		$(if $(filter TRUE,$(DISABLE_DYNLOADING)),--disable-shared,$(if $(filter ANDROID,$(OS)),--disable-shared,--disable-static)) \
		$(if $(filter ANDROID,$(OS)),--disable-arm-simd --disable-arm-neon --disable-arm-iwmmxt) \
		$(if $(CROSS_COMPILING),--build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM) \
		$(if $(filter INTEL ARM,$(CPUNAME)),ac_cv_c_bigendian=no)) \
		$(if $(filter EMSCRIPTEN,$(OS)),CFLAGS="-pthread") \
		&& $(MAKE) \
	)
	$(call gb_Trace_EndRange,pixman,EXTERNAL)
diff --git a/external/coinmp/ExternalProject_coinmp.mk b/external/coinmp/ExternalProject_coinmp.mk
index e1484e6..9bd5a4c 100644
--- a/external/coinmp/ExternalProject_coinmp.mk
+++ b/external/coinmp/ExternalProject_coinmp.mk
@@ -29,7 +29,7 @@ else
$(call gb_ExternalProject_get_state_target,coinmp,build) :
	$(call gb_Trace_StartRange,coinmp,EXTERNAL)
	+$(call gb_ExternalProject_run,build,\
		./configure COIN_SKIP_PROJECTS="Data/Sample" \
		$(gb_RUN_CONFIGURE) ./configure COIN_SKIP_PROJECTS="Data/Sample" \
			$(if $(verbose),--disable-silent-rules,--enable-silent-rules) \
			$(if $(CROSS_COMPILING),--build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM)) \
			$(if $(DISABLE_DYNLOADING),--disable-shared) \
diff --git a/external/cppunit/ExternalProject_cppunit.mk b/external/cppunit/ExternalProject_cppunit.mk
index 1c5ac72..92db8a1 100644
--- a/external/cppunit/ExternalProject_cppunit.mk
+++ b/external/cppunit/ExternalProject_cppunit.mk
@@ -43,7 +43,7 @@ endif
$(call gb_ExternalProject_get_state_target,cppunit,build) :
	$(call gb_Trace_StartRange,cppunit,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		./configure \
		$(gb_RUN_CONFIGURE) ./configure \
			--disable-dependency-tracking \
			$(if $(filter TRUE,$(DISABLE_DYNLOADING)),--disable-shared,--disable-static) \
			--disable-doxygen \
@@ -55,7 +55,8 @@ $(call gb_ExternalProject_get_state_target,cppunit,build) :
			$(if $(filter WNT,$(OS)),LDFLAGS="-Wl$(COMMA)--enable-runtime-pseudo-reloc-v2") \
			$(if $(filter SOLARIS,$(OS)),LIBS="-lm") \
			$(if $(filter ANDROID,$(OS)),LIBS="$(gb_STDLIBS)") \
			CXXFLAGS="$(cppunit_CXXFLAGS)" \
			$(if $(verbose),--disable-silent-rules,--enable-silent-rules) \
			CXXFLAGS="$(cppunit_CXXFLAGS) $(gb_EMSCRIPTEN_CPPFLAGS)" \
		&& cd src \
		&& $(MAKE) \
	)
diff --git a/external/cppunit/disable-dynloading.patch b/external/cppunit/disable-dynloading.patch
index a9aa37f..62ed1de 100644
--- a/external/cppunit/disable-dynloading.patch
+++ b/external/cppunit/disable-dynloading.patch
@@ -17,7 +17,7 @@
+// Actually this is for iOS and Android where we build the cppunit tests libraries
+// as plain archives and just link them statically into test fixture programs,
+// and don't want any stinking duplicate main(), but shouldn't hurt for MacOSX either.
+#elif defined(__APPLE__) || defined(__ANDROID__)
+#elif defined(__APPLE__) || defined(__ANDROID__) || defined(__EMSCRIPTEN__)
+#define CPPUNIT_PLUGIN_IMPLEMENT_MAIN()               \
+  typedef char __CppUnitPlugInImplementMainDummyTypeDef
 // Unix
diff --git a/external/curl/ExternalProject_curl.mk b/external/curl/ExternalProject_curl.mk
index 138b50a..11d1fcc 100644
--- a/external/curl/ExternalProject_curl.mk
+++ b/external/curl/ExternalProject_curl.mk
@@ -40,7 +40,7 @@ endif
$(call gb_ExternalProject_get_state_target,curl,build):
	$(call gb_Trace_StartRange,curl,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		./configure \
		$(gb_RUN_CONFIGURE) ./configure \
			$(if $(filter iOS MACOSX,$(OS)),\
				--with-darwinssl,\
				$(if $(ENABLE_NSS),--with-nss$(if $(SYSTEM_NSS),,="$(call gb_UnpackedTarball_get_dir,nss)/dist/out"),--without-nss)) \
diff --git a/external/epm/ExternalProject_epm.mk b/external/epm/ExternalProject_epm.mk
index 68a61a7..7b0dde2 100644
--- a/external/epm/ExternalProject_epm.mk
+++ b/external/epm/ExternalProject_epm.mk
@@ -16,7 +16,7 @@ $(eval $(call gb_ExternalProject_register_targets,epm,\
$(call gb_ExternalProject_get_state_target,epm,build) :
	$(call gb_Trace_StartRange,epm,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		./configure --disable-fltk \
		$(gb_RUN_CONFIGURE) ./configure --disable-fltk \
			$(if $(filter MACOSX,$(OS)),--prefix=/@.__________________________________________________NONE) \
		&& $(MAKE) \
		&& touch $@ \
diff --git a/external/expat/ExternalProject_expat.mk b/external/expat/ExternalProject_expat.mk
index 4f4f030..b69e654 100644
--- a/external/expat/ExternalProject_expat.mk
+++ b/external/expat/ExternalProject_expat.mk
@@ -16,7 +16,7 @@ $(eval $(call gb_ExternalProject_register_targets,expat,\
$(call gb_ExternalProject_get_state_target,expat,configure) :
	$(call gb_Trace_StartRange,expat,EXTERNAL)
	$(call gb_ExternalProject_run,configure,\
		./configure --without-docbook \
		$(gb_RUN_CONFIGURE) ./configure --without-docbook \
			$(if $(CROSS_COMPILING),--build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM) \
			$(if $(filter INTEL ARM,$(CPUNAME)),ac_cv_c_bigendian=no)) \
	,,expat_configure.log)
diff --git a/external/firebird/ExternalProject_firebird.mk b/external/firebird/ExternalProject_firebird.mk
index 2a491d9..94a62e4 100644
--- a/external/firebird/ExternalProject_firebird.mk
+++ b/external/firebird/ExternalProject_firebird.mk
@@ -66,7 +66,7 @@ $(call gb_ExternalProject_get_state_target,firebird,build):
		" \
		&& export LIBREOFFICE_ICU_LIB="$(call gb_UnpackedTarball_get_dir,icu)/source/lib" \
		&& export MSVC_USE_INDIVIDUAL_PDBS=TRUE \
		&& MAKE=$(MAKE) ./configure \
		&& MAKE=$(MAKE) $(gb_RUN_CONFIGURE) ./configure \
			--without-editline \
			--with-wire-compress=no \
			$(if $(CROSS_COMPILING),--build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM)) \
diff --git a/external/fontconfig/ExternalProject_fontconfig.mk b/external/fontconfig/ExternalProject_fontconfig.mk
index b82c765..fdcb80a 100644
--- a/external/fontconfig/ExternalProject_fontconfig.mk
+++ b/external/fontconfig/ExternalProject_fontconfig.mk
@@ -21,14 +21,15 @@ $(eval $(call gb_ExternalProject_register_targets,fontconfig,\
$(call gb_ExternalProject_get_state_target,fontconfig,build) :
	$(call gb_Trace_StartRange,fontconfig,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		CFLAGS="$(if $(debug),-g) $(gb_VISIBILITY_FLAGS)" $(if $(filter ANDROID,$(OS)),LIBS="-lm") \
		./configure \
		CFLAGS="$(if $(debug),-g) $(gb_VISIBILITY_FLAGS) $(if $(filter EMSCRIPTEN,$(OS)),-pthread)" $(if $(filter ANDROID,$(OS)),LIBS="-lm") \
		$(gb_RUN_CONFIGURE) ./configure \
			--disable-shared \
			--disable-silent-rules \
			$(if $(filter ANDROID,$(OS)),--with-arch=arm) \
			--with-expat-includes=$(call gb_UnpackedTarball_get_dir,expat)/lib \
			--with-expat-lib=$(gb_StaticLibrary_WORKDIR) \
			--build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM) \
			$(if $(filter EMSCRIPTEN,$(OS)),ac_cv_func_fstatfs=no ac_cv_func_fstatvfs=no) \
		&& $(MAKE) -C src \
	)
	$(call gb_Trace_EndRange,fontconfig,EXTERNAL)
diff --git a/external/freetype/ExternalProject_freetype.mk b/external/freetype/ExternalProject_freetype.mk
index 3f4a719..8b49abb 100644
--- a/external/freetype/ExternalProject_freetype.mk
+++ b/external/freetype/ExternalProject_freetype.mk
@@ -25,7 +25,7 @@ else
$(call gb_ExternalProject_get_state_target,freetype,build) :
	$(call gb_Trace_StartRange,freetype,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		./configure \
		$(gb_RUN_CONFIGURE) ./configure \
			--disable-shared \
			--without-zlib \
			--without-bzip2 \
diff --git a/external/gpgmepp/ExternalProject_gpgmepp.mk b/external/gpgmepp/ExternalProject_gpgmepp.mk
index 1ba51cf..92348e4 100644
--- a/external/gpgmepp/ExternalProject_gpgmepp.mk
+++ b/external/gpgmepp/ExternalProject_gpgmepp.mk
@@ -26,7 +26,7 @@ $(call gb_ExternalProject_get_state_target,gpgmepp,build): $(call gb_Executable_
	$(call gb_ExternalProject_run,build, \
		$(gb_WIN_GPG_cross_setup_exports) \
		&& autoreconf \
		&& ./configure \
		&& $(gb_RUN_CONFIGURE) ./configure \
		   --disable-shared \
		   --disable-languages \
		   --disable-gpgconf-test \
@@ -48,7 +48,7 @@ $(call gb_ExternalProject_get_state_target,gpgmepp,build):
	$(call gb_Trace_StartRange,gpgmepp,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		autoreconf \
		&& ./configure \
		&& $(gb_RUN_CONFIGURE) ./configure \
		   --disable-gpgconf-test \
		   --disable-gpg-test \
		   --disable-gpgsm-test \
diff --git a/external/harfbuzz/ExternalProject_harfbuzz.mk b/external/harfbuzz/ExternalProject_harfbuzz.mk
index 7219d40..caf6bcd 100644
--- a/external/harfbuzz/ExternalProject_harfbuzz.mk
+++ b/external/harfbuzz/ExternalProject_harfbuzz.mk
@@ -27,7 +27,7 @@ $(call gb_ExternalProject_get_state_target,harfbuzz,build) :
		$(if $(SYSTEM_ICU),,ICU_CONFIG=$(SRCDIR)/external/icu/cross-bin/icu-config) \
		GRAPHITE2_CFLAGS="$(GRAPHITE_CFLAGS)" \
		GRAPHITE2_LIBS="$(GRAPHITE_LIBS)" \
		./configure \
		$(gb_RUN_CONFIGURE) ./configure \
			--enable-static \
			--disable-shared \
			--disable-gtk-doc \
diff --git a/external/hunspell/ExternalProject_hunspell.mk b/external/hunspell/ExternalProject_hunspell.mk
index 43da1c2..91fd5c4 100644
--- a/external/hunspell/ExternalProject_hunspell.mk
+++ b/external/hunspell/ExternalProject_hunspell.mk
@@ -24,11 +24,11 @@ endif
$(call gb_ExternalProject_get_state_target,hunspell,build):
	$(call gb_Trace_StartRange,hunspell,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		./configure --disable-shared --disable-nls --with-pic \
		$(gb_RUN_CONFIGURE) ./configure --disable-shared --disable-nls --with-pic \
			$(if $(CROSS_COMPILING),--build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM))\
			$(if $(filter AIX,$(OS)),CFLAGS="-D_LINUX_SOURCE_COMPAT") \
			$(if $(hunspell_CPPFLAGS),CPPFLAGS='$(hunspell_CPPFLAGS)') \
			CXXFLAGS="$(CXXFLAGS) $(if $(ENABLE_OPTIMIZED),$(gb_COMPILEROPTFLAGS),$(gb_COMPILERNOOPTFLAGS)) $(if $(debug),$(gb_DEBUGINFO_FLAGS))" \
			CXXFLAGS="$(CXXFLAGS) $(gb_EMSCRIPTEN_CPPFLAGS) $(if $(ENABLE_OPTIMIZED),$(gb_COMPILEROPTFLAGS),$(gb_COMPILERNOOPTFLAGS)) $(if $(debug),$(gb_DEBUGINFO_FLAGS))" \
		&& cd src/hunspell && $(MAKE) \
	)
	$(call gb_Trace_EndRange,hunspell,EXTERNAL)
diff --git a/external/hyphen/ExternalProject_hyphen.mk b/external/hyphen/ExternalProject_hyphen.mk
index 21cef66..63d167f7 100644
--- a/external/hyphen/ExternalProject_hyphen.mk
+++ b/external/hyphen/ExternalProject_hyphen.mk
@@ -18,7 +18,7 @@ $(eval $(call gb_ExternalProject_register_targets,hyphen,\
$(call gb_ExternalProject_get_state_target,hyphen,build):
	$(call gb_Trace_StartRange,hyphen,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		./configure --disable-shared \
		$(gb_RUN_CONFIGURE) ./configure --disable-shared \
			$(if $(filter-out iOS,$(OS)),--with-pic) \
			$(if $(CROSS_COMPILING),--build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM) gio_can_sniff=no) \
		&& $(MAKE) \
diff --git a/external/icu/ExternalProject_icu.mk b/external/icu/ExternalProject_icu.mk
index 4ff8370..18a8f38 100644
--- a/external/icu/ExternalProject_icu.mk
+++ b/external/icu/ExternalProject_icu.mk
@@ -25,7 +25,7 @@ $(call gb_ExternalProject_get_state_target,icu,build) :
			gb_ICU_XFLAGS="-FS $(SOLARINC) $(gb_DEBUGINFO_FLAGS) $(if $(MSVC_USE_DEBUG_RUNTIME),-MDd,-MD -Gy)" \
		&& CFLAGS="$${gb_ICU_XFLAGS}" CPPFLAGS="$(SOLARINC)" CXXFLAGS="$${gb_ICU_XFLAGS}" \
			INSTALL=`cygpath -m /usr/bin/install` $(if $(MSVC_USE_DEBUG_RUNTIME),LDFLAGS="-DEBUG") \
			./configure \
			$(gb_RUN_CONFIGURE) ./configure \
				$(if $(MSVC_USE_DEBUG_RUNTIME),--enable-debug --disable-release) \
				$(if $(CROSS_COMPILING),--build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM) \
					--with-cross-build=$(WORKDIR_FOR_BUILD)/UnpackedTarball/icu/source \
@@ -70,11 +70,10 @@ $(call gb_ExternalProject_get_state_target,icu,build) :
		CPPFLAGS=$(icu_CPPFLAGS) CFLAGS=$(icu_CFLAGS) \
		CXXFLAGS=$(icu_CXXFLAGS) LDFLAGS=$(icu_LDFLAGS) \
		PYTHONWARNINGS="default" \
		./configure \
		$(gb_RUN_CONFIGURE) ./configure \
			--disable-layout --disable-samples \
			$(if $(filter FUZZERS,$(BUILD_TYPE)),--disable-release) \
			$(if $(filter iOS ANDROID,$(OS)),--disable-dyload) \
			$(if $(filter ANDROID,$(OS)),--disable-strict ac_cv_c_bigendian=no) \
			$(if $(filter EMSCRIPTEN ANDROID,$(OS)),--disable-strict ac_cv_c_bigendian=no) \
			$(if $(filter SOLARIS AIX,$(OS)),--disable-64bit-libs) \
			$(if $(filter TRUE,$(DISABLE_DYNLOADING)),\
				--with-data-packaging=static --enable-static --disable-shared --disable-dyload,\
@@ -82,6 +81,7 @@ $(call gb_ExternalProject_get_state_target,icu,build) :
			$(if $(CROSS_COMPILING),--build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM)\
				--with-cross-build=$(WORKDIR_FOR_BUILD)/UnpackedTarball/icu/source \
				--disable-tools --disable-extras) \
			AR="$(AR)" RANLIB="$(RANLIB)" \
		&& $(MAKE) $(if $(CROSS_COMPILING),DATASUBDIR=data) $(if $(verbose),VERBOSE=1) \
		$(if $(filter MACOSX,$(OS)), \
			&& $(PERL) $(SRCDIR)/solenv/bin/macosx-change-install-names.pl shl \
diff --git a/external/icu/UnpackedTarball_icu.mk b/external/icu/UnpackedTarball_icu.mk
index 435382f..a59d6e8 100644
--- a/external/icu/UnpackedTarball_icu.mk
+++ b/external/icu/UnpackedTarball_icu.mk
@@ -41,6 +41,7 @@ $(eval $(call gb_UnpackedTarball_add_patches,icu,\
	external/icu/icu4c-windows-cygwin-cross.patch.1 \
	external/icu/icu4c-$(if $(filter ANDROID,$(OS)),android,rpath).patch.1 \
	$(if $(filter-out ANDROID,$(OS)),external/icu/icu4c-icudata-stdlibs.patch.1) \
	external/icu/icu4c-emscripten-cross.patch.1 \
))

$(eval $(call gb_UnpackedTarball_add_file,icu,source/data/brkitr/khmerdict.dict,external/icu/khmerdict.dict))
diff --git a/external/icu/icu4c-emscripten-cross.patch.1 b/external/icu/icu4c-emscripten-cross.patch.1
new file mode 100644
index 0000000..84c88a6
--- /dev/null
+++ b/external/icu/icu4c-emscripten-cross.patch.1
@@ -0,0 +1,99 @@
--- icu/source/acinclude.m4.orig	2020-04-22 22:04:20.000000000 +0200
+++ icu/source/acinclude.m4	2020-11-04 06:10:29.993070072 +0100
@@ -84,6 +84,7 @@
 *-dec-osf*) icu_cv_host_frag=mh-alpha-osf ;;
 *-*-nto*)	icu_cv_host_frag=mh-qnx ;;
 *-ncr-*)	icu_cv_host_frag=mh-mpras ;;
+wasm*-*-emscripten*)	icu_cv_host_frag=mh-emscripten ;;
 *) 		icu_cv_host_frag=mh-unknown ;;
 esac
 		]
--- /dev/null
+++ icu/source/config/mh-emscripten	2015-10-06 12:01:00.497972406 +0200
@@ -0,0 +1,86 @@
+## Emscripten-specific setup
+## Copyright (c) 1999-2013, International Business Machines Corporation and
+## others. All Rights Reserved.
+## Commands to generate dependency files
+GEN_DEPS.c=  $(CC) -E -MM $(DEFS) $(CPPFLAGS)
+GEN_DEPS.cc= $(CXX) -E -MM $(DEFS) $(CPPFLAGS) $(CXXFLAGS)
+ 
+## Flags for position independent code
+SHAREDLIBCFLAGS = -fPIC
+SHAREDLIBCXXFLAGS = -fPIC
+SHAREDLIBCPPFLAGS = -DPIC
+
+## Additional flags when building libraries and with threads
+THREADSCPPFLAGS = -D_REENTRANT
+LIBCPPFLAGS =
+
+## Compiler switch to embed a runtime search path
+LD_RPATH= -Wl,-zorigin,-rpath,'$$'ORIGIN
+LD_RPATH_PRE = -Wl,-rpath,
+
+## Force RPATH=$ORIGIN to locate own dependencies w/o need for LD_LIBRARY_PATH:
+ENABLE_RPATH=YES
+RPATHLDFLAGS=${LD_RPATH_PRE}'$$ORIGIN'
+
+## These are the library specific LDFLAGS
+#LDFLAGSICUDT=-nodefaultlibs -nostdlib
+# Debian change: linking icudata as data only causes too many problems.
+LDFLAGSICUDT=
+
+## Compiler switch to embed a library name
+# The initial tab in the next line is to prevent icu-config from reading it.
+	LD_SONAME = -Wl,-soname -Wl,$(notdir $(MIDDLE_SO_TARGET))
+#SH# # We can't depend on MIDDLE_SO_TARGET being set.
+#SH# LD_SONAME=
+
+## Shared library options
+LD_SOOPTIONS= -Wl,-Bsymbolic-functions
+
+## Shared object suffix
+SO = so
+## Non-shared intermediate object suffix
+STATIC_O = o
+
+## Compilation rules
+# WASM needs -pthread for atomics support
+%.$(STATIC_O): $(srcdir)/%.c
+	$(call SILENT_COMPILE,$(strip $(COMPILE.c) $(STATICCPPFLAGS) $(STATICCFLAGS)) -pthread -o $@ $<)
+
+%.$(STATIC_O): $(srcdir)/%.cpp
+	$(call SILENT_COMPILE,$(strip $(COMPILE.cc) $(STATICCPPFLAGS) $(STATICCXXFLAGS)) -pthread -o $@ $<)
+
+
+## Dependency rules
+%.d: $(srcdir)/%.c
+	$(call ICU_MSG,(deps)) $<
+	@$(SHELL) -ec '$(GEN_DEPS.c) $< \
+		| sed '\''s%\($*\)\.o[ :]*%\1.o $@ : %g'\'' > $@; \
+		[ -s $@ ] || rm -f $@'
+
+%.d: $(srcdir)/%.cpp
+	$(call ICU_MSG,(deps)) $<
+	@$(SHELL) -ec '$(GEN_DEPS.cc) $< \
+		| sed '\''s%\($*\)\.o[ :]*%\1.o $@ : %g'\'' > $@; \
+		[ -s $@ ] || rm -f $@'
+
+## Versioned libraries rules
+
+%.$(SO).$(SO_TARGET_VERSION_MAJOR): %.$(SO).$(SO_TARGET_VERSION)
+	$(RM) $@ && ln -s ${<F} $@
+%.$(SO): %.$(SO).$(SO_TARGET_VERSION_MAJOR)
+	$(RM) $@ && ln -s ${*F}.$(SO).$(SO_TARGET_VERSION) $@
+
+##  Bind internal references
+
+# LDflags that pkgdata will use
+BIR_LDFLAGS= -Wl,-Bsymbolic
+
+# Dependencies [i.e. map files] for the final library
+BIR_DEPS=
+
+## Remove shared library 's'
+STATIC_PREFIX_WHEN_USED =
+STATIC_PREFIX =
+
+## without assembly
+PKGDATA_OPTS = -O $(top_builddir)/data/icupkg.inc -w
diff --git a/external/lcms2/ExternalProject_lcms2.mk b/external/lcms2/ExternalProject_lcms2.mk
index 4bed4a5..35dce1b 100644
--- a/external/lcms2/ExternalProject_lcms2.mk
+++ b/external/lcms2/ExternalProject_lcms2.mk
@@ -27,7 +27,7 @@ else
$(call gb_ExternalProject_get_state_target,lcms2,build):
	$(call gb_Trace_StartRange,lcms2,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		./configure --without-jpeg --without-tiff --with-pic \
		$(gb_RUN_CONFIGURE) ./configure --without-jpeg --without-tiff --with-pic \
			$(if $(CROSS_COMPILING),--build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM) \
			$(if $(filter INTEL ARM,$(CPUNAME)),ac_cv_c_bigendian=no)) \
			CPPFLAGS=" $(SOLARINC)" \
diff --git a/external/libabw/ExternalProject_libabw.mk b/external/libabw/ExternalProject_libabw.mk
index 50e66fd..a218350 100644
--- a/external/libabw/ExternalProject_libabw.mk
+++ b/external/libabw/ExternalProject_libabw.mk
@@ -26,7 +26,7 @@ $(call gb_ExternalProject_get_state_target,libabw,build) :
	$(call gb_Trace_StartRange,libabw,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		export PKG_CONFIG="" \
		&& MAKE=$(MAKE) ./configure \
		&& MAKE=$(MAKE) $(gb_RUN_CONFIGURE) ./configure \
			--with-pic \
			--enable-static \
			--disable-shared \
diff --git a/external/libassuan/ExternalProject_libassuan.mk b/external/libassuan/ExternalProject_libassuan.mk
index e4e24ae..8ee9682 100644
--- a/external/libassuan/ExternalProject_libassuan.mk
+++ b/external/libassuan/ExternalProject_libassuan.mk
@@ -26,7 +26,7 @@ $(call gb_ExternalProject_get_state_target,libassuan,build): $(call gb_Executabl
	$(call gb_ExternalProject_run,build,\
	  $(gb_WIN_GPG_cross_setup_exports) \
	  && autoreconf \
	  && ./configure \
	  && $(gb_RUN_CONFIGURE) ./configure \
		--enable-static \
		--disable-shared \
		--disable-doc \
@@ -44,7 +44,7 @@ $(call gb_ExternalProject_get_state_target,libassuan,build):
	$(call gb_Trace_StartRange,libassuan,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		autoreconf \
		&& ./configure \
		&& $(gb_RUN_CONFIGURE) ./configure \
		   --disable-doc \
		   GPG_ERROR_CFLAGS="$(GPG_ERROR_CFLAGS)" \
		   GPG_ERROR_LIBS="$(GPG_ERROR_LIBS)" \
diff --git a/external/libatomic_ops/ExternalProject_libatomic_ops.mk b/external/libatomic_ops/ExternalProject_libatomic_ops.mk
index 20cefa3..47f2da6 100644
--- a/external/libatomic_ops/ExternalProject_libatomic_ops.mk
+++ b/external/libatomic_ops/ExternalProject_libatomic_ops.mk
@@ -19,7 +19,7 @@ $(call gb_ExternalProject_get_state_target,libatomic_ops,build) :
	$(call gb_Trace_StartRange,libatomic_ops,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		$(if $(filter TRUE,$(DISABLE_DYNLOADING)),CFLAGS="$(CFLAGS) $(gb_VISIBILITY_FLAGS) $(if $(ENABLE_OPTIMIZED),$(gb_COMPILEROPTFLAGS),$(gb_COMPILERNOOPTFLAGS))" CXXFLAGS="$(CXXFLAGS) $(gb_VISIBILITY_FLAGS) $(gb_VISIBILITY_FLAGS_CXX) $(if $(ENABLE_OPTIMIZED),$(gb_COMPILEROPTFLAGS),$(gb_COMPILERNOOPTFLAGS))") \
		./configure \
		$(gb_RUN_CONFIGURE) ./configure \
			$(if $(CROSS_COMPILING),--build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM)) \
		&& $(MAKE) \
	)
diff --git a/external/libcdr/ExternalProject_libcdr.mk b/external/libcdr/ExternalProject_libcdr.mk
index b3e78f4..48a21af 100644
--- a/external/libcdr/ExternalProject_libcdr.mk
+++ b/external/libcdr/ExternalProject_libcdr.mk
@@ -27,7 +27,7 @@ $(call gb_ExternalProject_get_state_target,libcdr,build) :
	$(call gb_Trace_StartRange,libcdr,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		export PKG_CONFIG="" \
		&& MAKE=$(MAKE) ./configure \
		&& MAKE=$(MAKE) $(gb_RUN_CONFIGURE) ./configure \
			--with-pic \
			--enable-static \
			--disable-shared \
diff --git a/external/libebook/ExternalProject_libebook.mk b/external/libebook/ExternalProject_libebook.mk
index 8ee2c72..15c9689b 100644
--- a/external/libebook/ExternalProject_libebook.mk
+++ b/external/libebook/ExternalProject_libebook.mk
@@ -28,7 +28,7 @@ $(call gb_ExternalProject_get_state_target,libebook,build) :
	$(call gb_Trace_StartRange,libebook,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		export PKG_CONFIG="" \
		&& MAKE=$(MAKE) ./configure \
		&& MAKE=$(MAKE) $(gb_RUN_CONFIGURE) ./configure \
			--with-pic \
			--enable-static \
			--disable-shared \
diff --git a/external/libeot/ExternalProject_libeot.mk b/external/libeot/ExternalProject_libeot.mk
index 75e8054..98c7d2e 100644
--- a/external/libeot/ExternalProject_libeot.mk
+++ b/external/libeot/ExternalProject_libeot.mk
@@ -18,7 +18,7 @@ $(call gb_ExternalProject_get_state_target,libeot,build) :
	$(call gb_ExternalProject_run,build,\
		touch Makefile.in \
		&& export PKG_CONFIG="" \
		&& ./configure \
		&& $(gb_RUN_CONFIGURE) ./configure \
			--with-pic \
			--enable-static \
			--disable-shared \
diff --git a/external/libepubgen/ExternalProject_libepubgen.mk b/external/libepubgen/ExternalProject_libepubgen.mk
index 54a9a3d..096f0f6 100644
--- a/external/libepubgen/ExternalProject_libepubgen.mk
+++ b/external/libepubgen/ExternalProject_libepubgen.mk
@@ -24,7 +24,7 @@ $(call gb_ExternalProject_get_state_target,libepubgen,build) :
	$(call gb_Trace_StartRange,libepubgen,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		export PKG_CONFIG="" \
		&& MAKE=$(MAKE) ./configure \
		&& MAKE=$(MAKE) $(gb_RUN_CONFIGURE) ./configure \
			--with-pic \
			--enable-static \
			--disable-shared \
diff --git a/external/libetonyek/ExternalProject_libetonyek.mk b/external/libetonyek/ExternalProject_libetonyek.mk
index 0eabfe5..1477321 100644
--- a/external/libetonyek/ExternalProject_libetonyek.mk
+++ b/external/libetonyek/ExternalProject_libetonyek.mk
@@ -29,7 +29,7 @@ $(call gb_ExternalProject_get_state_target,libetonyek,build) :
	$(call gb_Trace_StartRange,libetonyek,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		export PKG_CONFIG="" \
		&& MAKE=$(MAKE) ./configure \
		&& MAKE=$(MAKE) $(gb_RUN_CONFIGURE) ./configure \
			--with-pic \
			$(if $(DISABLE_DYNLOADING), \
				--enable-static --disable-shared \
diff --git a/external/libexttextcat/ExternalProject_libexttextcat.mk b/external/libexttextcat/ExternalProject_libexttextcat.mk
index 1d729a1..e73948e 100644
--- a/external/libexttextcat/ExternalProject_libexttextcat.mk
+++ b/external/libexttextcat/ExternalProject_libexttextcat.mk
@@ -16,7 +16,7 @@ $(eval $(call gb_ExternalProject_register_targets,libexttextcat,\
$(call gb_ExternalProject_get_state_target,libexttextcat,build):
	$(call gb_Trace_StartRange,libexttextcat,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		./configure --disable-shared --with-pic \
		$(gb_RUN_CONFIGURE) ./configure --disable-shared --with-pic \
			$(if $(verbose),--disable-silent-rules,--enable-silent-rules) \
			$(if $(ENABLE_WERROR),--enable-werror,--disable-werror) \
			$(if $(CROSS_COMPILING),--build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM)) \
diff --git a/external/libffi/ExternalProject_libffi.mk b/external/libffi/ExternalProject_libffi.mk
index b9e4254..a495db9 100644
--- a/external/libffi/ExternalProject_libffi.mk
+++ b/external/libffi/ExternalProject_libffi.mk
@@ -27,7 +27,7 @@ $(call gb_ExternalProject_get_state_target,libffi,build):
	$(call gb_Trace_StartRange,libffi,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		export LIB="$(ILIB)" && \
		MAKE=$(MAKE) ./configure \
		MAKE=$(MAKE) $(gb_RUN_CONFIGURE) ./configure \
			--enable-option-checking=fatal \
			--build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM) \
			$(if $(filter LINUX,$(OS)), \
diff --git a/external/libfreehand/ExternalProject_libfreehand.mk b/external/libfreehand/ExternalProject_libfreehand.mk
index be3a478..09f8187 100644
--- a/external/libfreehand/ExternalProject_libfreehand.mk
+++ b/external/libfreehand/ExternalProject_libfreehand.mk
@@ -27,7 +27,7 @@ $(call gb_ExternalProject_get_state_target,libfreehand,build) :
	$(call gb_Trace_StartRange,libfreehand,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		export PKG_CONFIG="" \
		&& MAKE=$(MAKE) ./configure \
		&& MAKE=$(MAKE) $(gb_RUN_CONFIGURE) ./configure \
			--with-pic \
			--enable-static \
			--disable-shared \
diff --git a/external/libgpg-error/ExternalProject_libgpg-error.mk b/external/libgpg-error/ExternalProject_libgpg-error.mk
index 736079c..0bcd9d5 100644
--- a/external/libgpg-error/ExternalProject_libgpg-error.mk
+++ b/external/libgpg-error/ExternalProject_libgpg-error.mk
@@ -20,7 +20,7 @@ $(call gb_ExternalProject_get_state_target,libgpg-error,build): $(call gb_Execut
	$(call gb_Trace_StartRange,libgpg-error,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		$(gb_WIN_GPG_cross_setup_exports) \
		&& MAKE=$(MAKE) ./configure \
		&& MAKE=$(MAKE) $(gb_RUN_CONFIGURE) ./configure \
			--enable-static \
			--disable-shared \
			--disable-rpath \
@@ -35,7 +35,7 @@ else
$(call gb_ExternalProject_get_state_target,libgpg-error,build):
	$(call gb_Trace_StartRange,libgpg-error,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		MAKE=$(MAKE) ./configure \
		MAKE=$(MAKE) $(gb_RUN_CONFIGURE) ./configure \
			--disable-rpath \
			--disable-languages \
			--disable-doc \
diff --git a/external/libjpeg-turbo/ExternalProject_libjpeg-turbo.mk b/external/libjpeg-turbo/ExternalProject_libjpeg-turbo.mk
index a5cd4c5..c5e0556 100644
--- a/external/libjpeg-turbo/ExternalProject_libjpeg-turbo.mk
+++ b/external/libjpeg-turbo/ExternalProject_libjpeg-turbo.mk
@@ -27,7 +27,7 @@ $(call gb_ExternalProject_get_state_target,libjpeg-turbo,build) : $(call gb_Exte
$(call gb_ExternalProject_get_state_target,libjpeg-turbo,configure) :
	$(call gb_Trace_StartRange,libjpeg-turbo,EXTERNAL)
	$(call gb_ExternalProject_run,configure,\
		MAKE=$(MAKE) ./configure \
		MAKE=$(MAKE) $(gb_RUN_CONFIGURE) ./configure \
			--build=$(BUILD_PLATFORM) \
			--host=$(HOST_PLATFORM) \
			--with-pic \
diff --git a/external/liblangtag/ExternalProject_liblangtag.mk b/external/liblangtag/ExternalProject_liblangtag.mk
index 51dc4f4..7c52820 100644
--- a/external/liblangtag/ExternalProject_liblangtag.mk
+++ b/external/liblangtag/ExternalProject_liblangtag.mk
@@ -23,13 +23,13 @@ $(eval $(call gb_ExternalProject_register_targets,liblangtag,\
$(call gb_ExternalProject_get_state_target,liblangtag,build):
	$(call gb_Trace_StartRange,liblangtrag,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		MAKE=$(MAKE) ./configure --disable-modules --disable-test --disable-introspection --with-pic \
		MAKE=$(MAKE) $(gb_RUN_CONFIGURE) ./configure --disable-modules --disable-test --disable-introspection --with-pic \
		$(if $(or $(DISABLE_DYNLOADING),$(filter MSC,$(COM))), \
			--disable-shared --enable-static, \
			--enable-shared --disable-static) \
		$(if $(verbose),--disable-silent-rules,--enable-silent-rules) \
		$(if $(filter TRUE,$(HAVE_GCC_BUILTIN_ATOMIC)),"lt_cv_has_atomic=yes","lt_cv_has_atomic=no") \
		CFLAGS='$(CFLAGS) \
		CFLAGS='$(CFLAGS) -pthread \
				$(if $(ENABLE_OPTIMIZED), \
					$(gb_COMPILEROPTFLAGS),$(gb_COMPILERNOOPTFLAGS)) \
				$(if $(call gb_Module__symbols_enabled,liblangtag),$(gb_DEBUGINFO_FLAGS))' \
diff --git a/external/libmspub/ExternalProject_libmspub.mk b/external/libmspub/ExternalProject_libmspub.mk
index 21121f0..82bc413 100644
--- a/external/libmspub/ExternalProject_libmspub.mk
+++ b/external/libmspub/ExternalProject_libmspub.mk
@@ -26,7 +26,7 @@ $(call gb_ExternalProject_get_state_target,libmspub,build) :
	$(call gb_Trace_StartRange,libmspub,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		export PKG_CONFIG="" \
		&& MAKE=$(MAKE) ./configure \
		&& MAKE=$(MAKE) $(gb_RUN_CONFIGURE) ./configure \
			--with-pic \
			--enable-static \
			--disable-shared \
diff --git a/external/libmwaw/ExternalProject_libmwaw.mk b/external/libmwaw/ExternalProject_libmwaw.mk
index 067de69..0fc2cc4 100644
--- a/external/libmwaw/ExternalProject_libmwaw.mk
+++ b/external/libmwaw/ExternalProject_libmwaw.mk
@@ -23,7 +23,7 @@ $(call gb_ExternalProject_get_state_target,libmwaw,build) :
	$(call gb_Trace_StartRange,libmwaw,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		export PKG_CONFIG="" \
		&& ./configure \
		&& $(gb_RUN_CONFIGURE) ./configure \
			--with-pic \
			$(if $(DISABLE_DYNLOADING), \
				--enable-static --disable-shared \
diff --git a/external/libnumbertext/ExternalProject_libnumbertext.mk b/external/libnumbertext/ExternalProject_libnumbertext.mk
index f4dbe5f..3094351 100644
--- a/external/libnumbertext/ExternalProject_libnumbertext.mk
+++ b/external/libnumbertext/ExternalProject_libnumbertext.mk
@@ -28,7 +28,7 @@ $(call gb_ExternalProject_get_state_target,libnumbertext,build):
	$(call gb_Trace_StartRange,libnumbertext,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		LIBS="$(gb_STDLIBS) $(LIBS)" \
		$(SHELL) ./configure --disable-shared --with-pic \
		$(SHELL) $(gb_RUN_CONFIGURE) ./configure --disable-shared --with-pic \
			$(if $(verbose),--disable-silent-rules,--enable-silent-rules) \
			$(if $(ENABLE_WERROR),--enable-werror,--disable-werror) \
			$(if $(CROSS_COMPILING),--build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM))\
diff --git a/external/libodfgen/ExternalProject_libodfgen.mk b/external/libodfgen/ExternalProject_libodfgen.mk
index a32e378..658e4387 100644
--- a/external/libodfgen/ExternalProject_libodfgen.mk
+++ b/external/libodfgen/ExternalProject_libodfgen.mk
@@ -24,7 +24,7 @@ $(call gb_ExternalProject_get_state_target,libodfgen,build) :
	$(call gb_Trace_StartRange,libodfgen,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		export PKG_CONFIG="" \
		&& ./configure \
		&& $(gb_RUN_CONFIGURE) ./configure \
			--with-pic \
			$(if $(DISABLE_DYNLOADING), \
				--enable-static --disable-shared \
diff --git a/external/liborcus/ExternalProject_liborcus.mk b/external/liborcus/ExternalProject_liborcus.mk
index c2a8cdc..c7dd76e 100644
--- a/external/liborcus/ExternalProject_liborcus.mk
+++ b/external/liborcus/ExternalProject_liborcus.mk
@@ -95,11 +95,11 @@ $(call gb_ExternalProject_get_state_target,liborcus,build) :
	$(call gb_ExternalProject_run,build,\
		$(if $(liborcus_LIBS),LIBS='$(liborcus_LIBS)') \
		$(if $(liborcus_CXXFLAGS),CXXFLAGS='$(liborcus_CXXFLAGS)') \
		$(if $(liborcus_CPPFLAGS),CPPFLAGS='$(liborcus_CPPFLAGS)') \
		$(if $(liborcus_CPPFLAGS),CPPFLAGS='$(liborcus_CPPFLAGS) $(gb_EMSCRIPTEN_CPPFLAGS)') \
		$(if $(liborcus_LDFLAGS),LDFLAGS='$(liborcus_LDFLAGS)') \
		MDDS_CFLAGS='$(MDDS_CFLAGS)' \
		MDDS_LIBS=' ' \
		MAKE=$(MAKE) ./configure \
		MAKE=$(MAKE) $(gb_RUN_CONFIGURE) ./configure \
			--with-pic \
			$(if $(DISABLE_DYNLOADING), \
				--enable-static --disable-shared \
diff --git a/external/libpagemaker/ExternalProject_libpagemaker.mk b/external/libpagemaker/ExternalProject_libpagemaker.mk
index 34254b8..ca74086 100644
--- a/external/libpagemaker/ExternalProject_libpagemaker.mk
+++ b/external/libpagemaker/ExternalProject_libpagemaker.mk
@@ -24,7 +24,7 @@ $(call gb_ExternalProject_get_state_target,libpagemaker,build) :
	$(call gb_Trace_StartRange,libpagemaker,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		export PKG_CONFIG="" \
		&& MAKE=$(MAKE) ./configure \
		&& MAKE=$(MAKE) $(gb_RUN_CONFIGURE) ./configure \
			--with-pic \
			--enable-static \
			--disable-shared \
diff --git a/external/libqxp/ExternalProject_libqxp.mk b/external/libqxp/ExternalProject_libqxp.mk
index f1b63f6..f428693 100644
--- a/external/libqxp/ExternalProject_libqxp.mk
+++ b/external/libqxp/ExternalProject_libqxp.mk
@@ -25,7 +25,7 @@ $(call gb_ExternalProject_get_state_target,libqxp,build) :
	$(call gb_Trace_StartRange,libqxp,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		export PKG_CONFIG="" \
		&& MAKE=$(MAKE) ./configure \
		&& MAKE=$(MAKE) $(gb_RUN_CONFIGURE) ./configure \
			--with-pic \
			--enable-static \
			--disable-shared \
diff --git a/external/librevenge/ExternalProject_librevenge.mk b/external/librevenge/ExternalProject_librevenge.mk
index 7c3e367..9bc9141 100644
--- a/external/librevenge/ExternalProject_librevenge.mk
+++ b/external/librevenge/ExternalProject_librevenge.mk
@@ -23,7 +23,7 @@ $(call gb_ExternalProject_get_state_target,librevenge,build) :
	$(call gb_Trace_StartRange,librevenge,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		export PKG_CONFIG="" \
		&& ./configure \
		&& $(gb_RUN_CONFIGURE) ./configure \
			--with-pic \
			$(if $(DISABLE_DYNLOADING), \
				--disable-shared --enable-static, \
diff --git a/external/libstaroffice/ExternalProject_libstaroffice.mk b/external/libstaroffice/ExternalProject_libstaroffice.mk
index 8aad471..3d264a7 100644
--- a/external/libstaroffice/ExternalProject_libstaroffice.mk
+++ b/external/libstaroffice/ExternalProject_libstaroffice.mk
@@ -23,7 +23,7 @@ $(call gb_ExternalProject_get_state_target,libstaroffice,build) :
	$(call gb_Trace_StartRange,libstaroffice,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		export PKG_CONFIG="" \
		&& ./configure \
		&& $(gb_RUN_CONFIGURE) ./configure \
			--with-pic \
			$(if $(DISABLE_DYNLOADING), \
				--enable-static --disable-shared \
diff --git a/external/libvisio/ExternalProject_libvisio.mk b/external/libvisio/ExternalProject_libvisio.mk
index ea2f096..9a348f8 100644
--- a/external/libvisio/ExternalProject_libvisio.mk
+++ b/external/libvisio/ExternalProject_libvisio.mk
@@ -26,7 +26,7 @@ $(call gb_ExternalProject_get_state_target,libvisio,build) :
	$(call gb_Trace_StartRange,libvisio,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		export PKG_CONFIG="" \
		&& MAKE=$(MAKE) ./configure \
		&& MAKE=$(MAKE) $(gb_RUN_CONFIGURE) ./configure \
			--with-pic \
			--enable-static \
			--disable-shared \
diff --git a/external/libwpd/ExternalProject_libwpd.mk b/external/libwpd/ExternalProject_libwpd.mk
index c3b810c..bae99dc 100644
--- a/external/libwpd/ExternalProject_libwpd.mk
+++ b/external/libwpd/ExternalProject_libwpd.mk
@@ -24,7 +24,7 @@ $(call gb_ExternalProject_get_state_target,libwpd,build) :
	$(call gb_Trace_StartRange,libwpd,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		export PKG_CONFIG="" \
		&& MAKE=$(MAKE) ./configure \
		&& MAKE=$(MAKE) $(gb_RUN_CONFIGURE) ./configure \
			--with-pic \
			$(if $(DISABLE_DYNLOADING), \
				--disable-shared --enable-static, \
diff --git a/external/libwpg/ExternalProject_libwpg.mk b/external/libwpg/ExternalProject_libwpg.mk
index 01f31c5..e6dd423 100644
--- a/external/libwpg/ExternalProject_libwpg.mk
+++ b/external/libwpg/ExternalProject_libwpg.mk
@@ -24,7 +24,7 @@ $(call gb_ExternalProject_get_state_target,libwpg,build) :
	$(call gb_Trace_StartRange,libwpg,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		export PKG_CONFIG="" \
		&& MAKE=$(MAKE) ./configure \
		&& MAKE=$(MAKE) $(gb_RUN_CONFIGURE) ./configure \
			--with-pic \
			$(if $(DISABLE_DYNLOADING), \
				--disable-shared --enable-static, \
diff --git a/external/libwps/ExternalProject_libwps.mk b/external/libwps/ExternalProject_libwps.mk
index 0bcfc5c..12e3c87 100644
--- a/external/libwps/ExternalProject_libwps.mk
+++ b/external/libwps/ExternalProject_libwps.mk
@@ -46,7 +46,7 @@ $(call gb_ExternalProject_get_state_target,libwps,build) :
	$(call gb_Trace_StartRange,libwps,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		export PKG_CONFIG="" \
		&& ./configure \
		&& $(gb_RUN_CONFIGURE) ./configure \
			--with-pic \
			$(if $(DISABLE_DYNLOADING), \
				--enable-static --disable-shared \
diff --git a/external/libxml2/ExternalProject_libxml2.mk b/external/libxml2/ExternalProject_libxml2.mk
index 778befa..77d040b 100644
--- a/external/libxml2/ExternalProject_libxml2.mk
+++ b/external/libxml2/ExternalProject_libxml2.mk
@@ -13,6 +13,10 @@ $(eval $(call gb_ExternalProject_register_targets,libxml2,\
	build \
))

ifeq ($(OS),EMSCRIPTEN)
$(call gb_ExternalProject_use_external_project,libxml2,icu)
endif

ifeq ($(OS),WNT)
$(call gb_ExternalProject_use_external_project,libxml2,icu)

@@ -31,7 +35,7 @@ else # OS!=WNT
$(call gb_ExternalProject_get_state_target,libxml2,build):
	$(call gb_Trace_StartRange,libxml2,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		./configure --disable-ipv6 --without-python --without-zlib --with-sax1 \
		$(gb_RUN_CONFIGURE) ./configure --disable-ipv6 --without-python --without-zlib --with-sax1 \
			--without-lzma \
			$(if $(debug),--with-run-debug) \
			$(if $(CROSS_COMPILING),--build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM)) \
diff --git a/external/libxslt/ExternalProject_libxslt.mk b/external/libxslt/ExternalProject_libxslt.mk
index 0602c32..21c53f3 100644
--- a/external/libxslt/ExternalProject_libxslt.mk
+++ b/external/libxslt/ExternalProject_libxslt.mk
@@ -32,7 +32,7 @@ else # OS!=WNT
$(call gb_ExternalProject_get_state_target,libxslt,build):
	$(call gb_Trace_StartRange,libxslt,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		./configure --without-crypto --without-python \
		$(gb_RUN_CONFIGURE) ./configure --without-crypto --without-python \
			$(if $(CROSS_COMPILING),--build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM)) \
			$(if $(filter MACOSX,$(OS)),--prefix=/@.__________________________________________________OOO) \
			LDFLAGS="$(if $(filter LINUX FREEBSD,$(OS)),-Wl$(COMMA)-z$(COMMA)origin -Wl$(COMMA)-rpath$(COMMA)\\"\$$\$$ORIGIN" -Wl$(COMMA)-noinhibit-exec) \
diff --git a/external/libzmf/ExternalProject_libzmf.mk b/external/libzmf/ExternalProject_libzmf.mk
index c659389..695cb2e 100644
--- a/external/libzmf/ExternalProject_libzmf.mk
+++ b/external/libzmf/ExternalProject_libzmf.mk
@@ -27,7 +27,7 @@ $(call gb_ExternalProject_get_state_target,libzmf,build) :
	$(call gb_Trace_StartRange,libzmf,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		export PKG_CONFIG="" \
		&& MAKE=$(MAKE) ./configure \
		&& MAKE=$(MAKE) $(gb_RUN_CONFIGURE) ./configure \
			--with-pic \
			--enable-static \
			--disable-shared \
diff --git a/external/mythes/ExternalProject_mythes.mk b/external/mythes/ExternalProject_mythes.mk
index b352e9b..298607f 100644
--- a/external/mythes/ExternalProject_mythes.mk
+++ b/external/mythes/ExternalProject_mythes.mk
@@ -18,7 +18,7 @@ $(eval $(call gb_ExternalProject_register_targets,mythes,\
$(call gb_ExternalProject_get_state_target,mythes,build):
	$(call gb_Trace_StartRange,mythes,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		LIBS="$(gb_STDLIBS) $(LIBS)" ./configure --disable-shared --with-pic \
		LIBS="$(gb_STDLIBS) $(LIBS)" $(gb_RUN_CONFIGURE) ./configure --disable-shared --with-pic \
		$(if $(CROSS_COMPILING),--build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM) gio_can_sniff=no) \
		&& $(MAKE) \
	)
diff --git a/external/openldap/ExternalProject_openldap.mk b/external/openldap/ExternalProject_openldap.mk
index 46e9168..8a102d0 100644
--- a/external/openldap/ExternalProject_openldap.mk
+++ b/external/openldap/ExternalProject_openldap.mk
@@ -29,7 +29,7 @@ endif
$(call gb_ExternalProject_get_state_target,openldap,build) :
	$(call gb_Trace_StartRange,openldap,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		./configure \
		$(gb_RUN_CONFIGURE) ./configure \
			--disable-slapd \
			--with-pic \
			--with-tls=moznss \
diff --git a/external/openssl/ExternalProject_openssl.mk b/external/openssl/ExternalProject_openssl.mk
index a608293..4c5d630 100644
--- a/external/openssl/ExternalProject_openssl.mk
+++ b/external/openssl/ExternalProject_openssl.mk
@@ -49,6 +49,8 @@ OPENSSL_PLATFORM := \
          $(if $(filter MACOSX,$(OS)),\
            $(if $(filter X86_64,$(CPUNAME)),darwin64-x86_64-cc)\
            $(if $(filter AARCH64,$(CPUNAME)),darwin64-arm64-cc)\
	  ,\
	    $(if $(filter EMSCRIPTEN,$(OS)),no-engine no-dso no-dgram no-srtp no-err no-ocsp no-psk no-ts no-asm) \
          )\
        )\
      )\
diff --git a/external/postgresql/ExternalProject_postgresql.mk b/external/postgresql/ExternalProject_postgresql.mk
index ea822eb..b491301 100644
--- a/external/postgresql/ExternalProject_postgresql.mk
+++ b/external/postgresql/ExternalProject_postgresql.mk
@@ -65,7 +65,7 @@ endif
$(call gb_ExternalProject_get_state_target,postgresql,build) :
	$(call gb_Trace_StartRange,postgresql,EXTERNAL)
	$(call gb_ExternalProject_run,build,\
		./configure \
		$(gb_RUN_CONFIGURE) ./configure \
			--without-readline \
			--without-zlib \
			--with-ldap \
diff --git a/external/python3/ExternalProject_python3.mk b/external/python3/ExternalProject_python3.mk
index 7ff7040..8766b1e 100644
--- a/external/python3/ExternalProject_python3.mk
+++ b/external/python3/ExternalProject_python3.mk
@@ -84,7 +84,7 @@ $(call gb_ExternalProject_get_state_target,python3,build) :
				ac_cv_func_clock_gettime=no \
			) \
		) \
		./configure \
		$(gb_RUN_CONFIGURE) ./configure \
		$(if $(CROSS_COMPILING),--build=$(BUILD_PLATFORM) --host=$(HOST_PLATFORM)) \
		$(if $(ENABLE_VALGRIND),--with-valgrind) \
		$(if $(ENABLE_DBGUTIL),--with-pydebug) \
diff --git a/external/redland/ExternalProject_raptor.mk b/external/redland/ExternalProject_raptor.mk
index 4bc91c3..ea14077 100644
--- a/external/redland/ExternalProject_raptor.mk
+++ b/external/redland/ExternalProject_raptor.mk
@@ -25,7 +25,7 @@ $(call gb_ExternalProject_get_state_target,raptor,build):
			$(if $(filter LINUX FREEBSD,$(OS)),-Wl$(COMMA)-z$(COMMA)origin -Wl$(COMMA)-rpath$(COMMA)\\"\$$\$$ORIGIN") \
			$(if $(SYSBASE),$(if $(filter LINUX SOLARIS,$(OS)),-L$(SYSBASE)/lib -L$(SYSBASE)/usr/lib -lpthread -ldl))" \
		CPPFLAGS="$(if $(SYSBASE),-I$(SYSBASE)/usr/include)" \
		./configure --disable-gtk-doc \
		$(gb_RUN_CONFIGURE) ./configure --disable-gtk-doc \
			 --enable-parsers="rdfxml ntriples turtle trig guess rss-tag-soup" \
			--with-www=xml \
			--without-xslt-config \
diff --git a/external/redland/ExternalProject_rasqal.mk b/external/redland/ExternalProject_rasqal.mk
index 0e765e0..5348e37 100644
--- a/external/redland/ExternalProject_rasqal.mk
+++ b/external/redland/ExternalProject_rasqal.mk
@@ -30,7 +30,7 @@ $(call gb_ExternalProject_get_state_target,rasqal,build):
		PKG_CONFIG="" \
		RAPTOR2_CFLAGS="-I$(call gb_UnpackedTarball_get_dir,raptor)/src" \
		RAPTOR2_LIBS="-L$(call gb_UnpackedTarball_get_dir,raptor)/src/.libs -lraptor2" \
		./configure --disable-gtk-doc \
		$(gb_RUN_CONFIGURE) ./configure --disable-gtk-doc \
			--with-regex-library=posix \
			--with-decimal=none \
			--with-uuid-library=internal \
diff --git a/external/redland/ExternalProject_redland.mk b/external/redland/ExternalProject_redland.mk
index f6101f0..f908b55 100644
--- a/external/redland/ExternalProject_redland.mk
+++ b/external/redland/ExternalProject_redland.mk
@@ -33,7 +33,7 @@ $(call gb_ExternalProject_get_state_target,redland,build):
		RAPTOR2_LIBS="-L$(call gb_UnpackedTarball_get_dir,raptor)/src/.libs -lraptor2 $(LIBXML_LIBS)" \
		RASQAL_CFLAGS="-I$(call gb_UnpackedTarball_get_dir,rasqal)/src" \
		RASQAL_LIBS="-L$(call gb_UnpackedTarball_get_dir,rasqal)/src/.libs -lrasqal" \
		./configure --disable-gtk-doc \
		$(gb_RUN_CONFIGURE) ./configure --disable-gtk-doc \
			--disable-modular \
			--without-threads \
			--without-bdb --without-sqlite --without-mysql \
diff --git a/external/xmlsec/ExternalProject_xmlsec.mk b/external/xmlsec/ExternalProject_xmlsec.mk
index 3db17c7..4fa4aea 100644
--- a/external/xmlsec/ExternalProject_xmlsec.mk
+++ b/external/xmlsec/ExternalProject_xmlsec.mk
@@ -41,7 +41,7 @@ $(call gb_ExternalProject_get_state_target,xmlsec,build) :
		$(if $(filter iOS MACOSX,$(OS_FOR_BUILD)),ACLOCAL="aclocal -I $(SRCDIR)/m4/mac") \
		$(if $(filter AIX,$(OS)),ACLOCAL="aclocal -I /opt/freeware/share/aclocal") \
		autoreconf \
		&& ./configure \
		&& $(gb_RUN_CONFIGURE) ./configure \
			--with-pic --disable-shared --disable-crypto-dl --without-libxslt --without-gnutls --without-gcrypt --disable-apps --disable-docs \
			$(if $(verbose),--disable-silent-rules,--enable-silent-rules) \
			CFLAGS="$(CFLAGS) $(if $(ENABLE_OPTIMIZED),$(gb_COMPILEROPTFLAGS),$(gb_COMPILERNOOPTFLAGS)) $(if $(debug),$(gb_DEBUGINFO_FLAGS)) $(gb_VISIBILITY_FLAGS)" \
@@ -52,7 +52,7 @@ $(call gb_ExternalProject_get_state_target,xmlsec,build) :
					$(if $(filter MACOSX,$(OS_FOR_BUILD)),--disable-pkgconfig) \
					NSPR_CFLAGS="-I$(call gb_UnpackedTarball_get_dir,nss)/dist/out/include" NSPR_LIBS="-L$(call gb_UnpackedTarball_get_dir,nss)/dist/out/lib -lnspr4" \
					NSS_CFLAGS="-I$(call gb_UnpackedTarball_get_dir,nss)/dist/public/nss" NSS_LIBS="-L$(call gb_UnpackedTarball_get_dir,nss)/dist/out/lib -lsmime3 -lnss3 -lnssutil3" \
			), \
				), \
				$(if $(ENABLE_OPENSSL), \
					$(if $(SYSTEM_OPENSSL),, \
						OPENSSL_CFLAGS="-I$(call gb_UnpackedTarball_get_dir,openssl)/include" \
diff --git a/i18nutil/source/utility/paper.cxx b/i18nutil/source/utility/paper.cxx
index 74c9fd35..042a82e 100644
--- a/i18nutil/source/utility/paper.cxx
+++ b/i18nutil/source/utility/paper.cxx
@@ -237,7 +237,7 @@ PaperInfo PaperInfo::getSystemDefaultPaper()
        if (bInitialized)
            return aInstance;

#ifndef MACOSX
#if ! defined(MACOSX) && ! defined(EMSCRIPTEN)
        // try libpaper
        // #i78617# workaround missing paperconf command
        FILE* pPipe = popen( "paperconf 2>/dev/null", "r" );
diff --git a/idl/source/objects/types.cxx b/idl/source/objects/types.cxx
index 9622d85..57d62c4 100644
--- a/idl/source/objects/types.cxx
+++ b/idl/source/objects/types.cxx
@@ -251,7 +251,7 @@ void SvMetaType::WriteSfxItem(

    // write the implementation part
    rOutStm.WriteCharPtr( "#ifdef SFX_TYPEMAP" ) << endl;
    rOutStm.WriteCharPtr( "#if !defined(_WIN32) && (defined(DISABLE_DYNLOADING) && (defined(ANDROID) || defined(IOS) || defined(LINUX)))" ) << endl;
    rOutStm.WriteCharPtr( "#if !defined(_WIN32) && (defined(DISABLE_DYNLOADING) && (defined(ANDROID) || defined(IOS) || defined(EMSCRIPTEN) || defined(LINUX)))" ) << endl;
    rOutStm.WriteCharPtr( "__attribute__((__weak__))" ) << endl;
    rOutStm.WriteCharPtr( "#endif" ) << endl;
    rOutStm.WriteOString( aTypeName ).WriteOString( aVarName )
diff --git a/include/osl/endian.h b/include/osl/endian.h
index c3a2344..fb9b514 100644
--- a/include/osl/endian.h
+++ b/include/osl/endian.h
@@ -74,6 +74,8 @@ extern "C" {
#   elif defined _BIG_ENDIAN
#       define OSL_BIGENDIAN
#   endif
#elif defined EMSCRIPTEN
#   define OSL_LITENDIAN
#else
#   error "Target platform not specified !"
#endif
diff --git a/include/sal/alloca.h b/include/sal/alloca.h
index a8edc5a..ce6b60c 100644
--- a/include/sal/alloca.h
+++ b/include/sal/alloca.h
@@ -25,7 +25,7 @@
#define INCLUDED_SAL_ALLOCA_H

#if defined(__sun) || defined(LINUX) || defined(AIX) || defined(ANDROID) || defined(HAIKU)         \
    || defined(MACOSX) || defined(IOS)
    || defined(MACOSX) || defined(IOS) || defined(EMSCRIPTEN)

#ifndef INCLUDED_ALLOCA_H
#include <alloca.h>
diff --git a/include/sal/config.h b/include/sal/config.h
index 74d482f..bf59585 100644
--- a/include/sal/config.h
+++ b/include/sal/config.h
@@ -83,6 +83,17 @@
#define SAL_CONFIGFILE(name) name "rc"
#endif

#ifdef EMSCRIPTEN
#define SAL_UNX
#define SAL_DLLEXTENSION ".bc"
#define SAL_EXEEXTENSION ""
#define SAL_DLLPREFIX "lib"
#define SAL_PATHSEPARATOR ':'
#define SAL_PATHDELIMITER '/'
#define SAL_NEWLINE_STRING "\n"
#define SAL_CONFIGFILE(name) name "rc"
#endif

/* The following spell is for Solaris and its descendants.
 * See the "Solaris" section of
 * <http://sourceforge.net/p/predef/wiki/OperatingSystems/>, and
diff --git a/sal/osl/unx/system.hxx b/sal/osl/unx/system.hxx
index a8b0e10..8b1f1dc 100644
--- a/sal/osl/unx/system.hxx
+++ b/sal/osl/unx/system.hxx
@@ -269,13 +269,33 @@ int macxp_resolveAlias(char *path, int buflen);
#   define  NO_PTHREAD_RTL
#endif

#ifdef EMSCRIPTEN
#   ifndef ETIME
#       define  ETIME ETIMEDOUT
#   endif
#   include <pthread.h>
#   include <sys/file.h>
#   include <sys/ioctl.h>
#   include <sys/uio.h>
#   include <sys/un.h>
#   include <netinet/tcp.h>
#   include <dlfcn.h>
#   include <endian.h>
#   include <sys/time.h>
#   define  IORESOURCE_TRANSFER_BSD
#   define  IOCHANNEL_TRANSFER_BSD_RENO
#   define  pthread_testcancel()
#   define  NO_PTHREAD_PRIORITY
#   define INIT_GROUPS(name, gid) false
#endif

#if !defined(_WIN32)  && \
    !defined(LINUX)   && !defined(NETBSD) && !defined(FREEBSD) && \
    !defined(AIX)     && \
    !defined(__sun) && !defined(MACOSX) && \
    !defined(OPENBSD) && !defined(DRAGONFLY) && \
    !defined(IOS) && !defined(ANDROID) && \
    !defined(HAIKU)
    !defined(HAIKU) && !defined(EMSCRIPTEN)
#   error "Target platform not specified!"
#endif

diff --git a/sc/source/core/tool/math.cxx b/sc/source/core/tool/math.cxx
index a077d5c..3c496f8 100644
--- a/sc/source/core/tool/math.cxx
+++ b/sc/source/core/tool/math.cxx
@@ -53,8 +53,13 @@ double power(const double& fVal1, const double& fVal2)
    }
    // The pow() call must had been the most recent call to check errno or exception.
    if ((((math_errhandling & MATH_ERRNO) != 0) && (errno == EDOM || errno == ERANGE))
// emscripten is currently broken by https://github.com/emscripten-core/emscripten/pull/11087
// While the removal is correct for C99, it's not for C++11 (see http://www.cplusplus.com/reference/cfenv/FE_INEXACT/)
// But since emscripten currently doesn't support any math exceptions, we simply ignore them
#ifndef __EMSCRIPTEN__
        || (((math_errhandling & MATH_ERREXCEPT) != 0)
            && std::fetestexcept(FE_INVALID | FE_DIVBYZERO | FE_OVERFLOW | FE_UNDERFLOW))
#endif
        || !std::isfinite(fPow))
    {
        fPow = CreateDoubleError(FormulaError::IllegalFPOperation);
diff --git a/solenv/bin/run-configure b/solenv/bin/run-configure
new file mode 100755
index 0000000..9758ff1d
--- /dev/null
+++ b/solenv/bin/run-configure
@@ -0,0 +1,9 @@
#!/bin/sh

# We could run emconfigure here, but LO's gbuild should have set up everything
# correctly. If something breaks because of this, we likely have mre problems.
if test "$OS" = "EMSCRIPTEN"; then
    export EMMAKEN_JUST_CONFIGURE=1
fi

exec "$@"
diff --git a/solenv/gbuild/gbuild.mk b/solenv/gbuild/gbuild.mk
index fa5c767..1afa9e0 100644
--- a/solenv/gbuild/gbuild.mk
+++ b/solenv/gbuild/gbuild.mk
@@ -191,6 +191,7 @@ include $(SRCDIR)/RepositoryExternal.mk
$(eval $(call gb_Helper_collect_knownlibs))

gb_Library_DLLPOSTFIX := lo
gb_RUN_CONFIGURE :=

# Include platform/cpu/compiler specific config/definitions

@@ -278,6 +279,7 @@ gb_TEST_ENV_VARS += SAL_DISABLE_SYNCHRONOUS_PRINTER_DETECTION=1
ifeq (,$(SAL_USE_VCLPLUGIN))
gb_TEST_ENV_VARS += SAL_USE_VCLPLUGIN=svp
endif
gb_TEST_ENV_VARS += UNO_HOME=file://$$I/program

# This is used to detect whether LibreOffice is being built (as opposed to building
# 3rd-party code). Used for tag deprecation for API we want to
diff --git a/solenv/gbuild/platform/EMSCRIPTEN_INTEL_GCC.mk b/solenv/gbuild/platform/EMSCRIPTEN_INTEL_GCC.mk
new file mode 100644
index 0000000..3131bbe
--- /dev/null
+++ b/solenv/gbuild/platform/EMSCRIPTEN_INTEL_GCC.mk
@@ -0,0 +1,64 @@
# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
#
# This file is part of the LibreOffice project.
#
# This Source Code Form is subject to the terms of the Mozilla Public
# 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/.
#

gb_UnoApiHeadersTarget_select_variant = $(if $(filter udkapi,$(1)),comprehensive,$(2))

include $(GBUILDDIR)/platform/unxgcc.mk

gb_RUN_CONFIGURE := $(SRCDIR)/solenv/bin/run-configure
# avoid -s SAFE_HEAP=1 - c.f. gh#8584 this breaks source maps
gb_EMSCRIPTEN_CPPFLAGS := -pthread -s TOTAL_MEMORY=1GB -s USE_PTHREADS=1 -s PTHREAD_POOL_SIZE=4
gb_EMSCRIPTEN_LDFLAGS := $(gb_EMSCRIPTEN_CPPFLAGS) --bind -s ERROR_ON_UNDEFINED_SYMBOLS=1 -s FETCH=1 -s ASSERTIONS=2 -s EXIT_RUNTIME=1 -s EXTRA_EXPORTED_RUNTIME_METHODS=["UTF16ToString","stringToUTF16"]
gb_EMSCRIPTEN_QTDEFS := -DQT_NO_LINKED_LIST -DQT_NO_JAVA_STYLE_ITERATORS -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB

gb_Executable_EXT := .html
gb_EMSCRIPTEN_EXCEPT := -s DISABLE_EXCEPTION_CATCHING=0

gb_LinkTarget_CFLAGS += $(gb_EMSCRIPTEN_CPPFLAGS) $(gb_EMSCRIPTEN_QTDEFS)
gb_LinkTarget_CXXFLAGS += $(gb_EMSCRIPTEN_CPPFLAGS) $(gb_EMSCRIPTEN_QTDEFS) $(gb_EMSCRIPTEN_EXCEPT)
gb_LinkTarget_LDFLAGS += $(gb_EMSCRIPTEN_LDFLAGS) $(gb_EMSCRIPTEN_CPPFLAGS) $(gb_EMSCRIPTEN_EXCEPT)

# Linker and compiler optimize + debug flags are handled in LinkTarget.mk
gb_LINKEROPTFLAGS :=
gb_LINKERSTRIPDEBUGFLAGS :=
# This maps to g4, AKA sorce maps. The LO default would otherwise be g2!
gb_DEBUGINFO_FLAGS = -g
# We need at least code elimination, otherwise linking OOMs even with 64GB.
# So we "fake" -Og support to mean -O1 for Emscripten and always enable it for debug in configure.
gb_COMPILERDEBUGOPTFLAGS := -O1
gb_COMPILERNOOPTFLAGS := -O1 -fstrict-aliasing -fstrict-overflow

# cleanup addition JS and wasm files for binaries
define gb_Executable_Executable_platform
$(call gb_LinkTarget_add_auxtargets,$(2),\
        $(patsubst %.lib,%.wasm,$(3)) \
        $(patsubst %.lib,%.js,$(3)) \
        $(patsubst %.lib,%.worker.js,$(3)) \
)

endef

define gb_CppunitTest_CppunitTest_platform
$(call gb_LinkTarget_add_auxtargets,$(2),\
        $(patsubst %.lib,%.wasm,$(3)) \
        $(patsubst %.lib,%.js,$(3)) \
        $(patsubst %.lib,%.worker.js,$(3)) \
)

endef

gb_SUPPRESS_TESTS := $(true)

define gb_Library_get_rpath
endef

define gb_Executable_get_rpath
endef

# vim: set noet sw=4 ts=4
diff --git a/solenv/gbuild/platform/com_GCC_defs.mk b/solenv/gbuild/platform/com_GCC_defs.mk
index e07bd28..fe99e98 100644
--- a/solenv/gbuild/platform/com_GCC_defs.mk
+++ b/solenv/gbuild/platform/com_GCC_defs.mk
@@ -49,6 +49,7 @@ gb_COMPILERDEFS := \
	-DBOOST_ERROR_CODE_HEADER_ONLY \
	-DBOOST_SYSTEM_NO_DEPRECATED \
	-DCPPU_ENV=$(gb_CPPU_ENV) \
	$(if $(filter EMSCRIPTEN,$(OS)),-U_FORTIFY_SOURCE) \

gb_CFLAGS_COMMON := \
	-Wall \
@@ -63,7 +64,7 @@ gb_CFLAGS_COMMON := \
	-fmessage-length=0 \
	-fno-common \
	-pipe \
	-fstack-protector-strong \
	$(if $(filter EMSCRIPTEN,$(OS)),-fno-stack-protector,-fstack-protector-strong) \
	$(if $(gb_COLOR),-fdiagnostics-color=always) \

gb_CXXFLAGS_COMMON := \
@@ -80,7 +81,7 @@ gb_CXXFLAGS_COMMON := \
	-fmessage-length=0 \
	-fno-common \
	-pipe \
	-fstack-protector-strong \
	$(if $(filter EMSCRIPTEN,$(OS)),-fno-stack-protector,-fstack-protector-strong) \
	$(if $(gb_COLOR),-fdiagnostics-color=always) \

ifeq ($(HAVE_WDEPRECATED_COPY_DTOR),TRUE)
@@ -109,8 +110,10 @@ endif
ifeq ($(DISABLE_DYNLOADING),TRUE)
gb_CFLAGS_COMMON += -ffunction-sections -fdata-sections
gb_CXXFLAGS_COMMON += -ffunction-sections -fdata-sections
ifneq ($(OS),EMSCRIPTEN)
gb_LinkTarget_LDFLAGS += -Wl,--gc-sections
endif
endif

ifeq ($(COM_IS_CLANG),TRUE)
gb_CXXFLAGS_COMMON += \
@@ -143,7 +146,7 @@ endif
gb_VISIBILITY_FLAGS_CXX := -fvisibility-inlines-hidden
gb_CXXFLAGS_COMMON += $(gb_VISIBILITY_FLAGS_CXX)

gb_LinkTarget_LDFLAGS += -fstack-protector-strong
gb_LinkTarget_LDFLAGS += $(if $(filter EMSCRIPTEN,$(OS)),-fno-stack-protector,-fstack-protector-strong)

ifneq ($(gb_ENABLE_PCH),)
ifeq ($(COM_IS_CLANG),TRUE)
diff --git a/xmlsecurity/Library_xsec_xmlsec.mk b/xmlsecurity/Library_xsec_xmlsec.mk
index bd2cb6a..450e19b 100644
--- a/xmlsecurity/Library_xsec_xmlsec.mk
+++ b/xmlsecurity/Library_xsec_xmlsec.mk
@@ -51,7 +51,7 @@ endif

$(eval $(call gb_Library_use_externals,xsec_xmlsec,\
	boost_headers \
	gpgmepp \
	$(if $(ENABLE_GPGMEPP),gpgmepp) \
	libxml2 \
	xmlsec \
))
@@ -65,9 +65,6 @@ $(eval $(call gb_Library_add_exception_objects,xsec_xmlsec,\
	xmlsecurity/source/xmlsec/xmlelementwrapper_xmlsecimpl \
	xmlsecurity/source/xmlsec/xmlsec_init \
	xmlsecurity/source/xmlsec/xmlstreamio \
	xmlsecurity/source/xmlsec/nss/ciphercontext \
	xmlsecurity/source/xmlsec/nss/digestcontext \
	xmlsecurity/source/xmlsec/nss/nssinitializer \
))

ifeq ($(ENABLE_GPGMEPP),TRUE)
@@ -110,24 +107,36 @@ $(eval $(call gb_Library_add_exception_objects,xsec_xmlsec,\
	xmlsecurity/source/xmlsec/mscrypt/xmlsignature_mscryptimpl \
))

else
ifeq ($(ENABLE_NSS),TRUE)

$(eval $(call gb_Library_add_defs,xsec_xmlsec,\
	-DXMLSEC_CRYPTO_NSS \
$(eval $(call gb_Library_add_exception_objects,xsec_xmlsec,\
	xmlsecurity/source/xmlsec/nss/ciphercontext \
	xmlsecurity/source/xmlsec/nss/digestcontext \
	xmlsecurity/source/xmlsec/nss/nssinitializer \
))

# nss3 after static libs to appease --as-needed linkers
$(eval $(call gb_Library_use_externals,xsec_xmlsec,\
	nss3 \
))

endif

else # !$(OS),WNT

ifeq ($(SYSTEM_XMLSEC),)
$(eval $(call gb_Library_add_libs,xsec_xmlsec,\
	$(call gb_UnpackedTarball_get_dir,xmlsec)/src/nss/.libs/libxmlsec1-nss.a \
	$(call gb_UnpackedTarball_get_dir,xmlsec)/src/.libs/libxmlsec1.a \
       $(call gb_UnpackedTarball_get_dir,xmlsec)/src/nss/.libs/libxmlsec1-nss.a \
       $(call gb_UnpackedTarball_get_dir,xmlsec)/src/.libs/libxmlsec1.a \
))
endif

$(eval $(call gb_Library_use_externals,xsec_xmlsec,\
	plc4 \
))
ifeq ($(ENABLE_NSS),TRUE)

$(eval $(call gb_Library_add_exception_objects,xsec_xmlsec,\
	xmlsecurity/source/xmlsec/nss/ciphercontext \
	xmlsecurity/source/xmlsec/nss/digestcontext \
	xmlsecurity/source/xmlsec/nss/nssinitializer \
	xmlsecurity/source/xmlsec/nss/sanextension_nssimpl \
	xmlsecurity/source/xmlsec/nss/secerror \
	xmlsecurity/source/xmlsec/nss/securityenvironment_nssimpl \
@@ -137,17 +146,32 @@ $(eval $(call gb_Library_add_exception_objects,xsec_xmlsec,\
	xmlsecurity/source/xmlsec/nss/xmlsignature_nssimpl \
))

endif
$(eval $(call gb_Library_add_defs,xsec_xmlsec,\
	-DXMLSEC_CRYPTO_NSS \
))

$(eval $(call gb_Library_use_externals,xsec_xmlsec,\
	plc4 \
))
# nss3 after static libs to appease --as-needed linkers
$(eval $(call gb_Library_use_externals,xsec_xmlsec,\
	nss3 \
))

else # ! $(ENABLE_NSS)

ifeq ($(ENABLE_OPENSSL),TRUE)
$(eval $(call gb_Library_use_external,xsec_xmlsec,openssl))
endif

endif # !$(ENABLE_NSS)

ifeq ($(OS),SOLARIS)
$(eval $(call gb_Library_add_libs,xsec_xmlsec,\
	-ldl \
))
endif

endif # !$(OS),WNT

# vim: set noet sw=4 ts=4:
diff --git a/xmlsecurity/inc/pch/precompiled_xsec_xmlsec.hxx b/xmlsecurity/inc/pch/precompiled_xsec_xmlsec.hxx
index 31365ab..3ed7749 100644
--- a/xmlsecurity/inc/pch/precompiled_xsec_xmlsec.hxx
+++ b/xmlsecurity/inc/pch/precompiled_xsec_xmlsec.hxx
@@ -33,7 +33,9 @@
#include <memory>
#include <new>
#include <ostream>
#ifdef XMLSEC_CRYPTO_NSS
#include <pk11pub.h>
#endif
#include <stddef.h>
#include <string.h>
#include <string>