@@ -34,6 +34,47 @@ if(NOT EMSCRIPTEN_INCLUDE_DIR OR NOT PYTHON_DEFAULT_AVAILABLE)
34
34
ocv_module_disable (js )
35
35
endif ()
36
36
37
+ # Get Emscripten version from emscripten/version.h
38
+ unset (EMSCRIPTEN_VERSION )
39
+ unset (EMSCRIPTEN_VERSION_CONTENTS )
40
+ unset (EMSCRIPTEN_VERSION_MAJOR )
41
+ unset (EMSCRIPTEN_VERSION_MINOR )
42
+ unset (EMSCRIPTEN_VERSION_TINY )
43
+
44
+ set (EMSCRIPTEN_VERSION_PATH "${EMSCRIPTEN_INCLUDE_DIR} /emscripten/version.h" )
45
+ if (NOT EXISTS "${EMSCRIPTEN_VERSION_PATH} " )
46
+ message (STATUS "${EMSCRIPTEN_INCLUDE_DIR} /emscripten/version.h is missing" )
47
+ else ()
48
+ file (STRINGS "${EMSCRIPTEN_VERSION_PATH} " EMSCRIPTEN_VERSION_CONTENTS REGEX "^#define[ \t ]+__EMSCRIPTEN_[a-z]+__[ \t ][0-9]+" )
49
+ if (NOT EMSCRIPTEN_VERSION_CONTENTS )
50
+ message (STATUS "${EMSCRIPTEN_INCLUDE_DIR} /emscripten/version.h is exists, but is not readable" )
51
+ else ()
52
+ if (EMSCRIPTEN_VERSION_CONTENTS MATCHES "__EMSCRIPTEN_major__[ \t ]+([0-9]+)" )
53
+ set (EMSCRIPTEN_VERSION_MAJOR "${CMAKE_MATCH_1} " )
54
+ endif ()
55
+ if (EMSCRIPTEN_VERSION_CONTENTS MATCHES "__EMSCRIPTEN_minor__[ \t ]+([0-9]+)" )
56
+ set (EMSCRIPTEN_VERSION_MINOR "${CMAKE_MATCH_1} " )
57
+ endif ()
58
+ if (EMSCRIPTEN_VERSION_CONTENTS MATCHES "__EMSCRIPTEN_tiny__[ \t ]+([0-9]+)" )
59
+ set (EMSCRIPTEN_VERSION_TINY "${CMAKE_MATCH_1} " )
60
+ endif ()
61
+
62
+ # When version(major/minor/tiny) is 0, "if(version)" is failed.
63
+ # "if(version GREATER_EQUAL 0)" can compare version as numeric.
64
+ if ( (EMSCRIPTEN_VERSION_MAJOR GREATER_EQUAL "0" ) AND
65
+ (EMSCRIPTEN_VERSION_MINOR GREATER_EQUAL "0" ) AND
66
+ (EMSCRIPTEN_VERSION_TINY GREATER_EQUAL "0" )
67
+ )
68
+ set (EMSCRIPTEN_VERSION "${EMSCRIPTEN_VERSION_MAJOR} .${EMSCRIPTEN_VERSION_MINOR} .${EMSCRIPTEN_VERSION_TINY} " )
69
+ message (STATUS "js: Emscripten version = ${EMSCRIPTEN_VERSION} " )
70
+ else ()
71
+ message (STATUS "js: Emscripten version is not able to parsed" )
72
+ message (AUTHOR_WARNING "EMSCRIPTEN_VERSION_CONTENTS = ${EMSCRIPTEN_VERSION_CONTENTS} " )
73
+ endif ()
74
+ endif ()
75
+ endif ()
76
+
77
+
37
78
ocv_add_module (js BINDINGS PRIVATE_REQUIRED opencv_js_bindings_generator )
38
79
39
80
ocv_module_include_directories (${EMSCRIPTEN_INCLUDE_DIR} )
@@ -71,7 +112,12 @@ endif()
71
112
72
113
set (EMSCRIPTEN_LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS} -s TOTAL_MEMORY=128MB -s WASM_MEM_MAX=1GB -s ALLOW_MEMORY_GROWTH=1" )
73
114
set (EMSCRIPTEN_LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS} -s MODULARIZE=1" )
74
- set (EMSCRIPTEN_LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS} -s EXPORT_NAME=\" 'cv'\" -s DEMANGLE_SUPPORT=1" )
115
+ set (EMSCRIPTEN_LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS} -s EXPORT_NAME=\" 'cv'\" " )
116
+ # See https://github.com/opencv/opencv/issues/27513
117
+ # DEMANGLE_SUPPRT is deprecated at Emscripten 3.1.54 and later.
118
+ if (NOT EMSCRIPTEN_VERSION OR EMSCRIPTEN_VERSION VERSION_LESS "3.1.54" )
119
+ set (EMSCRIPTEN_LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS} -s DEMANGLE_SUPPORT=1" )
120
+ endif ()
75
121
set (EMSCRIPTEN_LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS} -s FORCE_FILESYSTEM=1 --use-preload-plugins --bind --post-js ${JS_HELPER} ${COMPILE_FLAGS} " )
76
122
set_target_properties (${the_module} PROPERTIES LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS} " )
77
123
0 commit comments