Merge pull request #19390 from tomoaki0705:fixCudaLegacyCalib3d
[platform/upstream/opencv.git] / cmake / OpenCVFindMKL.cmake
1 #
2 # The script to detect Intel(R) Math Kernel Library (MKL)
3 # installation/package
4 #
5 # Parameters:
6 # MKL_ROOT_DIR / ENV{MKLROOT}
7 # MKL_INCLUDE_DIR
8 # MKL_LIBRARIES
9 # MKL_USE_SINGLE_DYNAMIC_LIBRARY - use single dynamic library mkl_rt.lib / libmkl_rt.so
10 # MKL_WITH_TBB / MKL_WITH_OPENMP
11 #
12 # Extra:
13 # MKL_LIB_FIND_PATHS
14 #
15 # On return this will define:
16 #
17 # HAVE_MKL          - True if Intel MKL found
18 # MKL_ROOT_DIR      - root of MKL installation
19 # MKL_INCLUDE_DIRS  - MKL include folder
20 # MKL_LIBRARIES     - MKL libraries that are used by OpenCV
21 #
22
23 macro(mkl_fail)
24     set(HAVE_MKL OFF)
25     set(MKL_ROOT_DIR "${MKL_ROOT_DIR}" CACHE PATH "Path to MKL directory")
26     return()
27 endmacro()
28
29 macro(get_mkl_version VERSION_FILE)
30     # read MKL version info from file
31     file(STRINGS ${VERSION_FILE} STR1 REGEX "__INTEL_MKL__")
32     file(STRINGS ${VERSION_FILE} STR2 REGEX "__INTEL_MKL_MINOR__")
33     file(STRINGS ${VERSION_FILE} STR3 REGEX "__INTEL_MKL_UPDATE__")
34     #file(STRINGS ${VERSION_FILE} STR4 REGEX "INTEL_MKL_VERSION")
35
36     # extract info and assign to variables
37     string(REGEX MATCHALL "[0-9]+" MKL_VERSION_MAJOR ${STR1})
38     string(REGEX MATCHALL "[0-9]+" MKL_VERSION_MINOR ${STR2})
39     string(REGEX MATCHALL "[0-9]+" MKL_VERSION_UPDATE ${STR3})
40     set(MKL_VERSION_STR "${MKL_VERSION_MAJOR}.${MKL_VERSION_MINOR}.${MKL_VERSION_UPDATE}" CACHE STRING "MKL version" FORCE)
41 endmacro()
42
43 OCV_OPTION(MKL_USE_SINGLE_DYNAMIC_LIBRARY "Use MKL Single Dynamic Library thorugh mkl_rt.lib / libmkl_rt.so" OFF)
44 OCV_OPTION(MKL_WITH_TBB "Use MKL with TBB multithreading" OFF)#ON IF WITH_TBB)
45 OCV_OPTION(MKL_WITH_OPENMP "Use MKL with OpenMP multithreading" OFF)#ON IF WITH_OPENMP)
46
47 if(NOT MKL_ROOT_DIR AND DEFINED MKL_INCLUDE_DIR AND EXISTS "${MKL_INCLUDE_DIR}/mkl.h")
48   file(TO_CMAKE_PATH "${MKL_INCLUDE_DIR}" MKL_INCLUDE_DIR)
49   get_filename_component(MKL_ROOT_DIR "${MKL_INCLUDE_DIR}/.." ABSOLUTE)
50 endif()
51 if(NOT MKL_ROOT_DIR)
52   file(TO_CMAKE_PATH "${MKL_ROOT_DIR}" mkl_root_paths)
53   if(DEFINED ENV{MKLROOT})
54       file(TO_CMAKE_PATH "$ENV{MKLROOT}" path)
55       list(APPEND mkl_root_paths "${path}")
56   endif()
57
58   if(WITH_MKL AND NOT mkl_root_paths)
59     if(WIN32)
60       set(ProgramFilesx86 "ProgramFiles(x86)")
61       file(TO_CMAKE_PATH "$ENV{${ProgramFilesx86}}" path)
62       list(APPEND mkl_root_paths ${path}/IntelSWTools/compilers_and_libraries/windows/mkl)
63     endif()
64     if(UNIX)
65       list(APPEND mkl_root_paths "/opt/intel/mkl")
66     endif()
67   endif()
68
69   find_path(MKL_ROOT_DIR include/mkl.h PATHS ${mkl_root_paths})
70 endif()
71
72 if(NOT MKL_ROOT_DIR OR NOT EXISTS "${MKL_ROOT_DIR}/include/mkl.h")
73   mkl_fail()
74 endif()
75
76 set(MKL_INCLUDE_DIR "${MKL_ROOT_DIR}/include" CACHE PATH "Path to MKL include directory")
77
78 if(NOT MKL_ROOT_DIR
79     OR NOT EXISTS "${MKL_ROOT_DIR}"
80     OR NOT EXISTS "${MKL_INCLUDE_DIR}"
81     OR NOT EXISTS "${MKL_INCLUDE_DIR}/mkl_version.h"
82 )
83   mkl_fail()
84 endif()
85
86 get_mkl_version(${MKL_INCLUDE_DIR}/mkl_version.h)
87
88 #determine arch
89 if(CMAKE_CXX_SIZEOF_DATA_PTR EQUAL 8)
90     set(MKL_ARCH_LIST "intel64")
91     if(MSVC)
92         list(APPEND MKL_ARCH_LIST "win-x64")
93     endif()
94     include(CheckTypeSize)
95     CHECK_TYPE_SIZE(int _sizeof_int)
96     if (_sizeof_int EQUAL 4)
97         set(MKL_ARCH_SUFFIX "lp64")
98     else()
99         set(MKL_ARCH_SUFFIX "ilp64")
100     endif()
101 else()
102     set(MKL_ARCH_LIST "ia32")
103     set(MKL_ARCH_SUFFIX "c")
104 endif()
105
106 set(mkl_lib_find_paths ${MKL_LIB_FIND_PATHS} ${MKL_ROOT_DIR}/lib)
107 foreach(MKL_ARCH ${MKL_ARCH_LIST})
108   list(APPEND mkl_lib_find_paths
109     ${MKL_ROOT_DIR}/lib/${MKL_ARCH}
110     ${MKL_ROOT_DIR}/${MKL_ARCH}
111   )
112 endforeach()
113
114 if(MKL_USE_SINGLE_DYNAMIC_LIBRARY AND NOT (MKL_VERSION_STR VERSION_LESS "10.3.0"))
115
116   # https://software.intel.com/content/www/us/en/develop/articles/a-new-linking-model-single-dynamic-library-mkl_rt-since-intel-mkl-103.html
117   set(mkl_lib_list "mkl_rt")
118
119 elseif(NOT (MKL_VERSION_STR VERSION_LESS "11.3.0"))
120
121   foreach(MKL_ARCH ${MKL_ARCH_LIST})
122     list(APPEND mkl_lib_find_paths
123       ${MKL_ROOT_DIR}/../tbb/lib/${MKL_ARCH}
124     )
125   endforeach()
126
127   set(mkl_lib_list "mkl_intel_${MKL_ARCH_SUFFIX}")
128
129   if(MKL_WITH_TBB)
130     list(APPEND mkl_lib_list mkl_tbb_thread tbb)
131   elseif(MKL_WITH_OPENMP)
132     if(MSVC)
133       list(APPEND mkl_lib_list mkl_intel_thread libiomp5md)
134     else()
135       list(APPEND mkl_lib_list mkl_gnu_thread)
136     endif()
137   else()
138     list(APPEND mkl_lib_list mkl_sequential)
139   endif()
140
141   list(APPEND mkl_lib_list mkl_core)
142 else()
143   message(STATUS "MKL version ${MKL_VERSION_STR} is not supported")
144   mkl_fail()
145 endif()
146
147 if(NOT MKL_LIBRARIES)
148   set(MKL_LIBRARIES "")
149   foreach(lib ${mkl_lib_list})
150     set(lib_var_name MKL_LIBRARY_${lib})
151     find_library(${lib_var_name} NAMES ${lib} ${lib}_dll HINTS ${mkl_lib_find_paths})
152     mark_as_advanced(${lib_var_name})
153     if(NOT ${lib_var_name})
154       mkl_fail()
155     endif()
156     list(APPEND MKL_LIBRARIES ${${lib_var_name}})
157   endforeach()
158 endif()
159
160 message(STATUS "Found MKL ${MKL_VERSION_STR} at: ${MKL_ROOT_DIR}")
161 set(HAVE_MKL ON)
162 set(MKL_ROOT_DIR "${MKL_ROOT_DIR}" CACHE PATH "Path to MKL directory")
163 set(MKL_INCLUDE_DIRS "${MKL_INCLUDE_DIR}")
164 set(MKL_LIBRARIES "${MKL_LIBRARIES}")
165 if(UNIX AND NOT MKL_USE_SINGLE_DYNAMIC_LIBRARY AND NOT MKL_LIBRARIES_DONT_HACK)
166     #it's ugly but helps to avoid cyclic lib problem
167     set(MKL_LIBRARIES ${MKL_LIBRARIES} ${MKL_LIBRARIES} ${MKL_LIBRARIES} "-lpthread" "-lm" "-ldl")
168 endif()