diff --git a/cmake/QtExecutableHelpers.cmake b/cmake/QtExecutableHelpers.cmake index 42d7840a049..a235c9bb36a 100644 --- a/cmake/QtExecutableHelpers.cmake +++ b/cmake/QtExecutableHelpers.cmake @@ -40,8 +40,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 4fdfba5e422..08e8d973497 100644 --- a/cmake/QtWasmHelpers.cmake +++ b/cmake/QtWasmHelpers.cmake @@ -7,7 +7,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") @@ -80,3 +79,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 188520ae11e..09d62232db0 100644 --- a/src/corelib/Qt6CoreMacros.cmake +++ b/src/corelib/Qt6CoreMacros.cmake @@ -650,6 +650,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 dbc8a493924..99de3aac374 100644 --- a/src/corelib/Qt6WasmMacros.cmake +++ b/src/corelib/Qt6WasmMacros.cmake @@ -60,3 +60,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()