From 6b2af05f275f38f25edfc2d651df18169fdc739c Mon Sep 17 00:00:00 2001 From: Lorn Potter Date: Thu, 14 Jul 2022 10:07:00 +1000 Subject: [PATCH] wasm: allow apps to override EXPORT_RUNTIME_METHODS Developers can add to Emscripten's EXPORT_RUNTIME_METHODS by defining their own using: QT_WASM_EXTRA_EXPORTED_METHODS Which will add on to Qt's default exported runtime methods of UTF16ToString,stringToUTF16 for cmake: set_target_properties( PROPERTIES QT_WASM_EXTRA_EXPORTED_METHODS "ccall,cwrap") or set(QT_WASM_EXTRA_EXPORTED_METHODS "ccall,cwrap") for qmake: QT_WASM_EXTRA_EXPORTED_METHODS = ccall,cwrap Done-with: Mikolaj Boc Fixes: QTBUG-104882 Change-Id: I9678bdb7b077aaa8527057212ea4e161c0be0b60 Reviewed-by: Alexandru Croitor (cherry picked from commit 1f9c1f032c5d8af2c6758081eb8de076fe678b53) Reviewed-by: Qt Cherry-pick Bot --- cmake/QtExecutableHelpers.cmake | 2 ++ cmake/QtWasmHelpers.cmake | 7 ++++++- mkspecs/features/wasm/wasm.prf | 8 ++++++++ mkspecs/wasm-emscripten/qmake.conf | 1 - src/corelib/Qt6CoreMacros.cmake | 1 + src/corelib/Qt6WasmMacros.cmake | 18 ++++++++++++++++++ 6 files changed, 35 insertions(+), 2 deletions(-) diff --git a/cmake/QtExecutableHelpers.cmake b/cmake/QtExecutableHelpers.cmake index 916cb4d03c5..96b067d8985 100644 --- a/cmake/QtExecutableHelpers.cmake +++ b/cmake/QtExecutableHelpers.cmake @@ -37,8 +37,10 @@ function(qt_internal_add_executable name) endif() if(WASM) + qt_internal_wasm_add_finalizers("${name}") _qt_internal_wasm_add_target_helpers("${name}") endif() + if (arg_VERSION) if(arg_VERSION MATCHES "[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+") # nothing to do diff --git a/cmake/QtWasmHelpers.cmake b/cmake/QtWasmHelpers.cmake index 9ed280fef55..ec0dd122e24 100644 --- a/cmake/QtWasmHelpers.cmake +++ b/cmake/QtWasmHelpers.cmake @@ -4,7 +4,6 @@ function (qt_internal_setup_wasm_target_properties wasmTarget) target_link_options("${wasmTarget}" INTERFACE "SHELL:-s ERROR_ON_UNDEFINED_SYMBOLS=1" - "SHELL:-s EXPORTED_RUNTIME_METHODS=UTF16ToString,stringToUTF16" "SHELL:-s MAX_WEBGL_VERSION=2" "SHELL:-s FETCH=1" "SHELL:-s WASM_BIGINT=1") @@ -77,3 +76,9 @@ function (qt_internal_setup_wasm_target_properties wasmTarget) target_compile_definitions("${wasmTarget}" INTERFACE QT_HAVE_EMSCRIPTEN_ASYNCIFY) endif() endfunction() + +function(qt_internal_wasm_add_finalizers target) + qt_add_list_file_finalizer(_qt_internal_add_wasm_extra_exported_methods ${target}) +endfunction() + + diff --git a/mkspecs/features/wasm/wasm.prf b/mkspecs/features/wasm/wasm.prf index 1ccda7a6e80..5e6501ed991 100644 --- a/mkspecs/features/wasm/wasm.prf +++ b/mkspecs/features/wasm/wasm.prf @@ -7,6 +7,14 @@ isEmpty(DESTDIR): DESTDIR = $$OUT_PWD exists($$QMAKE_QT_CONFIG) { ## this may be subject to change + ## qmake puts a space if done otherwise + !isEmpty(QT_WASM_EXTRA_EXPORTED_METHODS): { + EXPORTED_METHODS = UTF16ToString,stringToUTF16,$$QT_WASM_EXTRA_EXPORTED_METHODS + } else { + EXPORTED_METHODS = UTF16ToString,stringToUTF16 + } + EMCC_LFLAGS += -s EXPORTED_RUNTIME_METHODS=$$EXPORTED_METHODS + qtConfig(thread) { EMCC_LFLAGS += -pthread diff --git a/mkspecs/wasm-emscripten/qmake.conf b/mkspecs/wasm-emscripten/qmake.conf index 9e5a223d1b4..648246b268c 100644 --- a/mkspecs/wasm-emscripten/qmake.conf +++ b/mkspecs/wasm-emscripten/qmake.conf @@ -32,7 +32,6 @@ EMCC_COMMON_LFLAGS += \ -s WASM=1 \ -s MAX_WEBGL_VERSION=2 \ -s ERROR_ON_UNDEFINED_SYMBOLS=1 \ - -s EXPORTED_RUNTIME_METHODS=UTF16ToString,stringToUTF16 \ --bind \ -s FETCH=1 \ -s MODULARIZE=1 \ diff --git a/src/corelib/Qt6CoreMacros.cmake b/src/corelib/Qt6CoreMacros.cmake index f21ca81e3fe..ad82f518771 100644 --- a/src/corelib/Qt6CoreMacros.cmake +++ b/src/corelib/Qt6CoreMacros.cmake @@ -646,6 +646,7 @@ function(_qt_internal_finalize_executable target) if(EMSCRIPTEN) _qt_internal_wasm_add_target_helpers("${target}") + _qt_internal_add_wasm_extra_exported_methods("${target}") endif() if(IOS) _qt_internal_finalize_ios_app("${target}") diff --git a/src/corelib/Qt6WasmMacros.cmake b/src/corelib/Qt6WasmMacros.cmake index 8f9720653b7..812f7df97a2 100644 --- a/src/corelib/Qt6WasmMacros.cmake +++ b/src/corelib/Qt6WasmMacros.cmake @@ -57,3 +57,21 @@ function(_qt_internal_wasm_add_target_helpers target) endif() endfunction() +function(_qt_internal_add_wasm_extra_exported_methods target) + get_target_property(wasm_extra_exported_methods "${target}" QT_WASM_EXTRA_EXPORTED_METHODS) + + if(NOT wasm_extra_exported_methods) + set(wasm_extra_exported_methods ${QT_WASM_EXTRA_EXPORTED_METHODS}) + endif() + + if(wasm_extra_exported_methods) + target_link_options("${target}" PRIVATE + "SHELL:-s EXPORTED_RUNTIME_METHODS=UTF16ToString,stringToUTF16,${wasm_extra_exported_methods}" + ) + else() + # an errant dangling comma will break this + target_link_options("${target}" PRIVATE + "SHELL:-s EXPORTED_RUNTIME_METHODS=UTF16ToString,stringToUTF16" + ) + endif() +endfunction()