CMakeLists.txt 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. set(MODULE_NAME "objc_bindings_generator")
  2. set(OPENCV_MODULE_IS_PART_OF_WORLD FALSE)
  3. ocv_add_module(${MODULE_NAME} INTERNAL opencv_core opencv_imgproc)
  4. #set(OPENCV_OBJC_SIGNATURES_FILE "${CMAKE_CURRENT_BINARY_DIR}/opencv_objc_signatures.json" CACHE INTERNAL "")
  5. set(OPENCV_OBJC_BINDINGS_DIR "${CMAKE_CURRENT_BINARY_DIR}" CACHE INTERNAL "")
  6. file(REMOVE_RECURSE "${OPENCV_OBJC_BINDINGS_DIR}/osx")
  7. file(REMOVE "${OPENCV_DEPHELPER}/gen_opencv_objc_source_osx") # force re-run after CMake
  8. file(REMOVE_RECURSE "${OPENCV_OBJC_BINDINGS_DIR}/ios")
  9. file(REMOVE "${OPENCV_DEPHELPER}/gen_opencv_objc_source_ios") # force re-run after CMake
  10. file(REMOVE_RECURSE "${OPENCV_OBJC_BINDINGS_DIR}/visionos")
  11. file(REMOVE "${OPENCV_DEPHELPER}/gen_opencv_objc_source_visionos") # force re-run after CMake
  12. # This file is included from a subdirectory
  13. set(OBJC_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/..")
  14. include(${OBJC_SOURCE_DIR}/common.cmake) # fill OPENCV_OBJC_MODULES
  15. # common files
  16. file(GLOB_RECURSE deps "${CMAKE_CURRENT_SOURCE_DIR}/templates/*")
  17. set(__modules_config "") # list of OpenCV modules
  18. foreach(m ${OPENCV_OBJC_MODULES})
  19. set(module_objc_dir "${OPENCV_MODULE_${m}_LOCATION}/misc/objc")
  20. list(APPEND deps ${OPENCV_MODULE_${m}_HEADERS})
  21. file(GLOB_RECURSE misc_files "${module_objc_dir}/*")
  22. list(APPEND deps ${misc_files})
  23. string(REGEX REPLACE "^opencv_" "" m_ "${m}")
  24. if(__modules_config)
  25. set(__modules_config "${__modules_config},\n")
  26. endif()
  27. file(RELATIVE_PATH rel_path "${OpenCV_SOURCE_DIR}" "${OPENCV_MODULE_${m}_LOCATION}")
  28. set(__modules_config "${__modules_config} { \"name\": \"${m_}\", \"location\": \"${rel_path}\" }")
  29. endforeach(m)
  30. if(HAVE_opencv_objc)
  31. set(__objc_build_dir "\"objc_build_dir\": \"${CMAKE_CURRENT_BINARY_DIR}/../objc\",")
  32. endif()
  33. include("${OpenCV_SOURCE_DIR}/cmake/OpenCVBindingsPreprocessorDefinitions.cmake")
  34. ocv_bindings_generator_populate_preprocessor_definitions(
  35. OPENCV_MODULES_BUILD
  36. opencv_preprocessor_defs
  37. )
  38. set(CONFIG_FILE "${CMAKE_CURRENT_BINARY_DIR}/gen_objc.json")
  39. set(__config_str
  40. "{
  41. \"rootdir\": \"${OpenCV_SOURCE_DIR}\",
  42. ${__objc_build_dir}
  43. \"modules\": [
  44. ${__modules_config}
  45. ],
  46. \"preprocessor_definitions\": {
  47. ${opencv_preprocessor_defs}
  48. }
  49. }
  50. ")
  51. #TODO: ocv_update_file("${CONFIG_FILE}" "${__config_str}" ON_CHANGE_REMOVE "${OPENCV_DEPHELPER}/gen_opencv_objc_source")
  52. if(EXISTS "${CONFIG_FILE}")
  53. file(READ "${CONFIG_FILE}" __content)
  54. else()
  55. set(__content "")
  56. endif()
  57. if(NOT "${__content}" STREQUAL "${__config_str}")
  58. file(WRITE "${CONFIG_FILE}" "${__config_str}")
  59. file(REMOVE "${OPENCV_DEPHELPER}/gen_opencv_objc_source")
  60. endif()
  61. unset(__config_str)
  62. set(objc_generated_files
  63. # "${OPENCV_OBJC_SIGNATURES_FILE}"
  64. )
  65. string(REPLACE "opencv_" "" MODULES "${OPENCV_OBJC_MODULES}")
  66. if(NOT DEFINED OPENCV_OBJC_TARGET AND APPLE_FRAMEWORK)
  67. if(IOS)
  68. set(OPENCV_OBJC_TARGET "ios")
  69. elseif(XROS)
  70. set(OPENCV_OBJC_TARGET "visionos")
  71. else()
  72. set(OPENCV_OBJC_TARGET "osx")
  73. endif()
  74. endif()
  75. if(NOT DEFINED OPENCV_OBJC_FRAMEWORK_NAME)
  76. if(DEFINED FRAMEWORK_NAME)
  77. set(OPENCV_OBJC_FRAMEWORK_NAME "${FRAMEWORK_NAME}")
  78. else()
  79. set(OPENCV_OBJC_FRAMEWORK_NAME "opencv2")
  80. endif()
  81. endif()
  82. set(objc_generated_targets "")
  83. macro(ocv_add_objc_generated_target TARGET)
  84. set(objc_${TARGET}_generated_output_dependecy "${OPENCV_DEPHELPER}/gen_opencv_objc_source_${TARGET}")
  85. file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}")
  86. add_custom_command(
  87. OUTPUT ${objc_generated_files} "${objc_${TARGET}_generated_output_dependecy}"
  88. COMMAND ${PYTHON_DEFAULT_EXECUTABLE} "${OBJC_SOURCE_DIR}/generator/gen_objc.py"
  89. -p "${OBJC_SOURCE_DIR}/../python/src2/gen2.py"
  90. -c "${CONFIG_FILE}"
  91. -t "${TARGET}"
  92. -f "${OPENCV_OBJC_FRAMEWORK_NAME}"
  93. COMMAND ${CMAKE_COMMAND} -E touch "${objc_${TARGET}_generated_output_dependecy}"
  94. WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${TARGET}"
  95. DEPENDS "${OpenCV_SOURCE_DIR}/modules/objc/generator/gen_objc.py"
  96. "${OpenCV_SOURCE_DIR}/modules/python/src2/gen2.py"
  97. "${OpenCV_SOURCE_DIR}/modules/python/src2/hdr_parser.py"
  98. # don't, result of file(WRITE): "${CMAKE_CURRENT_BINARY_DIR}/gen_objc.json"
  99. ${deps}
  100. # not allowed (file(WRITE) result): "${CONFIG_FILE}"
  101. COMMENT "Generate files for Objective-C bindings (${TARGET})"
  102. )
  103. add_custom_target(gen_opencv_objc_source_${TARGET}
  104. # excluded from all: ALL
  105. DEPENDS ${objc_generated_files} ${objc_${TARGET}_generated_output_dependecy}
  106. SOURCES "${OBJC_SOURCE_DIR}/generator/gen_objc.py"
  107. "${OBJC_SOURCE_DIR}/generator/templates/cmakelists.template"
  108. "${CMAKE_CURRENT_BINARY_DIR}/gen_objc.json"
  109. )
  110. list(APPEND objc_generated_targets gen_opencv_objc_source_${TARGET})
  111. endmacro()
  112. if(OPENCV_OBJC_TARGET)
  113. ocv_add_objc_generated_target(${OPENCV_OBJC_TARGET})
  114. else()
  115. ocv_add_objc_generated_target(osx)
  116. ocv_add_objc_generated_target(ios)
  117. ocv_add_objc_generated_target(visionos)
  118. endif()
  119. add_custom_target(gen_opencv_objc_source
  120. # excluded from all: ALL
  121. DEPENDS ${objc_generated_targets}
  122. )