CMakeLists.txt 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. set(the_description "The Core Functionality")
  2. ocv_add_dispatched_file(mathfuncs_core SSE2 AVX AVX2 LASX)
  3. ocv_add_dispatched_file(stat SSE4_2 AVX2 LASX)
  4. ocv_add_dispatched_file(arithm SSE2 SSE4_1 AVX2 VSX3 LASX)
  5. ocv_add_dispatched_file(convert SSE2 AVX2 VSX3 LASX)
  6. ocv_add_dispatched_file(convert_scale SSE2 AVX2 LASX)
  7. ocv_add_dispatched_file(count_non_zero SSE2 AVX2 LASX)
  8. ocv_add_dispatched_file(has_non_zero SSE2 AVX2 LASX )
  9. ocv_add_dispatched_file(matmul SSE2 SSE4_1 AVX2 AVX512_SKX NEON_DOTPROD LASX)
  10. ocv_add_dispatched_file(mean SSE2 AVX2 LASX)
  11. ocv_add_dispatched_file(merge SSE2 AVX2 LASX)
  12. ocv_add_dispatched_file(split SSE2 AVX2 LASX)
  13. ocv_add_dispatched_file(sum SSE2 AVX2 LASX)
  14. ocv_add_dispatched_file(norm SSE2 SSE4_1 AVX AVX2 NEON_DOTPROD LASX)
  15. # dispatching for accuracy tests
  16. ocv_add_dispatched_file_force_all(test_intrin128 TEST SSE2 SSE3 SSSE3 SSE4_1 SSE4_2 AVX FP16 AVX2 AVX512_SKX)
  17. ocv_add_dispatched_file_force_all(test_intrin256 TEST AVX2 AVX512_SKX LASX)
  18. ocv_add_dispatched_file_force_all(test_intrin512 TEST AVX512_SKX)
  19. set(PARALLEL_ENABLE_PLUGINS_DEFAULT ON)
  20. if(EMSCRIPTEN OR IOS OR XROS OR WINRT)
  21. set(PARALLEL_ENABLE_PLUGINS_DEFAULT OFF)
  22. endif()
  23. # parallel backends configuration
  24. set(PARALLEL_ENABLE_PLUGINS "${PARALLEL_ENABLE_PLUGINS_DEFAULT}" CACHE BOOL "Allow building parallel plugin support")
  25. # TODO building plugins with OpenCV is not supported yet
  26. #set(PARALLEL_PLUGIN_LIST "" CACHE STRING "List of parallel backends to be compiled as plugins (tbb, openmp or special value 'all')")
  27. #string(REPLACE "," ";" PARALLEL_PLUGIN_LIST "${PARALLEL_PLUGIN_LIST}") # support comma-separated list (,) too
  28. #string(TOLOWER "${PARALLEL_PLUGIN_LIST}" PARALLEL_PLUGIN_LIST)
  29. ocv_add_module(core
  30. OPTIONAL opencv_cudev
  31. WRAP java objc python js)
  32. set(extra_libs "")
  33. if(WINRT AND WINDOWS_STORE AND CMAKE_SYSTEM_VERSION MATCHES "8.0")
  34. list(APPEND extra_libs ole32.lib)
  35. endif()
  36. if(HAVE_TBB)
  37. list(APPEND extra_libs tbb)
  38. endif()
  39. if(DEFINED WINRT AND NOT DEFINED ENABLE_WINRT_MODE_NATIVE)
  40. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /ZW")
  41. endif()
  42. if(CV_TRACE AND HAVE_ITT)
  43. add_definitions(-DOPENCV_WITH_ITT=1)
  44. endif()
  45. # https://github.com/opencv/opencv/issues/24145
  46. if(HAVE_IPP)
  47. OCV_OPTION(OPENCV_IPP_ENABLE_ALL "Enable all OPENCV_IPP_ options at once" OFF)
  48. OCV_OPTION(OPENCV_IPP_MEAN "Enable IPP optimizations for mean (+200Kb in binary size)" OPENCV_IPP_ENABLE_ALL)
  49. OCV_OPTION(OPENCV_IPP_MINMAX "Enable IPP optimizations for minMaxLoc/minMaxIdx (+200Kb in binary size)" OPENCV_IPP_ENABLE_ALL)
  50. OCV_OPTION(OPENCV_IPP_SUM "Enable IPP optimizations for sum (+100Kb in binary size)" OPENCV_IPP_ENABLE_ALL)
  51. if(OPENCV_IPP_MEAN)
  52. ocv_append_source_file_compile_definitions(${CMAKE_CURRENT_SOURCE_DIR}/src/mean.dispatch.cpp "OPENCV_IPP_MEAN=1")
  53. endif()
  54. if(OPENCV_IPP_MINMAX)
  55. ocv_append_source_file_compile_definitions(${CMAKE_CURRENT_SOURCE_DIR}/src/minmax.cpp "OPENCV_IPP_MINMAX=1")
  56. endif()
  57. if(OPENCV_IPP_SUM)
  58. ocv_append_source_file_compile_definitions(${CMAKE_CURRENT_SOURCE_DIR}/src/sum.dispatch.cpp "OPENCV_IPP_SUM=1")
  59. endif()
  60. endif()
  61. file(GLOB lib_cuda_hdrs
  62. "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/cuda/*.hpp"
  63. "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/cuda/*.h")
  64. file(GLOB lib_cuda_hdrs_detail
  65. "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/cuda/detail/*.hpp"
  66. "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/cuda/detail/*.h")
  67. file(GLOB_RECURSE module_opencl_hdrs
  68. "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/opencl/*")
  69. source_group("Include\\Cuda Headers" FILES ${lib_cuda_hdrs})
  70. source_group("Include\\Cuda Headers\\Detail" FILES ${lib_cuda_hdrs_detail})
  71. file(GLOB_RECURSE core_parallel_hdrs
  72. "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/parallel/*.hpp"
  73. "${CMAKE_CURRENT_LIST_DIR}/include/opencv2/${name}/parallel/*.h")
  74. ocv_source_group("Include" DIRBASE "${CMAKE_CURRENT_LIST_DIR}/include" FILES ${core_parallel_hdrs})
  75. source_group("Src" FILES "${OPENCV_MODULE_opencv_core_BINARY_DIR}/version_string.inc")
  76. ocv_glob_module_sources(SOURCES "${OPENCV_MODULE_opencv_core_BINARY_DIR}/version_string.inc"
  77. HEADERS ${core_parallel_hdrs} ${module_opencl_hdrs} ${lib_cuda_hdrs} ${lib_cuda_hdrs_detail})
  78. ocv_module_include_directories(${the_module} ${ZLIB_INCLUDE_DIRS} ${OPENCL_INCLUDE_DIRS})
  79. if(ANDROID AND HAVE_CPUFEATURES)
  80. ocv_append_source_file_compile_definitions(${CMAKE_CURRENT_SOURCE_DIR}/src/system.cpp "HAVE_CPUFEATURES=1")
  81. ocv_module_include_directories(${CPUFEATURES_INCLUDE_DIRS})
  82. endif()
  83. if(ITT_INCLUDE_DIRS)
  84. ocv_module_include_directories(${ITT_INCLUDE_DIRS})
  85. endif()
  86. if(HAVE_POSIX_MEMALIGN)
  87. ocv_append_source_file_compile_definitions(${CMAKE_CURRENT_SOURCE_DIR}/src/alloc.cpp "HAVE_POSIX_MEMALIGN=1")
  88. endif()
  89. if(HAVE_MALLOC_H)
  90. ocv_append_source_file_compile_definitions(${CMAKE_CURRENT_SOURCE_DIR}/src/alloc.cpp "HAVE_MALLOC_H=1")
  91. endif()
  92. if(HAVE_MEMALIGN)
  93. ocv_append_source_file_compile_definitions(${CMAKE_CURRENT_SOURCE_DIR}/src/alloc.cpp "HAVE_MEMALIGN=1")
  94. endif()
  95. if(HAVE_WIN32_ALIGNED_MALLOC)
  96. ocv_append_source_file_compile_definitions(${CMAKE_CURRENT_SOURCE_DIR}/src/alloc.cpp "HAVE_WIN32_ALIGNED_MALLOC=1")
  97. endif()
  98. if(HAVE_GETAUXVAL)
  99. ocv_append_source_file_compile_definitions(${CMAKE_CURRENT_SOURCE_DIR}/src/system.cpp "HAVE_GETAUXVAL=1")
  100. endif()
  101. if(HAVE_ELF_AUX_INFO)
  102. ocv_append_source_file_compile_definitions(${CMAKE_CURRENT_SOURCE_DIR}/src/system.cpp "HAVE_ELF_AUX_INFO=1")
  103. endif()
  104. if(HAVE_VA_INTEL_OLD_HEADER)
  105. ocv_append_source_file_compile_definitions("${CMAKE_CURRENT_LIST_DIR}/src/va_intel.cpp" "HAVE_VA_INTEL_OLD_HEADER")
  106. endif()
  107. if(OPENCV_LIBVA_LINK)
  108. ocv_append_source_file_compile_definitions("${CMAKE_CURRENT_LIST_DIR}/src/va_intel.cpp" "OPENCV_LIBVA_LINK=1")
  109. endif()
  110. option(OPENCV_ENABLE_ALLOCATOR_STATS "Enable Allocator metrics" ON)
  111. if(NOT OPENCV_ENABLE_ALLOCATOR_STATS)
  112. add_definitions(-DOPENCV_DISABLE_ALLOCATOR_STATS=1)
  113. elseif(HAVE_CXX11 OR DEFINED OPENCV_ALLOCATOR_STATS_COUNTER_TYPE)
  114. if(NOT DEFINED OPENCV_ALLOCATOR_STATS_COUNTER_TYPE)
  115. if(HAVE_ATOMIC_LONG_LONG AND OPENCV_ENABLE_ATOMIC_LONG_LONG)
  116. if(MINGW)
  117. # command-line generation issue due to space in value, int/int64_t should be used instead
  118. # https://github.com/opencv/opencv/issues/16990
  119. message(STATUS "Consider adding OPENCV_ALLOCATOR_STATS_COUNTER_TYPE=int/int64_t according to your build configuration")
  120. else()
  121. set(OPENCV_ALLOCATOR_STATS_COUNTER_TYPE "long long")
  122. endif()
  123. else()
  124. set(OPENCV_ALLOCATOR_STATS_COUNTER_TYPE "int")
  125. endif()
  126. endif()
  127. if(DEFINED OPENCV_ALLOCATOR_STATS_COUNTER_TYPE)
  128. message(STATUS "Allocator metrics storage type: '${OPENCV_ALLOCATOR_STATS_COUNTER_TYPE}'")
  129. add_definitions("-DOPENCV_ALLOCATOR_STATS_COUNTER_TYPE=${OPENCV_ALLOCATOR_STATS_COUNTER_TYPE}")
  130. endif()
  131. endif()
  132. if(PARALLEL_ENABLE_PLUGINS)
  133. ocv_append_source_file_compile_definitions(${CMAKE_CURRENT_SOURCE_DIR}/src/parallel/parallel.cpp "PARALLEL_ENABLE_PLUGINS=1")
  134. if(OPENCV_DEBUG_POSTFIX)
  135. ocv_append_source_file_compile_definitions("${CMAKE_CURRENT_LIST_DIR}/src/parallel/parallel.cpp" "DEBUG_POSTFIX=${OPENCV_DEBUG_POSTFIX}")
  136. endif()
  137. endif()
  138. if(HAVE_CUDA)
  139. if(NOT HAVE_opencv_cudev)
  140. message(FATAL_ERROR "CUDA: OpenCV requires enabled 'cudev' module from 'opencv_contrib' repository: https://github.com/opencv/opencv_contrib")
  141. endif()
  142. if(ENABLE_CUDA_FIRST_CLASS_LANGUAGE)
  143. list(APPEND extra_libs CUDA::cudart${CUDA_LIB_EXT})
  144. endif()
  145. ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef -Wenum-compare -Wunused-function -Wshadow)
  146. endif()
  147. ocv_create_module(${extra_libs})
  148. ocv_target_link_libraries(${the_module} PRIVATE
  149. "${ZLIB_LIBRARIES}" "${OPENCL_LIBRARIES}" "${VA_LIBRARIES}"
  150. "${OPENGL_LIBRARIES}"
  151. "${GLX_LIBRARIES}"
  152. "${LAPACK_LIBRARIES}" "${CPUFEATURES_LIBRARIES}" "${HALIDE_LIBRARIES}"
  153. "${ITT_LIBRARIES}"
  154. "${OPENCV_HAL_LINKER_LIBS}"
  155. )
  156. if(OPENCV_CORE_EXCLUDE_C_API)
  157. ocv_target_compile_definitions(${the_module} PRIVATE "OPENCV_EXCLUDE_C_API=1")
  158. endif()
  159. if(OPENCV_DISABLE_THREAD_SUPPORT)
  160. ocv_target_compile_definitions(${the_module} PUBLIC "OPENCV_DISABLE_THREAD_SUPPORT=1")
  161. endif()
  162. if(OPENCV_DISABLE_ENV_SUPPORT)
  163. ocv_append_source_file_compile_definitions(${CMAKE_CURRENT_SOURCE_DIR}/src/system.cpp "NO_GETENV")
  164. endif()
  165. if(OPENCV_SEMIHOSTING)
  166. ocv_target_compile_definitions(${the_module} PRIVATE "-DOPENCV_SEMIHOSTING")
  167. endif(OPENCV_SEMIHOSTING)
  168. if(DEFINED OPENCV_ALGO_HINT_DEFAULT)
  169. ocv_target_compile_definitions(${the_module} PRIVATE "-DOPENCV_ALGO_HINT_DEFAULT=${OPENCV_ALGO_HINT_DEFAULT}")
  170. endif(DEFINED OPENCV_ALGO_HINT_DEFAULT)
  171. if(HAVE_HPX)
  172. ocv_target_link_libraries(${the_module} LINK_PRIVATE "${HPX_LIBRARIES}")
  173. endif()
  174. if(HAVE_OPENMP AND DEFINED OpenMP_CXX_LIBRARIES AND OpenMP_CXX_LIBRARIES)
  175. ocv_target_link_libraries(${the_module} LINK_PRIVATE "${OpenMP_CXX_LIBRARIES}")
  176. endif()
  177. set(test_libs "")
  178. if(HAVE_CUDA AND ENABLE_CUDA_FIRST_CLASS_LANGUAGE)
  179. list(APPEND test_libs CUDA::cudart${CUDA_LIB_EXT})
  180. endif()
  181. ocv_add_accuracy_tests(${test_libs})
  182. ocv_add_perf_tests()
  183. ocv_install_3rdparty_licenses(SoftFloat "${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/SoftFloat/COPYING.txt")
  184. # generate data (samples data) config file
  185. set(OPENCV_DATA_CONFIG_FILE "${OPENCV_CONFIG_FILE_INCLUDE_DIR}/opencv_data_config.hpp")
  186. set(OPENCV_DATA_CONFIG_STR "")
  187. if(CMAKE_INSTALL_PREFIX)
  188. set(OPENCV_DATA_CONFIG_STR "${OPENCV_DATA_CONFIG_STR}
  189. #define OPENCV_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\"
  190. ")
  191. endif()
  192. if(OPENCV_OTHER_INSTALL_PATH)
  193. set(OPENCV_DATA_CONFIG_STR "${OPENCV_DATA_CONFIG_STR}
  194. #define OPENCV_DATA_INSTALL_PATH \"${OPENCV_OTHER_INSTALL_PATH}\"
  195. ")
  196. endif()
  197. set(OPENCV_DATA_CONFIG_STR "${OPENCV_DATA_CONFIG_STR}
  198. #define OPENCV_BUILD_DIR \"${CMAKE_BINARY_DIR}\"
  199. ")
  200. file(RELATIVE_PATH SOURCE_DIR_RELATIVE ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR})
  201. set(OPENCV_DATA_CONFIG_STR "${OPENCV_DATA_CONFIG_STR}
  202. #define OPENCV_DATA_BUILD_DIR_SEARCH_PATHS \\
  203. \"${SOURCE_DIR_RELATIVE}/\"
  204. ")
  205. if(WIN32)
  206. file(RELATIVE_PATH INSTALL_DATA_DIR_RELATIVE "${CMAKE_INSTALL_PREFIX}/${OPENCV_BIN_INSTALL_PATH}" "${CMAKE_INSTALL_PREFIX}/${OPENCV_OTHER_INSTALL_PATH}")
  207. else()
  208. file(RELATIVE_PATH INSTALL_DATA_DIR_RELATIVE "${CMAKE_INSTALL_PREFIX}/${OPENCV_LIB_INSTALL_PATH}" "${CMAKE_INSTALL_PREFIX}/${OPENCV_OTHER_INSTALL_PATH}")
  209. endif()
  210. list(APPEND OPENCV_INSTALL_DATA_DIR_RELATIVE "${INSTALL_DATA_DIR_RELATIVE}")
  211. string(REPLACE ";" "\",\\\n \"" OPENCV_INSTALL_DATA_DIR_RELATIVE_STR "\"${OPENCV_INSTALL_DATA_DIR_RELATIVE}\"")
  212. set(OPENCV_DATA_CONFIG_STR "${OPENCV_DATA_CONFIG_STR}
  213. #define OPENCV_INSTALL_DATA_DIR_RELATIVE ${OPENCV_INSTALL_DATA_DIR_RELATIVE_STR}
  214. ")
  215. if(EXISTS "${OPENCV_DATA_CONFIG_FILE}")
  216. file(READ "${OPENCV_DATA_CONFIG_FILE}" __content)
  217. endif()
  218. if(NOT OPENCV_DATA_CONFIG_STR STREQUAL "${__content}")
  219. file(WRITE "${OPENCV_DATA_CONFIG_FILE}" "${OPENCV_DATA_CONFIG_STR}")
  220. endif()