3
3
# installation/package
4
4
#
5
5
# Parameters:
6
- # MKL_WITH_TBB
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
7
14
#
8
15
# On return this will define:
9
16
#
13
20
# MKL_LIBRARIES - MKL libraries that are used by OpenCV
14
21
#
15
22
16
- macro (mkl_find_lib VAR NAME DIRS )
17
- find_path (${VAR} ${NAME} ${DIRS} NO_DEFAULT_PATH )
18
- set (${VAR} ${${VAR}}/${NAME} )
19
- unset (${VAR} CACHE )
20
- endmacro ()
21
-
22
23
macro (mkl_fail )
23
24
set (HAVE_MKL OFF )
24
25
set (MKL_ROOT_DIR "${MKL_ROOT_DIR} " CACHE PATH "Path to MKL directory" )
@@ -39,43 +40,50 @@ macro(get_mkl_version VERSION_FILE)
39
40
set (MKL_VERSION_STR "${MKL_VERSION_MAJOR} .${MKL_VERSION_MINOR} .${MKL_VERSION_UPDATE} " CACHE STRING "MKL version" FORCE )
40
41
endmacro ()
41
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)
42
46
43
- if (NOT DEFINED MKL_USE_MULTITHREAD )
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 )
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 )
46
50
endif ()
47
-
48
- #check current MKL_ROOT_DIR
49
- if (NOT MKL_ROOT_DIR OR NOT EXISTS "${MKL_ROOT_DIR} /include/mkl.h" )
50
- set (mkl_root_paths "${MKL_ROOT_DIR} " )
51
- if (DEFINED ENV{MKLROOT} )
52
- list (APPEND mkl_root_paths "$ENV{MKLROOT} " )
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 )
53
63
endif ()
54
-
55
- if (WITH_MKL AND NOT mkl_root_paths )
56
- if (WIN32 )
57
- set (ProgramFilesx86 "ProgramFiles(x86)" )
58
- list (APPEND mkl_root_paths $ENV{${ProgramFilesx86}}/IntelSWTools/compilers_and_libraries/windows/mkl )
59
- endif ()
60
- if (UNIX )
61
- list (APPEND mkl_root_paths "/opt/intel/mkl" )
62
- endif ()
64
+ if (UNIX )
65
+ list (APPEND mkl_root_paths "/opt/intel/mkl" )
63
66
endif ()
67
+ endif ()
64
68
65
- find_path (MKL_ROOT_DIR include /mkl.h PATHS ${mkl_root_paths} )
69
+ find_path (MKL_ROOT_DIR include /mkl.h PATHS ${mkl_root_paths} )
66
70
endif ()
67
71
68
- set (MKL_INCLUDE_DIRS "${MKL_ROOT_DIR} /include" CACHE PATH "Path to MKL include directory" )
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" )
69
77
70
78
if (NOT MKL_ROOT_DIR
71
79
OR NOT EXISTS "${MKL_ROOT_DIR} "
72
- OR NOT EXISTS "${MKL_INCLUDE_DIRS } "
73
- OR NOT EXISTS "${MKL_INCLUDE_DIRS } /mkl_version.h"
80
+ OR NOT EXISTS "${MKL_INCLUDE_DIR } "
81
+ OR NOT EXISTS "${MKL_INCLUDE_DIR } /mkl_version.h"
74
82
)
75
- mkl_fail ()
83
+ mkl_fail ()
76
84
endif ()
77
85
78
- get_mkl_version (${MKL_INCLUDE_DIRS } /mkl_version.h )
86
+ get_mkl_version (${MKL_INCLUDE_DIR } /mkl_version.h )
79
87
80
88
#determine arch
81
89
if (CMAKE_CXX_SIZEOF_DATA_PTR EQUAL 8 )
@@ -95,52 +103,66 @@ else()
95
103
set (MKL_ARCH_SUFFIX "c" )
96
104
endif ()
97
105
98
- if (MKL_VERSION_STR VERSION_GREATER "11.3.0" OR MKL_VERSION_STR VERSION_EQUAL "11.3.0" )
99
- set (mkl_lib_find_paths
100
- ${MKL_ROOT_DIR} /lib )
101
- foreach (MKL_ARCH ${MKL_ARCH_LIST} )
102
- list (APPEND mkl_lib_find_paths
103
- ${MKL_ROOT_DIR} /lib/${MKL_ARCH}
104
- ${MKL_ROOT_DIR} /../tbb/lib/${MKL_ARCH}
105
- ${MKL_ROOT_DIR} /${MKL_ARCH} )
106
- endforeach ()
107
-
108
- set (mkl_lib_list "mkl_intel_${MKL_ARCH_SUFFIX} " )
109
-
110
- if (MKL_WITH_TBB )
111
- list (APPEND mkl_lib_list mkl_tbb_thread tbb )
112
- elseif (MKL_WITH_OPENMP )
113
- if (MSVC )
114
- list (APPEND mkl_lib_list mkl_intel_thread libiomp5md )
115
- else ()
116
- list (APPEND mkl_lib_list mkl_gnu_thread )
117
- endif ()
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 )
118
134
else ()
119
- list (APPEND mkl_lib_list mkl_sequential )
135
+ list (APPEND mkl_lib_list mkl_gnu_thread )
120
136
endif ()
137
+ else ()
138
+ list (APPEND mkl_lib_list mkl_sequential )
139
+ endif ()
121
140
122
- list (APPEND mkl_lib_list mkl_core )
141
+ list (APPEND mkl_lib_list mkl_core )
123
142
else ()
124
- message (STATUS "MKL version ${MKL_VERSION_STR} is not supported" )
125
- mkl_fail ()
143
+ message (STATUS "MKL version ${MKL_VERSION_STR} is not supported" )
144
+ mkl_fail ()
126
145
endif ()
127
146
128
- set (MKL_LIBRARIES "" )
129
- foreach (lib ${mkl_lib_list} )
130
- find_library (${lib} NAMES ${lib} ${lib} _dll HINTS ${mkl_lib_find_paths} )
131
- mark_as_advanced (${lib} )
132
- if (NOT ${lib} )
133
- mkl_fail ()
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 ()
134
155
endif ()
135
- list (APPEND MKL_LIBRARIES ${${lib}} )
136
- endforeach ()
156
+ list (APPEND MKL_LIBRARIES ${${lib_var_name}} )
157
+ endforeach ()
158
+ endif ()
137
159
138
160
message (STATUS "Found MKL ${MKL_VERSION_STR} at: ${MKL_ROOT_DIR} " )
139
161
set (HAVE_MKL ON )
140
162
set (MKL_ROOT_DIR "${MKL_ROOT_DIR} " CACHE PATH "Path to MKL directory" )
141
- set (MKL_INCLUDE_DIRS "${MKL_INCLUDE_DIRS} " CACHE PATH "Path to MKL include directory " )
142
- set (MKL_LIBRARIES "${MKL_LIBRARIES} " CACHE STRING "MKL libraries" )
143
- if (UNIX AND NOT MKL_LIBRARIES_DONT_HACK )
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 )
144
166
#it's ugly but helps to avoid cyclic lib problem
145
167
set (MKL_LIBRARIES ${MKL_LIBRARIES} ${MKL_LIBRARIES} ${MKL_LIBRARIES} "-lpthread" "-lm" "-ldl" )
146
168
endif ()
0 commit comments