Skip to content

Commit b393728

Browse files
committed
cmake: update MKL library searching
- allow to specify MKL_LIBRARIES through command-line
1 parent d8107a5 commit b393728

File tree

1 file changed

+88
-66
lines changed

1 file changed

+88
-66
lines changed

cmake/OpenCVFindMKL.cmake

Lines changed: 88 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,14 @@
33
# installation/package
44
#
55
# 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
714
#
815
# On return this will define:
916
#
@@ -13,12 +20,6 @@
1320
# MKL_LIBRARIES - MKL libraries that are used by OpenCV
1421
#
1522

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-
2223
macro(mkl_fail)
2324
set(HAVE_MKL OFF)
2425
set(MKL_ROOT_DIR "${MKL_ROOT_DIR}" CACHE PATH "Path to MKL directory")
@@ -39,43 +40,50 @@ macro(get_mkl_version VERSION_FILE)
3940
set(MKL_VERSION_STR "${MKL_VERSION_MAJOR}.${MKL_VERSION_MINOR}.${MKL_VERSION_UPDATE}" CACHE STRING "MKL version" FORCE)
4041
endmacro()
4142

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)
4246

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)
4650
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)
5363
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")
6366
endif()
67+
endif()
6468

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})
6670
endif()
6771

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")
6977

7078
if(NOT MKL_ROOT_DIR
7179
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"
7482
)
75-
mkl_fail()
83+
mkl_fail()
7684
endif()
7785

78-
get_mkl_version(${MKL_INCLUDE_DIRS}/mkl_version.h)
86+
get_mkl_version(${MKL_INCLUDE_DIR}/mkl_version.h)
7987

8088
#determine arch
8189
if(CMAKE_CXX_SIZEOF_DATA_PTR EQUAL 8)
@@ -95,52 +103,66 @@ else()
95103
set(MKL_ARCH_SUFFIX "c")
96104
endif()
97105

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)
118134
else()
119-
list(APPEND mkl_lib_list mkl_sequential)
135+
list(APPEND mkl_lib_list mkl_gnu_thread)
120136
endif()
137+
else()
138+
list(APPEND mkl_lib_list mkl_sequential)
139+
endif()
121140

122-
list(APPEND mkl_lib_list mkl_core)
141+
list(APPEND mkl_lib_list mkl_core)
123142
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()
126145
endif()
127146

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()
134155
endif()
135-
list(APPEND MKL_LIBRARIES ${${lib}})
136-
endforeach()
156+
list(APPEND MKL_LIBRARIES ${${lib_var_name}})
157+
endforeach()
158+
endif()
137159

138160
message(STATUS "Found MKL ${MKL_VERSION_STR} at: ${MKL_ROOT_DIR}")
139161
set(HAVE_MKL ON)
140162
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)
144166
#it's ugly but helps to avoid cyclic lib problem
145167
set(MKL_LIBRARIES ${MKL_LIBRARIES} ${MKL_LIBRARIES} ${MKL_LIBRARIES} "-lpthread" "-lm" "-ldl")
146168
endif()

0 commit comments

Comments
 (0)