CMakeLists.txt 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #Cross compile TBB from source
  2. project(tbb CXX)
  3. if (WIN32 AND NOT ARM)
  4. message(FATAL_ERROR "BUILD_TBB option supports Windows on ARM only!\nUse regular official TBB build instead of the BUILD_TBB option!")
  5. endif()
  6. ocv_update(OPENCV_TBB_RELEASE "v2022.1.0")
  7. ocv_update(OPENCV_TBB_RELEASE_MD5 "cce28e6cb1ceae14a93848990c98cb6b")
  8. ocv_update(OPENCV_TBB_FILENAME "${OPENCV_TBB_RELEASE}.tar.gz")
  9. string(REGEX REPLACE "^v" "" OPENCV_TBB_RELEASE_ "${OPENCV_TBB_RELEASE}")
  10. #ocv_update(OPENCV_TBB_SUBDIR ...)
  11. set(tbb_src_dir "${OpenCV_BINARY_DIR}/3rdparty/tbb")
  12. ocv_download(FILENAME ${OPENCV_TBB_FILENAME}
  13. HASH ${OPENCV_TBB_RELEASE_MD5}
  14. URL
  15. "${OPENCV_TBB_URL}"
  16. "$ENV{OPENCV_TBB_URL}"
  17. "https://github.com/oneapi-src/oneTBB/archive/refs/tags/"
  18. DESTINATION_DIR ${tbb_src_dir}
  19. ID TBB
  20. STATUS res
  21. UNPACK RELATIVE_URL)
  22. if(NOT res)
  23. return()
  24. endif()
  25. if(OPENCV_TBB_SUBDIR)
  26. # use current value
  27. ocv_assert(EXISTS "${tbb_src_dir}/${OPENCV_TBB_SUBDIR}")
  28. elseif(EXISTS "${tbb_src_dir}/oneTBB-${OPENCV_TBB_RELEASE_}")
  29. set(OPENCV_TBB_SUBDIR "oneTBB-${OPENCV_TBB_RELEASE_}")
  30. elseif(EXISTS "${tbb_src_dir}/tbb-${OPENCV_TBB_RELEASE_}")
  31. set(OPENCV_TBB_SUBDIR "oneTBB-${OPENCV_TBB_RELEASE_}")
  32. else()
  33. message(FATAL_ERROR "TBB: Can't configure TBB. Specify OPENCV_TBB_SUBDIR through command-line.")
  34. endif()
  35. set(tbb_src_dir "${tbb_src_dir}/${OPENCV_TBB_SUBDIR}")
  36. ocv_include_directories("${tbb_src_dir}/include"
  37. "${tbb_src_dir}/src/"
  38. "${tbb_src_dir}/src/rml/include"
  39. "${CMAKE_CURRENT_SOURCE_DIR}")
  40. file(GLOB lib_srcs "${tbb_src_dir}/src/tbb/*.cpp")
  41. file(GLOB lib_hdrs "${tbb_src_dir}/src/tbb/*.h")
  42. ocv_list_filterout(lib_srcs "${tbb_src_dir}/src/tbb/tbbbind.cpp") # hwloc.h requirement
  43. ocv_list_filterout(lib_srcs "${tbb_src_dir}/src/tbb/tbb_bind.cpp") # hwloc.h requirement 2020.1+
  44. if (WIN32)
  45. add_definitions(/D__TBB_DYNAMIC_LOAD_ENABLED=0
  46. /D__TBB_BUILD=1
  47. /DTBB_NO_LEGACY=1
  48. /D_UNICODE
  49. /DUNICODE
  50. /DWINAPI_FAMILY=WINAPI_FAMILY_APP
  51. /DDO_ITT_NOTIFY=0
  52. /DUSE_WINTHREAD
  53. ) # defines were copied from windows.cl.inc
  54. if (ARM)
  55. add_definitions(/D_WIN32_WINNT=0x0602
  56. /D__TBB_WIN32_USE_CL_BUILTINS
  57. )
  58. endif()
  59. set(CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} /APPCONTAINER")
  60. else()
  61. add_definitions(-D__TBB_DYNAMIC_LOAD_ENABLED=0 #required
  62. -D__TBB_WEAK_SYMBOLS_PRESENT=0 #required for 4.3
  63. -D__TBB_BUILD=1 #required
  64. -D__TBB_SURVIVE_THREAD_SWITCH=0 #no cilk support
  65. -DTBB_USE_DEBUG=0 #just to be sure
  66. -DTBB_NO_LEGACY=1 #don't need backward compatibility
  67. -DDO_ITT_NOTIFY=0 #it seems that we don't need these notifications
  68. )
  69. endif()
  70. if(HAVE_PTHREAD)
  71. add_definitions(-DUSE_PTHREAD) #required for Unix
  72. endif()
  73. if(CV_GCC)
  74. add_definitions(-DTBB_USE_GCC_BUILTINS=1) #required for ARM GCC
  75. if(NOT CMAKE_CXX_COMPILER_VERSION LESS 6.0)
  76. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flifetime-dse=1") # workaround for GCC 6.x
  77. endif()
  78. endif()
  79. if(ANDROID_COMPILER_IS_CLANG)
  80. add_definitions(-D__TBB_GCC_BUILTIN_ATOMICS_PRESENT=1)
  81. endif()
  82. ocv_warnings_disable(CMAKE_CXX_FLAGS
  83. /wd4702
  84. -Wshadow
  85. -Wunused-parameter
  86. -Wclass-memaccess # TBB 2018 under GCC 8+
  87. -Wimplicit-fallthrough # TBB 2018 under GCC 7+
  88. -Wmissing-prototypes # MacOSX, Android/Clang
  89. -Wundef -Wmissing-declarations # TBB 2019
  90. -Wnon-virtual-dtor # oneTBB-2020.2 Android
  91. -Wunused-but-set-variable # oneTBB-2020.2 Android
  92. )
  93. set(TBB_SOURCE_FILES ${lib_srcs} ${lib_hdrs})
  94. set(tbb_version_file "version_string.ver")
  95. if(NOT BUILD_INFO_SKIP_SYSTEM_VERSION)
  96. set(TBB_HOST_VERSION " ${CMAKE_HOST_SYSTEM_VERSION}")
  97. else()
  98. set(TBB_HOST_VERSION "")
  99. endif()
  100. configure_file("${CMAKE_CURRENT_SOURCE_DIR}/${tbb_version_file}.cmakein" "${CMAKE_CURRENT_BINARY_DIR}/${tbb_version_file}" @ONLY)
  101. list(APPEND TBB_SOURCE_FILES "${CMAKE_CURRENT_BINARY_DIR}/${tbb_version_file}")
  102. add_library(tbb ${OPENCV_3RDPARTY_EXCLUDE_FROM_ALL} ${TBB_SOURCE_FILES})
  103. target_compile_definitions(tbb PUBLIC
  104. TBB_USE_GCC_BUILTINS=1
  105. __TBB_GCC_BUILTIN_ATOMICS_PRESENT=1
  106. TBB_SUPPRESS_DEPRECATED_MESSAGES=1
  107. )
  108. target_include_directories(tbb SYSTEM PUBLIC $<BUILD_INTERFACE:${tbb_src_dir}/include>
  109. PRIVATE "${CMAKE_CURRENT_BINARY_DIR}"
  110. )
  111. if (WIN32)
  112. if (ARM)
  113. set(platform_macro /D_M_ARM=1)
  114. endif()
  115. add_custom_command(TARGET tbb
  116. PRE_BUILD
  117. COMMAND ${CMAKE_C_COMPILER} /nologo /TC /EP ${tbb_src_dir}\\src\\tbb\\win32-tbb-export.def /DTBB_NO_LEGACY=1 /D_CRT_SECURE_NO_DEPRECATE /D__TBB_BUILD=1 ${platform_macro} /I${tbb_src_dir}\\src /I${tbb_src_dir}\\include > "${tbb_src_dir}\\src\\tbb\\tbb.def"
  118. WORKING_DIRECTORY ${tbb_src_dir}\\src\\tbb
  119. COMMENT "Generating tbb.def file" VERBATIM
  120. )
  121. set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /DEF:${tbb_src_dir}/src/tbb/tbb.def /DLL /MAP /fixed:no /INCREMENTAL:NO")
  122. else()
  123. target_link_libraries(tbb c m dl)
  124. endif()
  125. # filter out flags that are not handled well by the TBB code
  126. foreach(var CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_DEBUG)
  127. string(REPLACE "-Werror=non-virtual-dtor" "" ${var} "${${var}}")
  128. string(REPLACE "-fvisibility=hidden" "" ${var} "${${var}}")
  129. string(REPLACE "-fvisibility-inlines-hidden" "" ${var} "${${var}}")
  130. endforeach()
  131. if (WIN32)
  132. set(tbb_debug_postfix "_debug") # to fit pragmas in _windef.h inside TBB
  133. else()
  134. set(tbb_debug_postfix ${OPENCV_DEBUG_POSTFIX})
  135. endif()
  136. set_target_properties(tbb
  137. PROPERTIES OUTPUT_NAME tbb
  138. DEBUG_POSTFIX "${tbb_debug_postfix}"
  139. COMPILE_PDB_NAME tbb
  140. COMPILE_PDB_NAME_DEBUG "tbb${OPENCV_DEBUG_POSTFIX}"
  141. ARCHIVE_OUTPUT_DIRECTORY ${3P_LIBRARY_OUTPUT_PATH}
  142. RUNTIME_OUTPUT_DIRECTORY ${EXECUTABLE_OUTPUT_PATH}
  143. )
  144. if(ENABLE_SOLUTION_FOLDERS)
  145. set_target_properties(tbb PROPERTIES FOLDER "3rdparty")
  146. endif()
  147. ocv_install_target(tbb EXPORT OpenCVModules
  148. RUNTIME DESTINATION ${OPENCV_BIN_INSTALL_PATH} COMPONENT libs
  149. LIBRARY DESTINATION ${OPENCV_LIB_INSTALL_PATH} COMPONENT libs
  150. ARCHIVE DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} COMPONENT dev
  151. OPTIONAL
  152. )
  153. ocv_install_3rdparty_licenses(tbb "${tbb_src_dir}/LICENSE.txt" "${tbb_src_dir}/README.md")
  154. ocv_tbb_read_version("${tbb_src_dir}/include" tbb)