Skip to content

Commit 2a2e4e7

Browse files
committed
Merge pull request opencv#19451 from alalek:cmake_mkl_tbb_oneapi_workaround
2 parents fb3b297 + 7a282a8 commit 2a2e4e7

File tree

2 files changed

+52
-4
lines changed

2 files changed

+52
-4
lines changed

cmake/OpenCVFindLAPACK.cmake

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,16 +58,52 @@ macro(ocv_lapack_check)
5858
string(REPLACE ";" "\n" _lapack_content "${_lapack_content}")
5959
ocv_update_file("${CBLAS_H_PROXY_PATH}" "${_lapack_content}")
6060

61+
if(CMAKE_GENERATOR MATCHES "Visual Studio" # MSBuild
62+
AND LAPACK_IMPL STREQUAL "MKL"
63+
AND ";${LAPACK_LIBRARIES};" MATCHES ";tbb;" AND TARGET tbb
64+
AND DEFINED TBB_INTERFACE_VERSION AND NOT (TBB_INTERFACE_VERSION LESS 12000) # oneTBB/oneAPI workaround
65+
)
66+
# workaround DEFAULTLIB:tbb12.lib issue
67+
get_target_property(_tbb_lib tbb IMPORTED_LOCATION)
68+
if(NOT _tbb_lib)
69+
get_target_property(_tbb_lib tbb IMPORTED_LOCATION_RELEASE)
70+
endif()
71+
if(_tbb_lib AND NOT OPENCV_SKIP_WORKAROUND_MKL_LINK_DIRECTORIES_TBB)
72+
# MSBuild drops content of 'LIB' environment variable,
73+
# so pass TBB library directory through `link_directories()`
74+
get_filename_component(_tbb_lib_dir "${_tbb_lib}" DIRECTORY)
75+
message(STATUS "MKL: adding '${_tbb_lib_dir}' to link directories (workaround DEFAULTLIB issue)")
76+
link_directories("${_tbb_lib_dir}")
77+
elseif(NOT OPENCV_SKIP_WORKAROUND_MKL_DEFAULTLIB)
78+
# We may have tbb.lib for 'tbb' target, but not 'tbb12.lib'
79+
ocv_update(OPENCV_MKL_IGNORE_DEFAULTLIB_TBB "tbb12.lib")
80+
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} /NODEFAULTLIB:${OPENCV_MKL_IGNORE_DEFAULTLIB_TBB}")
81+
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:${OPENCV_MKL_IGNORE_DEFAULTLIB_TBB}")
82+
endif()
83+
endif()
84+
85+
# TODO add cache for try_compile() inputs/results
86+
87+
get_property(__link_directories DIRECTORY PROPERTY LINK_DIRECTORIES)
88+
if(LAPACK_LINK_LIBRARIES)
89+
list(APPEND __link_directories ${LAPACK_LINK_LIBRARIES})
90+
endif()
91+
6192
try_compile(__VALID_LAPACK
6293
"${OpenCV_BINARY_DIR}"
6394
"${OpenCV_SOURCE_DIR}/cmake/checks/lapack_check.cpp"
6495
CMAKE_FLAGS "-DINCLUDE_DIRECTORIES:STRING=${LAPACK_INCLUDE_DIR}\;${CMAKE_BINARY_DIR}"
65-
"-DLINK_DIRECTORIES:STRING=${LAPACK_LINK_LIBRARIES}"
66-
"-DLINK_LIBRARIES:STRING=${LAPACK_LIBRARIES}"
96+
"-DLINK_DIRECTORIES:STRING=${__link_directories}"
97+
LINK_LIBRARIES ${LAPACK_LIBRARIES}
6798
OUTPUT_VARIABLE TRY_OUT
6899
)
69100
if(NOT __VALID_LAPACK)
70-
#message(FATAL_ERROR "LAPACK: check build log:\n${TRY_OUT}")
101+
file(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log
102+
"\nLAPACK(${LAPACK_IMPL}) check FAILED:\n"
103+
" LAPACK_INCLUDE_DIR: '${LAPACK_INCLUDE_DIR}'\n"
104+
" LAPACK_LIBRARIES: '${LAPACK_LIBRARIES}'\n"
105+
" LAPACK_LINK_LIBRARIES: '${__link_directories}'\n"
106+
" Output:\n${TRY_OUT}\n\n")
71107
message(STATUS "LAPACK(${LAPACK_IMPL}): Can't build LAPACK check code. This LAPACK version is not supported.")
72108
unset(LAPACK_LIBRARIES)
73109
else()

cmake/OpenCVFindMKL.cmake

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,11 @@ foreach(MKL_ARCH ${MKL_ARCH_LIST})
111111
)
112112
endforeach()
113113

114-
if(MKL_USE_SINGLE_DYNAMIC_LIBRARY AND NOT (MKL_VERSION_STR VERSION_LESS "10.3.0"))
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"))
115119

116120
# https://software.intel.com/content/www/us/en/develop/articles/a-new-linking-model-single-dynamic-library-mkl_rt-since-intel-mkl-103.html
117121
set(mkl_lib_list "mkl_rt")
@@ -152,6 +156,14 @@ if(NOT MKL_LIBRARIES)
152156
list(APPEND MKL_LIBRARIES ${OPENCV_EXTRA_MKL_LIBRARIES})
153157
endif()
154158

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+
155167
message(STATUS "Found MKL ${MKL_VERSION_STR} at: ${MKL_ROOT_DIR}")
156168
set(HAVE_MKL ON)
157169
set(MKL_ROOT_DIR "${MKL_ROOT_DIR}" CACHE PATH "Path to MKL directory")

0 commit comments

Comments
 (0)