CMakeLists.txt 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. set(MODULE_NAME "js_bindings_generator")
  2. set(OPENCV_MODULE_IS_PART_OF_WORLD FALSE)
  3. ocv_add_module(${MODULE_NAME} INTERNAL)
  4. set(OPENCV_JS_BINDINGS_DIR "${CMAKE_CURRENT_BINARY_DIR}" CACHE INTERNAL "")
  5. file(REMOVE_RECURSE "${OPENCV_JS_BINDINGS_DIR}/gen")
  6. file(MAKE_DIRECTORY "${OPENCV_JS_BINDINGS_DIR}/gen")
  7. file(REMOVE "${OPENCV_DEPHELPER}/gen_opencv_js_source") # force re-run after CMake
  8. # This file is included from a subdirectory
  9. set(JS_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/..")
  10. include(${JS_SOURCE_DIR}/common.cmake) # fill OPENCV_JS_MODULES
  11. set(opencv_hdrs "")
  12. foreach(m ${OPENCV_JS_MODULES})
  13. list(APPEND opencv_hdrs ${OPENCV_MODULE_${m}_HEADERS})
  14. endforeach(m)
  15. # header blacklist
  16. ocv_list_filterout(opencv_hdrs "modules/.*.h$")
  17. ocv_list_filterout(opencv_hdrs "modules/core/include/opencv2/core/fast_math.hpp")
  18. ocv_list_filterout(opencv_hdrs "modules/core/.*/cuda")
  19. ocv_list_filterout(opencv_hdrs "modules/core/.*/opencl")
  20. ocv_list_filterout(opencv_hdrs "modules/core/include/opencv2/core/opengl.hpp")
  21. ocv_list_filterout(opencv_hdrs "modules/core/include/opencv2/core/ocl.hpp")
  22. ocv_list_filterout(opencv_hdrs "modules/cuda.*")
  23. ocv_list_filterout(opencv_hdrs "modules/cudev")
  24. ocv_list_filterout(opencv_hdrs "modules/core/.*/hal/")
  25. ocv_list_filterout(opencv_hdrs "modules/.*/detection_based_tracker.hpp") # Conditional compilation
  26. ocv_list_filterout(opencv_hdrs "modules/core/include/opencv2/core/utils/*.private.*")
  27. ocv_list_filterout(opencv_hdrs "modules/core/include/opencv2/core/utils/instrumentation.hpp")
  28. ocv_list_filterout(opencv_hdrs "modules/core/include/opencv2/core/utils/trace*")
  29. set(config_json_headers_list "")
  30. foreach(header IN LISTS opencv_hdrs)
  31. if(NOT config_json_headers_list STREQUAL "")
  32. set(config_json_headers_list "${config_json_headers_list},\n\"${header}\"")
  33. else()
  34. set(config_json_headers_list "\"${header}\"")
  35. endif()
  36. endforeach()
  37. set(bindings_cpp "${OPENCV_JS_BINDINGS_DIR}/gen/bindings.cpp")
  38. set(scripts_hdr_parser "${JS_SOURCE_DIR}/../python/src2/hdr_parser.py")
  39. if(DEFINED ENV{OPENCV_JS_WHITELIST})
  40. set(OPENCV_JS_WHITELIST_FILE "$ENV{OPENCV_JS_WHITELIST}")
  41. message(STATUS "Use white list from environment ${OPENCV_JS_WHITELIST_FILE}")
  42. else()
  43. #generate white list from modules/<module_name>/misc/js/whitelist.json
  44. set(OPENCV_JS_WHITELIST_FILE "${CMAKE_CURRENT_BINARY_DIR}/whitelist.json")
  45. foreach(m IN LISTS OPENCV_JS_MODULES)
  46. set(js_whitelist "${OPENCV_MODULE_${m}_LOCATION}/misc/js/gen_dict.json")
  47. if (EXISTS "${js_whitelist}")
  48. file(READ "${js_whitelist}" whitelist_content)
  49. list(APPEND OPENCV_JS_WHITELIST_CONTENT "\"${m}\": ${whitelist_content}")
  50. endif()
  51. endforeach(m)
  52. string(REPLACE ";" ", \n" OPENCV_JS_WHITELIST_CONTENT_STRING "${OPENCV_JS_WHITELIST_CONTENT}")
  53. set(OPENCV_JS_WHITELIST_CONTENT_STRING "{\n${OPENCV_JS_WHITELIST_CONTENT_STRING}}\n")
  54. ocv_update_file("${OPENCV_JS_WHITELIST_FILE}" "${OPENCV_JS_WHITELIST_CONTENT_STRING}")
  55. message(STATUS "Use autogenerated whitelist ${OPENCV_JS_WHITELIST_FILE}")
  56. endif()
  57. include("${OpenCV_SOURCE_DIR}/cmake/OpenCVBindingsPreprocessorDefinitions.cmake")
  58. ocv_bindings_generator_populate_preprocessor_definitions(
  59. OPENCV_MODULES_BUILD
  60. opencv_preprocessor_defs
  61. )
  62. set(__config_str
  63. "{
  64. \"headers\": [
  65. ${config_json_headers_list}
  66. ],
  67. \"preprocessor_definitions\": {
  68. ${opencv_preprocessor_defs}
  69. },
  70. \"core_bindings_file_path\": \"${JS_SOURCE_DIR}/src/core_bindings.cpp\"
  71. }")
  72. set(JSON_CONFIG_FILE_PATH "${CMAKE_CURRENT_BINARY_DIR}/gen_js_config.json")
  73. if(EXISTS "${JSON_CONFIG_FILE_PATH}")
  74. file(READ "${JSON_CONFIG_FILE_PATH}" __content)
  75. else()
  76. set(__content "")
  77. endif()
  78. if(NOT "${__content}" STREQUAL "${__config_str}")
  79. file(WRITE "${JSON_CONFIG_FILE_PATH}" "${__config_str}")
  80. endif()
  81. unset(__config_str)
  82. add_custom_command(
  83. OUTPUT ${bindings_cpp} "${OPENCV_DEPHELPER}/gen_opencv_js_source"
  84. COMMAND
  85. ${PYTHON_DEFAULT_EXECUTABLE}
  86. "${CMAKE_CURRENT_SOURCE_DIR}/embindgen.py"
  87. --parser "${scripts_hdr_parser}"
  88. --output_file "${bindings_cpp}"
  89. --config "${JSON_CONFIG_FILE_PATH}"
  90. --whitelist "${OPENCV_JS_WHITELIST_FILE}"
  91. COMMAND
  92. ${CMAKE_COMMAND} -E touch "${OPENCV_DEPHELPER}/gen_opencv_js_source"
  93. WORKING_DIRECTORY
  94. "${CMAKE_CURRENT_BINARY_DIR}/gen"
  95. DEPENDS
  96. ${JS_SOURCE_DIR}/src/core_bindings.cpp
  97. ${CMAKE_CURRENT_SOURCE_DIR}/embindgen.py
  98. ${CMAKE_CURRENT_SOURCE_DIR}/templates.py
  99. ${JSON_CONFIG_FILE_PATH}
  100. "${OPENCV_JS_WHITELIST_FILE}"
  101. ${scripts_hdr_parser}
  102. #(not needed - generated by CMake) ${CMAKE_CURRENT_BINARY_DIR}/headers.txt
  103. ${opencv_hdrs}
  104. COMMENT "Generate source files for JavaScript bindings"
  105. )
  106. add_custom_target(gen_opencv_js_source
  107. # excluded from all: ALL
  108. DEPENDS ${bindings_cpp} "${OPENCV_DEPHELPER}/gen_opencv_js_source"
  109. SOURCES
  110. ${JS_SOURCE_DIR}/src/core_bindings.cpp
  111. ${CMAKE_CURRENT_SOURCE_DIR}/embindgen.py
  112. ${CMAKE_CURRENT_SOURCE_DIR}/templates.py
  113. )