cmake: update MKL library searching
- allow to specify MKL_LIBRARIES through command-line
This commit is contained in:
parent
d8107a5125
commit
b3937288e5
@ -3,7 +3,14 @@
|
|||||||
# installation/package
|
# installation/package
|
||||||
#
|
#
|
||||||
# Parameters:
|
# Parameters:
|
||||||
# MKL_WITH_TBB
|
# MKL_ROOT_DIR / ENV{MKLROOT}
|
||||||
|
# MKL_INCLUDE_DIR
|
||||||
|
# MKL_LIBRARIES
|
||||||
|
# MKL_USE_SINGLE_DYNAMIC_LIBRARY - use single dynamic library mkl_rt.lib / libmkl_rt.so
|
||||||
|
# MKL_WITH_TBB / MKL_WITH_OPENMP
|
||||||
|
#
|
||||||
|
# Extra:
|
||||||
|
# MKL_LIB_FIND_PATHS
|
||||||
#
|
#
|
||||||
# On return this will define:
|
# On return this will define:
|
||||||
#
|
#
|
||||||
@ -13,12 +20,6 @@
|
|||||||
# MKL_LIBRARIES - MKL libraries that are used by OpenCV
|
# MKL_LIBRARIES - MKL libraries that are used by OpenCV
|
||||||
#
|
#
|
||||||
|
|
||||||
macro (mkl_find_lib VAR NAME DIRS)
|
|
||||||
find_path(${VAR} ${NAME} ${DIRS} NO_DEFAULT_PATH)
|
|
||||||
set(${VAR} ${${VAR}}/${NAME})
|
|
||||||
unset(${VAR} CACHE)
|
|
||||||
endmacro()
|
|
||||||
|
|
||||||
macro(mkl_fail)
|
macro(mkl_fail)
|
||||||
set(HAVE_MKL OFF)
|
set(HAVE_MKL OFF)
|
||||||
set(MKL_ROOT_DIR "${MKL_ROOT_DIR}" CACHE PATH "Path to MKL directory")
|
set(MKL_ROOT_DIR "${MKL_ROOT_DIR}" CACHE PATH "Path to MKL directory")
|
||||||
@ -39,43 +40,50 @@ macro(get_mkl_version VERSION_FILE)
|
|||||||
set(MKL_VERSION_STR "${MKL_VERSION_MAJOR}.${MKL_VERSION_MINOR}.${MKL_VERSION_UPDATE}" CACHE STRING "MKL version" FORCE)
|
set(MKL_VERSION_STR "${MKL_VERSION_MAJOR}.${MKL_VERSION_MINOR}.${MKL_VERSION_UPDATE}" CACHE STRING "MKL version" FORCE)
|
||||||
endmacro()
|
endmacro()
|
||||||
|
|
||||||
|
OCV_OPTION(MKL_USE_SINGLE_DYNAMIC_LIBRARY "Use MKL Single Dynamic Library thorugh mkl_rt.lib / libmkl_rt.so" OFF)
|
||||||
|
OCV_OPTION(MKL_WITH_TBB "Use MKL with TBB multithreading" OFF)#ON IF WITH_TBB)
|
||||||
|
OCV_OPTION(MKL_WITH_OPENMP "Use MKL with OpenMP multithreading" OFF)#ON IF WITH_OPENMP)
|
||||||
|
|
||||||
if(NOT DEFINED MKL_USE_MULTITHREAD)
|
if(NOT MKL_ROOT_DIR AND DEFINED MKL_INCLUDE_DIR AND EXISTS "${MKL_INCLUDE_DIR}/mkl.h")
|
||||||
OCV_OPTION(MKL_WITH_TBB "Use MKL with TBB multithreading" OFF)#ON IF WITH_TBB)
|
file(TO_CMAKE_PATH "${MKL_INCLUDE_DIR}" MKL_INCLUDE_DIR)
|
||||||
OCV_OPTION(MKL_WITH_OPENMP "Use MKL with OpenMP multithreading" OFF)#ON IF WITH_OPENMP)
|
get_filename_component(MKL_ROOT_DIR "${MKL_INCLUDE_DIR}/.." ABSOLUTE)
|
||||||
|
endif()
|
||||||
|
if(NOT MKL_ROOT_DIR)
|
||||||
|
file(TO_CMAKE_PATH "${MKL_ROOT_DIR}" mkl_root_paths)
|
||||||
|
if(DEFINED ENV{MKLROOT})
|
||||||
|
file(TO_CMAKE_PATH "$ENV{MKLROOT}" path)
|
||||||
|
list(APPEND mkl_root_paths "${path}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(WITH_MKL AND NOT mkl_root_paths)
|
||||||
|
if(WIN32)
|
||||||
|
set(ProgramFilesx86 "ProgramFiles(x86)")
|
||||||
|
file(TO_CMAKE_PATH "$ENV{${ProgramFilesx86}}" path)
|
||||||
|
list(APPEND mkl_root_paths ${path}/IntelSWTools/compilers_and_libraries/windows/mkl)
|
||||||
|
endif()
|
||||||
|
if(UNIX)
|
||||||
|
list(APPEND mkl_root_paths "/opt/intel/mkl")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_path(MKL_ROOT_DIR include/mkl.h PATHS ${mkl_root_paths})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
#check current MKL_ROOT_DIR
|
|
||||||
if(NOT MKL_ROOT_DIR OR NOT EXISTS "${MKL_ROOT_DIR}/include/mkl.h")
|
if(NOT MKL_ROOT_DIR OR NOT EXISTS "${MKL_ROOT_DIR}/include/mkl.h")
|
||||||
set(mkl_root_paths "${MKL_ROOT_DIR}")
|
mkl_fail()
|
||||||
if(DEFINED ENV{MKLROOT})
|
|
||||||
list(APPEND mkl_root_paths "$ENV{MKLROOT}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WITH_MKL AND NOT mkl_root_paths)
|
|
||||||
if(WIN32)
|
|
||||||
set(ProgramFilesx86 "ProgramFiles(x86)")
|
|
||||||
list(APPEND mkl_root_paths $ENV{${ProgramFilesx86}}/IntelSWTools/compilers_and_libraries/windows/mkl)
|
|
||||||
endif()
|
|
||||||
if(UNIX)
|
|
||||||
list(APPEND mkl_root_paths "/opt/intel/mkl")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_path(MKL_ROOT_DIR include/mkl.h PATHS ${mkl_root_paths})
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(MKL_INCLUDE_DIRS "${MKL_ROOT_DIR}/include" CACHE PATH "Path to MKL include directory")
|
set(MKL_INCLUDE_DIR "${MKL_ROOT_DIR}/include" CACHE PATH "Path to MKL include directory")
|
||||||
|
|
||||||
if(NOT MKL_ROOT_DIR
|
if(NOT MKL_ROOT_DIR
|
||||||
OR NOT EXISTS "${MKL_ROOT_DIR}"
|
OR NOT EXISTS "${MKL_ROOT_DIR}"
|
||||||
OR NOT EXISTS "${MKL_INCLUDE_DIRS}"
|
OR NOT EXISTS "${MKL_INCLUDE_DIR}"
|
||||||
OR NOT EXISTS "${MKL_INCLUDE_DIRS}/mkl_version.h"
|
OR NOT EXISTS "${MKL_INCLUDE_DIR}/mkl_version.h"
|
||||||
)
|
)
|
||||||
mkl_fail()
|
mkl_fail()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
get_mkl_version(${MKL_INCLUDE_DIRS}/mkl_version.h)
|
get_mkl_version(${MKL_INCLUDE_DIR}/mkl_version.h)
|
||||||
|
|
||||||
#determine arch
|
#determine arch
|
||||||
if(CMAKE_CXX_SIZEOF_DATA_PTR EQUAL 8)
|
if(CMAKE_CXX_SIZEOF_DATA_PTR EQUAL 8)
|
||||||
@ -95,52 +103,66 @@ else()
|
|||||||
set(MKL_ARCH_SUFFIX "c")
|
set(MKL_ARCH_SUFFIX "c")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(MKL_VERSION_STR VERSION_GREATER "11.3.0" OR MKL_VERSION_STR VERSION_EQUAL "11.3.0")
|
set(mkl_lib_find_paths ${MKL_LIB_FIND_PATHS} ${MKL_ROOT_DIR}/lib)
|
||||||
set(mkl_lib_find_paths
|
foreach(MKL_ARCH ${MKL_ARCH_LIST})
|
||||||
${MKL_ROOT_DIR}/lib)
|
list(APPEND mkl_lib_find_paths
|
||||||
foreach(MKL_ARCH ${MKL_ARCH_LIST})
|
${MKL_ROOT_DIR}/lib/${MKL_ARCH}
|
||||||
list(APPEND mkl_lib_find_paths
|
${MKL_ROOT_DIR}/${MKL_ARCH}
|
||||||
${MKL_ROOT_DIR}/lib/${MKL_ARCH}
|
)
|
||||||
${MKL_ROOT_DIR}/../tbb/lib/${MKL_ARCH}
|
endforeach()
|
||||||
${MKL_ROOT_DIR}/${MKL_ARCH})
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
set(mkl_lib_list "mkl_intel_${MKL_ARCH_SUFFIX}")
|
if(MKL_USE_SINGLE_DYNAMIC_LIBRARY AND NOT (MKL_VERSION_STR VERSION_LESS "10.3.0"))
|
||||||
|
|
||||||
if(MKL_WITH_TBB)
|
# https://software.intel.com/content/www/us/en/develop/articles/a-new-linking-model-single-dynamic-library-mkl_rt-since-intel-mkl-103.html
|
||||||
list(APPEND mkl_lib_list mkl_tbb_thread tbb)
|
set(mkl_lib_list "mkl_rt")
|
||||||
elseif(MKL_WITH_OPENMP)
|
|
||||||
if(MSVC)
|
elseif(NOT (MKL_VERSION_STR VERSION_LESS "11.3.0"))
|
||||||
list(APPEND mkl_lib_list mkl_intel_thread libiomp5md)
|
|
||||||
else()
|
foreach(MKL_ARCH ${MKL_ARCH_LIST})
|
||||||
list(APPEND mkl_lib_list mkl_gnu_thread)
|
list(APPEND mkl_lib_find_paths
|
||||||
endif()
|
${MKL_ROOT_DIR}/../tbb/lib/${MKL_ARCH}
|
||||||
|
)
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
set(mkl_lib_list "mkl_intel_${MKL_ARCH_SUFFIX}")
|
||||||
|
|
||||||
|
if(MKL_WITH_TBB)
|
||||||
|
list(APPEND mkl_lib_list mkl_tbb_thread tbb)
|
||||||
|
elseif(MKL_WITH_OPENMP)
|
||||||
|
if(MSVC)
|
||||||
|
list(APPEND mkl_lib_list mkl_intel_thread libiomp5md)
|
||||||
else()
|
else()
|
||||||
list(APPEND mkl_lib_list mkl_sequential)
|
list(APPEND mkl_lib_list mkl_gnu_thread)
|
||||||
endif()
|
endif()
|
||||||
|
else()
|
||||||
|
list(APPEND mkl_lib_list mkl_sequential)
|
||||||
|
endif()
|
||||||
|
|
||||||
list(APPEND mkl_lib_list mkl_core)
|
list(APPEND mkl_lib_list mkl_core)
|
||||||
else()
|
else()
|
||||||
message(STATUS "MKL version ${MKL_VERSION_STR} is not supported")
|
message(STATUS "MKL version ${MKL_VERSION_STR} is not supported")
|
||||||
mkl_fail()
|
mkl_fail()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(MKL_LIBRARIES "")
|
if(NOT MKL_LIBRARIES)
|
||||||
foreach(lib ${mkl_lib_list})
|
set(MKL_LIBRARIES "")
|
||||||
find_library(${lib} NAMES ${lib} ${lib}_dll HINTS ${mkl_lib_find_paths})
|
foreach(lib ${mkl_lib_list})
|
||||||
mark_as_advanced(${lib})
|
set(lib_var_name MKL_LIBRARY_${lib})
|
||||||
if(NOT ${lib})
|
find_library(${lib_var_name} NAMES ${lib} ${lib}_dll HINTS ${mkl_lib_find_paths})
|
||||||
mkl_fail()
|
mark_as_advanced(${lib_var_name})
|
||||||
|
if(NOT ${lib_var_name})
|
||||||
|
mkl_fail()
|
||||||
endif()
|
endif()
|
||||||
list(APPEND MKL_LIBRARIES ${${lib}})
|
list(APPEND MKL_LIBRARIES ${${lib_var_name}})
|
||||||
endforeach()
|
endforeach()
|
||||||
|
endif()
|
||||||
|
|
||||||
message(STATUS "Found MKL ${MKL_VERSION_STR} at: ${MKL_ROOT_DIR}")
|
message(STATUS "Found MKL ${MKL_VERSION_STR} at: ${MKL_ROOT_DIR}")
|
||||||
set(HAVE_MKL ON)
|
set(HAVE_MKL ON)
|
||||||
set(MKL_ROOT_DIR "${MKL_ROOT_DIR}" CACHE PATH "Path to MKL directory")
|
set(MKL_ROOT_DIR "${MKL_ROOT_DIR}" CACHE PATH "Path to MKL directory")
|
||||||
set(MKL_INCLUDE_DIRS "${MKL_INCLUDE_DIRS}" CACHE PATH "Path to MKL include directory")
|
set(MKL_INCLUDE_DIRS "${MKL_INCLUDE_DIR}")
|
||||||
set(MKL_LIBRARIES "${MKL_LIBRARIES}" CACHE STRING "MKL libraries")
|
set(MKL_LIBRARIES "${MKL_LIBRARIES}")
|
||||||
if(UNIX AND NOT MKL_LIBRARIES_DONT_HACK)
|
if(UNIX AND NOT MKL_USE_SINGLE_DYNAMIC_LIBRARY AND NOT MKL_LIBRARIES_DONT_HACK)
|
||||||
#it's ugly but helps to avoid cyclic lib problem
|
#it's ugly but helps to avoid cyclic lib problem
|
||||||
set(MKL_LIBRARIES ${MKL_LIBRARIES} ${MKL_LIBRARIES} ${MKL_LIBRARIES} "-lpthread" "-lm" "-ldl")
|
set(MKL_LIBRARIES ${MKL_LIBRARIES} ${MKL_LIBRARIES} ${MKL_LIBRARIES} "-lpthread" "-lm" "-ldl")
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user