Merge pull request #16122 from alalek:cmake_update_cpu_compiler_detection
[platform/upstream/opencv.git] / cmake / OpenCVDetectTBB.cmake
1 # Search TBB library (4.1 - 4.4, 2017)
2 #
3 # Own TBB (3rdparty/tbb):
4 # - set cmake option BUILD_TBB to ON
5 #
6 # External TBB (from system):
7 # - Fedora: install 'tbb-devel' package
8 # - Ubuntu: install 'libtbb-dev' package
9 #
10 # External TBB (from official site):
11 # - Linux/OSX:
12 #   - in tbbvars.sh replace 'SUBSTITUTE_INSTALL_DIR_HERE' with absolute path to TBB dir
13 #   - in terminal run 'source tbbvars.sh intel64 linux' ('source tbbvars.sh' in OSX)
14 # - Windows:
15 #   - in terminal run 'tbbvars.bat intel64 vs2015'
16 #
17 # Return:
18 #   - HAVE_TBB set to TRUE
19 #   - "tbb" target exists and added to OPENCV_LINKER_LIBS
20
21 function(ocv_tbb_cmake_guess _found)
22     find_package(TBB QUIET COMPONENTS tbb PATHS "$ENV{TBBROOT}/cmake")
23     if(TBB_FOUND)
24       if(NOT TARGET TBB::tbb)
25         message(WARNING "No TBB::tbb target found!")
26         return()
27       endif()
28       get_target_property(_lib TBB::tbb IMPORTED_LOCATION_RELEASE)
29       message(STATUS "Found TBB (cmake): ${_lib}")
30       get_target_property(_inc TBB::tbb INTERFACE_INCLUDE_DIRECTORIES)
31       ocv_tbb_read_version("${_inc}")
32       add_library(tbb INTERFACE IMPORTED)
33       set_target_properties(tbb PROPERTIES
34         INTERFACE_LINK_LIBRARIES TBB::tbb
35       )
36       set(${_found} TRUE PARENT_SCOPE)
37     endif()
38 endfunction()
39
40 function(ocv_tbb_env_verify)
41   if (NOT "$ENV{TBBROOT}" STREQUAL "")
42     # check that library and include dir are inside TBBROOT location
43     get_filename_component(_root "$ENV{TBBROOT}" ABSOLUTE)
44     get_filename_component(_lib "${TBB_ENV_LIB}" ABSOLUTE)
45     get_filename_component(_inc "${TBB_ENV_INCLUDE}" ABSOLUTE)
46     string(FIND "${_lib}" "${_root}" _lib_pos)
47     string(FIND "${_inc}" "${_root}" _inc_pos)
48     if (NOT (_lib_pos EQUAL 0 AND _inc_pos EQUAL 0))
49       message(SEND_ERROR
50         "Possible issue with TBB detection - TBBROOT is set, "
51         "but library/include path is not inside it:\n "
52         "TBBROOT: $ENV{TBBROOT}\n "
53         "(absolute): ${_root}\n "
54         "INCLUDE: ${_inc}\n "
55         "LIBRARY: ${_lib}\n")
56     endif()
57   endif()
58 endfunction()
59
60 function(ocv_tbb_env_guess _found)
61   find_path(TBB_ENV_INCLUDE NAMES "tbb/tbb.h" PATHS ENV CPATH NO_DEFAULT_PATH)
62   find_path(TBB_ENV_INCLUDE NAMES "tbb/tbb.h")
63   find_library(TBB_ENV_LIB NAMES "tbb" PATHS ENV LIBRARY_PATH NO_DEFAULT_PATH)
64   find_library(TBB_ENV_LIB NAMES "tbb")
65   find_library(TBB_ENV_LIB_DEBUG NAMES "tbb_debug" PATHS ENV LIBRARY_PATH NO_DEFAULT_PATH)
66   find_library(TBB_ENV_LIB_DEBUG NAMES "tbb_debug")
67   if (TBB_ENV_INCLUDE AND (TBB_ENV_LIB OR TBB_ENV_LIB_DEBUG))
68     ocv_tbb_env_verify()
69     ocv_tbb_read_version("${TBB_ENV_INCLUDE}")
70     add_library(tbb UNKNOWN IMPORTED)
71     set_target_properties(tbb PROPERTIES
72       IMPORTED_LOCATION "${TBB_ENV_LIB}"
73       INTERFACE_INCLUDE_DIRECTORIES "${TBB_ENV_INCLUDE}"
74     )
75     if (TBB_ENV_LIB_DEBUG)
76       set_target_properties(tbb PROPERTIES
77         IMPORTED_LOCATION_DEBUG "${TBB_ENV_LIB_DEBUG}"
78       )
79     endif()
80     # workaround: system TBB library is used for linking instead of provided
81     if(CV_GCC)
82       get_filename_component(_dir "${TBB_ENV_LIB}" DIRECTORY)
83       set_target_properties(tbb PROPERTIES INTERFACE_LINK_LIBRARIES "-L${_dir}")
84     endif()
85     message(STATUS "Found TBB (env): ${TBB_ENV_LIB}")
86     set(${_found} TRUE PARENT_SCOPE)
87   endif()
88 endfunction()
89
90 function(ocv_tbb_read_version _path)
91   find_file(TBB_VER_FILE tbb/tbb_stddef.h "${_path}" NO_DEFAULT_PATH CMAKE_FIND_ROOT_PATH_BOTH)
92   ocv_parse_header("${TBB_VER_FILE}" TBB_VERSION_LINES TBB_VERSION_MAJOR TBB_VERSION_MINOR TBB_INTERFACE_VERSION CACHE)
93 endfunction()
94
95 #=====================================================================
96
97 if(BUILD_TBB)
98   add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/tbb")
99   if(NOT TARGET tbb)
100     return()
101   endif()
102   set(HAVE_TBB TRUE)
103 endif()
104
105 if(NOT HAVE_TBB)
106   ocv_tbb_cmake_guess(HAVE_TBB)
107 endif()
108
109 if(NOT HAVE_TBB)
110   ocv_tbb_env_guess(HAVE_TBB)
111 endif()
112
113 if(TBB_INTERFACE_VERSION LESS 6000) # drop support of versions < 4.0
114   set(HAVE_TBB FALSE)
115 endif()