From 8d426718c6ae924d8f5b846f4b5a5e2a55c1cc67 Mon Sep 17 00:00:00 2001 From: Kumataro Date: Sun, 6 Jul 2025 07:53:05 +0900 Subject: [PATCH] js: remove deprecated DEMANGLE_SUPPORT option --- modules/js/CMakeLists.txt | 48 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/modules/js/CMakeLists.txt b/modules/js/CMakeLists.txt index 47cba260e1..ca27e3df60 100644 --- a/modules/js/CMakeLists.txt +++ b/modules/js/CMakeLists.txt @@ -34,6 +34,47 @@ if(NOT EMSCRIPTEN_INCLUDE_DIR OR NOT PYTHON_DEFAULT_AVAILABLE) ocv_module_disable(js) endif() +# Get Emscripten version from emscripten/version.h +unset(EMSCRIPTEN_VERSION) +unset(EMSCRIPTEN_VERSION_CONTENTS) +unset(EMSCRIPTEN_VERSION_MAJOR) +unset(EMSCRIPTEN_VERSION_MINOR) +unset(EMSCRIPTEN_VERSION_TINY) + +set(EMSCRIPTEN_VERSION_PATH "${EMSCRIPTEN_INCLUDE_DIR}/emscripten/version.h") +if(NOT EXISTS "${EMSCRIPTEN_VERSION_PATH}") + message(STATUS "${EMSCRIPTEN_INCLUDE_DIR}/emscripten/version.h is missing") +else() + file(STRINGS "${EMSCRIPTEN_VERSION_PATH}" EMSCRIPTEN_VERSION_CONTENTS REGEX "^#define[ \t]+__EMSCRIPTEN_[a-z]+__[ \t][0-9]+") + if(NOT EMSCRIPTEN_VERSION_CONTENTS) + message(STATUS "${EMSCRIPTEN_INCLUDE_DIR}/emscripten/version.h is exists, but is not readable") + else() + if(EMSCRIPTEN_VERSION_CONTENTS MATCHES "__EMSCRIPTEN_major__[ \t]+([0-9]+)") + set(EMSCRIPTEN_VERSION_MAJOR "${CMAKE_MATCH_1}") + endif() + if(EMSCRIPTEN_VERSION_CONTENTS MATCHES "__EMSCRIPTEN_minor__[ \t]+([0-9]+)") + set(EMSCRIPTEN_VERSION_MINOR "${CMAKE_MATCH_1}") + endif() + if(EMSCRIPTEN_VERSION_CONTENTS MATCHES "__EMSCRIPTEN_tiny__[ \t]+([0-9]+)") + set(EMSCRIPTEN_VERSION_TINY "${CMAKE_MATCH_1}") + endif() + + # When version(major/minor/tiny) is 0, "if(version)" is failed. + # "if(version GREATER_EQUAL 0)" can compare version as numeric. + if( (EMSCRIPTEN_VERSION_MAJOR GREATER_EQUAL "0") AND + (EMSCRIPTEN_VERSION_MINOR GREATER_EQUAL "0") AND + (EMSCRIPTEN_VERSION_TINY GREATER_EQUAL "0") + ) + set(EMSCRIPTEN_VERSION "${EMSCRIPTEN_VERSION_MAJOR}.${EMSCRIPTEN_VERSION_MINOR}.${EMSCRIPTEN_VERSION_TINY}") + message(STATUS "js: Emscripten version = ${EMSCRIPTEN_VERSION}") + else() + message(STATUS "js: Emscripten version is not able to parsed") + message(AUTHOR_WARNING "EMSCRIPTEN_VERSION_CONTENTS = ${EMSCRIPTEN_VERSION_CONTENTS}") + endif() + endif() +endif() + + ocv_add_module(js BINDINGS PRIVATE_REQUIRED opencv_js_bindings_generator) ocv_module_include_directories(${EMSCRIPTEN_INCLUDE_DIR}) @@ -71,7 +112,12 @@ endif() set(EMSCRIPTEN_LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS} -s TOTAL_MEMORY=128MB -s WASM_MEM_MAX=1GB -s ALLOW_MEMORY_GROWTH=1") set(EMSCRIPTEN_LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS} -s MODULARIZE=1") -set(EMSCRIPTEN_LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS} -s EXPORT_NAME=\"'cv'\" -s DEMANGLE_SUPPORT=1") +set(EMSCRIPTEN_LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS} -s EXPORT_NAME=\"'cv'\"") +# See https://github.com/opencv/opencv/issues/27513 +# DEMANGLE_SUPPRT is deprecated at Emscripten 3.1.54 and later. +if(NOT EMSCRIPTEN_VERSION OR EMSCRIPTEN_VERSION VERSION_LESS "3.1.54") + set(EMSCRIPTEN_LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS} -s DEMANGLE_SUPPORT=1") +endif() set(EMSCRIPTEN_LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS} -s FORCE_FILESYSTEM=1 --use-preload-plugins --bind --post-js ${JS_HELPER} ${COMPILE_FLAGS}") set_target_properties(${the_module} PROPERTIES LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS}")