Merge remote-tracking branch 'upstream/3.4' into merge-3.4
[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(DEFINED OPENCV_MKL_LIBRARIES)
115   # custom list, user specified
116   set(mkl_lib_list ${OPENCV_MKL_LIBRARIES})
117
118 elseif(MKL_USE_SINGLE_DYNAMIC_LIBRARY AND NOT (MKL_VERSION_STR VERSION_LESS "10.3.0"))
119
120   # https://software.intel.com/content/www/us/en/develop/articles/a-new-linking-model-single-dynamic-library-mkl_rt-since-intel-mkl-103.html
121   set(mkl_lib_list "mkl_rt")
122
123 elseif(NOT (MKL_VERSION_STR VERSION_LESS "11.3.0"))
124
125   set(mkl_lib_list "mkl_intel_${MKL_ARCH_SUFFIX}")
126
127   if(MKL_WITH_TBB)
128     list(APPEND mkl_lib_list mkl_tbb_thread)
129   elseif(MKL_WITH_OPENMP)
130     if(MSVC)
131       list(APPEND mkl_lib_list mkl_intel_thread libiomp5md)
132     else()
133       list(APPEND mkl_lib_list mkl_gnu_thread)
134     endif()
135   else()
136     list(APPEND mkl_lib_list mkl_sequential)
137   endif()
138
139   list(APPEND mkl_lib_list mkl_core)
140 else()
141   message(STATUS "MKL version ${MKL_VERSION_STR} is not supported")
142   mkl_fail()
143 endif()
144
145 if(NOT MKL_LIBRARIES)
146   set(MKL_LIBRARIES "")
147   foreach(lib ${mkl_lib_list})
148     set(lib_var_name MKL_LIBRARY_${lib})
149     find_library(${lib_var_name} NAMES ${lib} ${lib}_dll HINTS ${mkl_lib_find_paths})
150     mark_as_advanced(${lib_var_name})
151     if(NOT ${lib_var_name})
152       mkl_fail()
153     endif()
154     list(APPEND MKL_LIBRARIES ${${lib_var_name}})
155   endforeach()
156   list(APPEND MKL_LIBRARIES ${OPENCV_EXTRA_MKL_LIBRARIES})
157 endif()
158
159 if(MKL_WITH_TBB)
160   if(BUILD_TBB)
161     message(STATUS "MKL: reusing builtin TBB binaries is not supported. Consider disabling MKL_WITH_TBB flag to prevent build/runtime errors")
162   else()
163     list(APPEND MKL_LIBRARIES tbb)  # tbb target is expected
164   endif()
165 endif()
166
167 message(STATUS "Found MKL ${MKL_VERSION_STR} at: ${MKL_ROOT_DIR}")
168 set(HAVE_MKL ON)
169 set(MKL_ROOT_DIR "${MKL_ROOT_DIR}" CACHE PATH "Path to MKL directory")
170 set(MKL_INCLUDE_DIRS "${MKL_INCLUDE_DIR}")
171 set(MKL_LIBRARIES "${MKL_LIBRARIES}")
172 if(UNIX AND NOT MKL_USE_SINGLE_DYNAMIC_LIBRARY AND NOT MKL_LIBRARIES_DONT_HACK)
173     #it's ugly but helps to avoid cyclic lib problem
174     set(MKL_LIBRARIES ${MKL_LIBRARIES} ${MKL_LIBRARIES} ${MKL_LIBRARIES} "-lpthread" "-lm" "-ldl")
175 endif()