From 34a9ce6eb3255d174c95f14bc957127e50f3d69e Mon Sep 17 00:00:00 2001 From: Maksim Shabunin Date: Sat, 3 Feb 2018 13:51:54 +0300 Subject: [PATCH 1/2] cmake: support searching for TBB via cmake package mechanism --- cmake/OpenCVDetectTBB.cmake | 27 ++++++++++++++++++++++++--- cmake/OpenCVUtils.cmake | 2 +- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/cmake/OpenCVDetectTBB.cmake b/cmake/OpenCVDetectTBB.cmake index b1d55e9348..c5b4bfdb16 100644 --- a/cmake/OpenCVDetectTBB.cmake +++ b/cmake/OpenCVDetectTBB.cmake @@ -18,7 +18,24 @@ # - HAVE_TBB set to TRUE # - "tbb" target exists and added to OPENCV_LINKER_LIBS -function(ocv_tbb_verify) +function(ocv_tbb_cmake_guess _found) + find_package(TBB QUIET COMPONENTS tbb PATHS "$ENV{TBBROOT}/cmake") + if(TBB_FOUND) + if(NOT TARGET TBB::tbb) + message(WARNING "No TBB::tbb target found!") + return() + endif() + get_target_property(_lib TBB::tbb IMPORTED_LOCATION_RELEASE) + message(STATUS "Found TBB (cmake): ${_lib}") + get_target_property(_inc TBB::tbb INTERFACE_INCLUDE_DIRECTORIES) + ocv_tbb_read_version("${_inc}") + add_library(tbb INTERFACE) + target_link_libraries(tbb INTERFACE TBB::tbb) + set(${_found} TRUE PARENT_SCOPE) + endif() +endfunction() + +function(ocv_tbb_env_verify) if (NOT "$ENV{TBBROOT}" STREQUAL "") # check that library and include dir are inside TBBROOT location get_filename_component(_root "$ENV{TBBROOT}" ABSOLUTE) @@ -46,7 +63,7 @@ function(ocv_tbb_env_guess _found) find_library(TBB_ENV_LIB_DEBUG NAMES "tbb_debug" PATHS ENV LIBRARY_PATH NO_DEFAULT_PATH) find_library(TBB_ENV_LIB_DEBUG NAMES "tbb_debug") if (TBB_ENV_INCLUDE AND (TBB_ENV_LIB OR TBB_ENV_LIB_DEBUG)) - ocv_tbb_verify() + ocv_tbb_env_verify() ocv_tbb_read_version("${TBB_ENV_INCLUDE}") add_library(tbb UNKNOWN IMPORTED) set_target_properties(tbb PROPERTIES @@ -54,7 +71,7 @@ function(ocv_tbb_env_guess _found) IMPORTED_LOCATION_DEBUG "${TBB_ENV_LIB_DEBUG}" INTERFACE_INCLUDE_DIRECTORIES "${TBB_ENV_INCLUDE}" ) - message(STATUS "Found TBB: ${TBB_ENV_LIB}") + message(STATUS "Found TBB (env): ${TBB_ENV_LIB}") set(${_found} TRUE PARENT_SCOPE) endif() endfunction() @@ -74,6 +91,10 @@ if(BUILD_TBB) set(HAVE_TBB TRUE) endif() +if(NOT HAVE_TBB) + ocv_tbb_cmake_guess(HAVE_TBB) +endif() + if(NOT HAVE_TBB) ocv_tbb_env_guess(HAVE_TBB) endif() diff --git a/cmake/OpenCVUtils.cmake b/cmake/OpenCVUtils.cmake index c0bbac78a1..197d326066 100644 --- a/cmake/OpenCVUtils.cmake +++ b/cmake/OpenCVUtils.cmake @@ -1238,7 +1238,7 @@ macro(ocv_get_all_libs _modules _extra _3rdparty) endif() if (TARGET ${dep}) get_target_property(_type ${dep} TYPE) - if(_type STREQUAL "STATIC_LIBRARY" AND BUILD_SHARED_LIBS) + if(_type STREQUAL "STATIC_LIBRARY" AND BUILD_SHARED_LIBS OR _type STREQUAL "INTERFACE_LIBRARY") # nothing else() get_target_property(_output ${dep} IMPORTED_LOCATION) From 108d07c655585a51d5c2ba10b769374a2b25a756 Mon Sep 17 00:00:00 2001 From: Maksim Shabunin Date: Sat, 3 Feb 2018 14:27:46 +0300 Subject: [PATCH 2/2] TBB: added workaround for linking issue with conflicting system and custom libraries --- cmake/OpenCVDetectTBB.cmake | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmake/OpenCVDetectTBB.cmake b/cmake/OpenCVDetectTBB.cmake index c5b4bfdb16..315b4aded6 100644 --- a/cmake/OpenCVDetectTBB.cmake +++ b/cmake/OpenCVDetectTBB.cmake @@ -71,6 +71,11 @@ function(ocv_tbb_env_guess _found) IMPORTED_LOCATION_DEBUG "${TBB_ENV_LIB_DEBUG}" INTERFACE_INCLUDE_DIRECTORIES "${TBB_ENV_INCLUDE}" ) + # workaround: system TBB library is used for linking instead of provided + if(CMAKE_COMPILER_IS_GNUCXX) + get_filename_component(_dir "${TBB_ENV_LIB}" DIRECTORY) + set_target_properties(tbb PROPERTIES INTERFACE_LINK_LIBRARIES "-L${_dir}") + endif() message(STATUS "Found TBB (env): ${TBB_ENV_LIB}") set(${_found} TRUE PARENT_SCOPE) endif()