Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/modules/js/CMakeLists.txt
16337 views
1
# ----------------------------------------------------------------------------
2
# CMake file for js support
3
# ----------------------------------------------------------------------------
4
set(the_description "The js bindings")
5
6
if(NOT BUILD_opencv_js) # should be enabled explicitly (by build_js.py script)
7
ocv_module_disable(js)
8
endif()
9
10
set(OPENCV_JS "opencv.js")
11
12
find_path(EMSCRIPTEN_INCLUDE_DIR
13
emscripten/bind.h
14
PATHS
15
ENV EMSCRIPTEN_ROOT
16
PATH_SUFFIXES system/include include
17
DOC "Location of Emscripten SDK")
18
19
if(NOT EMSCRIPTEN_INCLUDE_DIR OR NOT PYTHON_DEFAULT_AVAILABLE)
20
set(DISABLE_MSG "Module 'js' disabled because the following dependencies are not found:")
21
if(NOT EMSCRIPTEN_INCLUDE_DIR)
22
set(DISABLE_MSG "${DISABLE_MSG} Emscripten")
23
endif()
24
if(NOT PYTHON_DEFAULT_AVAILABLE)
25
set(DISABLE_MSG "${DISABLE_MSG} Python")
26
endif()
27
message(STATUS ${DISABLE_MSG})
28
ocv_module_disable(js)
29
endif()
30
31
ocv_add_module(js BINDINGS)
32
33
ocv_module_include_directories(${EMSCRIPTEN_INCLUDE_DIR})
34
35
# get list of modules to wrap
36
# message(STATUS "Wrapped in js:")
37
set(OPENCV_JS_MODULES)
38
foreach(m ${OPENCV_MODULES_BUILD})
39
if(";${OPENCV_MODULE_${m}_WRAPPERS};" MATCHES ";js;" AND HAVE_${m})
40
list(APPEND OPENCV_JS_MODULES ${m})
41
# message(STATUS "\t${m}")
42
endif()
43
endforeach()
44
45
set(opencv_hdrs "")
46
foreach(m ${OPENCV_JS_MODULES})
47
list(APPEND opencv_hdrs ${OPENCV_MODULE_${m}_HEADERS})
48
endforeach(m)
49
50
# header blacklist
51
ocv_list_filterout(opencv_hdrs "modules/.*.h$")
52
ocv_list_filterout(opencv_hdrs "modules/core/.*/cuda")
53
ocv_list_filterout(opencv_hdrs "modules/core/.*/opencl")
54
ocv_list_filterout(opencv_hdrs "modules/core/include/opencv2/core/opengl.hpp")
55
ocv_list_filterout(opencv_hdrs "modules/core/include/opencv2/core/ocl.hpp")
56
ocv_list_filterout(opencv_hdrs "modules/cuda.*")
57
ocv_list_filterout(opencv_hdrs "modules/cudev")
58
ocv_list_filterout(opencv_hdrs "modules/core/.*/hal/")
59
ocv_list_filterout(opencv_hdrs "modules/.*/detection_based_tracker.hpp") # Conditional compilation
60
ocv_list_filterout(opencv_hdrs "modules/core/include/opencv2/core/utils/.*")
61
62
file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/headers.txt" "${opencv_hdrs}")
63
64
set(bindings_cpp "${CMAKE_CURRENT_BINARY_DIR}/bindings.cpp")
65
66
set(scripts_hdr_parser "${CMAKE_CURRENT_SOURCE_DIR}/../python/src2/hdr_parser.py")
67
68
set(JS_HELPER "${CMAKE_CURRENT_SOURCE_DIR}/src/helpers.js")
69
70
add_custom_command(
71
OUTPUT ${bindings_cpp}
72
COMMAND ${PYTHON_DEFAULT_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/src/embindgen.py" ${scripts_hdr_parser} ${bindings_cpp} "${CMAKE_CURRENT_BINARY_DIR}/headers.txt" "${CMAKE_CURRENT_SOURCE_DIR}/src/core_bindings.cpp"
73
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/core_bindings.cpp
74
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/embindgen.py
75
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/templates.py
76
DEPENDS ${scripts_hdr_parser}
77
#(not needed - generated by CMake) DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/headers.txt
78
DEPENDS ${opencv_hdrs}
79
DEPENDS ${JS_HELPER})
80
81
add_definitions("-std=c++11")
82
83
link_libraries(${OPENCV_MODULE_${the_module}_DEPS})
84
85
ocv_add_executable(${the_module} ${bindings_cpp})
86
87
set(COMPILE_FLAGS "")
88
if(NOT CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
89
set(COMPILE_FLAGS "${COMPILE_FLAGS} -Wno-missing-prototypes")
90
endif()
91
if(COMPILE_FLAGS)
92
set_target_properties(${the_module} PROPERTIES COMPILE_FLAGS ${COMPILE_FLAGS})
93
endif()
94
set(EMSCRIPTEN_LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS} --memory-init-file 0 -s TOTAL_MEMORY=134217728 -s ALLOW_MEMORY_GROWTH=1")
95
set(EMSCRIPTEN_LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS} -s MODULARIZE=1 -s SINGLE_FILE=1")
96
set(EMSCRIPTEN_LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS} -s EXPORT_NAME=\"'cv'\" -s DEMANGLE_SUPPORT=1")
97
set(EMSCRIPTEN_LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS} -s FORCE_FILESYSTEM=1 --use-preload-plugins --bind --post-js ${JS_HELPER} ${COMPILE_FLAGS}")
98
set_target_properties(${the_module} PROPERTIES LINK_FLAGS "${EMSCRIPTEN_LINK_FLAGS}")
99
100
# add UMD wrapper
101
set(MODULE_JS_PATH "${OpenCV_BINARY_DIR}/bin/${the_module}.js")
102
set(OCV_JS_PATH "${OpenCV_BINARY_DIR}/bin/${OPENCV_JS}")
103
104
add_custom_command(
105
OUTPUT ${OCV_JS_PATH}
106
COMMAND ${PYTHON_DEFAULT_EXECUTABLE} "${CMAKE_CURRENT_SOURCE_DIR}/src/make_umd.py" ${MODULE_JS_PATH} "${OCV_JS_PATH}"
107
DEPENDS ${the_module}
108
DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/src/make_umd.py")
109
110
add_custom_target(${OPENCV_JS} ALL
111
DEPENDS ${OCV_JS_PATH}
112
DEPENDS ${the_module})
113
114
# test
115
set(opencv_test_js_bin_dir "${EXECUTABLE_OUTPUT_PATH}")
116
set(test_dir ${CMAKE_CURRENT_SOURCE_DIR}/test)
117
118
set(opencv_test_js_file_deps "")
119
120
# message(STATUS "${opencv_test_js_bin_dir}")
121
122
# make sure the build directory exists
123
file(MAKE_DIRECTORY "${opencv_test_js_bin_dir}")
124
125
# gather and copy specific files for js test
126
file(GLOB_RECURSE test_files RELATIVE "${test_dir}" "${test_dir}/*")
127
foreach(f ${test_files})
128
# message(STATUS "copy ${test_dir}/${f} ${opencv_test_js_bin_dir}/${f}")
129
add_custom_command(OUTPUT "${opencv_test_js_bin_dir}/${f}"
130
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${test_dir}/${f}" "${opencv_test_js_bin_dir}/${f}"
131
DEPENDS "${test_dir}/${f}"
132
COMMENT "Copying ${f}"
133
)
134
list(APPEND opencv_test_js_file_deps "${test_dir}/${f}" "${opencv_test_js_bin_dir}/${f}")
135
endforeach()
136
137
# copy test data
138
set(test_data "haarcascade_frontalface_default.xml")
139
set(test_data_path "${PROJECT_SOURCE_DIR}/../../data/haarcascades/${test_data}")
140
141
add_custom_command(OUTPUT "${opencv_test_js_bin_dir}/${test_data}"
142
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${test_data_path}" "${opencv_test_js_bin_dir}/${test_data}"
143
DEPENDS "${test_data_path}"
144
COMMENT "Copying ${test_data}"
145
)
146
list(APPEND opencv_test_js_file_deps "${test_data_path}" "${opencv_test_js_bin_dir}/${test_data}")
147
148
add_custom_target(${PROJECT_NAME}_test ALL
149
DEPENDS ${OCV_JS_PATH} ${opencv_test_js_file_deps})
150
151