174 lines
7.4 KiB
CMake
174 lines
7.4 KiB
CMake
# базовая директория может быть задана с помощью переменной cmake MKL_ROOT (самый высокий приоритет)
|
||
# или с помощью переменной окружения MKL_ROOT.
|
||
# Если MKL_ROOT не задан, то ищет в стандартных путях:
|
||
# на Windows в Program Files или Program Files (x86) в директории Intel/oneAPI/mkl/latest
|
||
# на Linux в штатных путях (в корне или /usr)
|
||
#
|
||
# использует tbb threading model, соглашение ILP64 на 64 битах, cdecl на 32
|
||
# (при необходимости можно добавить опции...)
|
||
# можно задать пользовательскую версию библитеки
|
||
# (если создана своя версия с подможеством функций с помощью intel compiler):
|
||
# MKL_CUSTOM_LIBRARY_NAME - имя библиотеки
|
||
# MKL_CUSTOM_LIBRARY_DIR - путь к пользовательской библиотеки без lib/<сиффикс> (может быть вне MKL_ROOT)
|
||
# Заголовочные файлы в этом случае сперва ищутся в ${MKL_CUSTOM_LIBRARY_DIR}/include, а затем уже внутри MKL_ROOT
|
||
|
||
|
||
# в первую очередь пытаемся найти mkl с помощью pkgconfig, если применимо
|
||
if (NOT MKL_FOUND)
|
||
if(NOT WIN32 AND NOT MKL_CUSTOM_LIBRARY_NAME AND NOT MKL_ROOT)
|
||
find_package(PkgConfig QUIET)
|
||
if(PkgConfig_FOUND)
|
||
#ищем среди разных реализаций потоков в порядке приоритета
|
||
pkg_check_modules(MKL QUIET mkl-dynamic-ilp64-tbb)
|
||
if (NOT MKL_FOUND)
|
||
pkg_check_modules(MKL QUIET mkl-dynamic-ilp64-iomp)
|
||
endif(NOT MKL_FOUND)
|
||
|
||
if (NOT MKL_FOUND)
|
||
pkg_check_modules(MKL QUIET mkl-dynamic-ilp64-seq)
|
||
endif(NOT MKL_FOUND)
|
||
endif(PkgConfig_FOUND)
|
||
endif()
|
||
endif(NOT MKL_FOUND)
|
||
# если не нашли через PkgConfig, то ищмем самостоятельно
|
||
if (NOT MKL_FOUND)
|
||
macro(MKL_FIND_LIBRARY LIB_VAR LIB_FILE_NAME)
|
||
|
||
find_library(${LIB_VAR} NAMES ${LIB_FILE_NAME}
|
||
PATHS
|
||
${MKL_SEARCH_LIBRARY_DIRS}
|
||
PATH_SUFFIXES ${MKL_SEARCH_LIBRARY_DIR_SUFFIX}
|
||
)
|
||
|
||
get_filename_component(LIB_DIR ${${LIB_VAR}} DIRECTORY)
|
||
get_filename_component(LIB_NAME ${${LIB_VAR}} NAME)
|
||
|
||
|
||
if (${LIB_DIR} IN_LIST MKL_LIBRARY_DIRS)
|
||
else()
|
||
set(MKL_LIBRARY_DIRS ${MKL_LIBRARY_DIRS} ${LIB_DIR})
|
||
endif()
|
||
set(MKL_REQIRED_LIBS ${MKL_REQIRED_LIBS} ${LIB_VAR})
|
||
endmacro()
|
||
|
||
if(WIN32)
|
||
cmake_policy(VERSION 3.2)
|
||
|
||
# в переменных окружения могут быть пути с разделителем \.
|
||
# если пыти с разными разделителями, то могут быть проблемы, поэтому переводим
|
||
# все к /
|
||
if(NOT MKL_ROOT)
|
||
set(set MKL_ROOT $ENV{MKLROOT})
|
||
endif(NOT MKL_ROOT)
|
||
if(MKL_ROOT)
|
||
string(REGEX REPLACE "\\\\" "/" MKL_ROOT MKL_ROOT)
|
||
endif(MKL_ROOT)
|
||
string(REGEX REPLACE "\\\\" "/" PROGFILES $ENV{PROGRAMFILES})
|
||
string(REGEX REPLACE "\\\\" "/" PROGFILESX86 $ENV{PROGRAMFILES\(x86\)})
|
||
|
||
if(MKL_ROOT)
|
||
set(MKL_SEARCH_DIRS ${MKL_ROOT})
|
||
else(MKL_ROOT)
|
||
set(MKL_WINSTD_DIR "Intel/oneAPI/mkl/latest")
|
||
set(MKL_SEARCH_DIRS "${PROGFILES}/${MKL_WINSTD_DIR}" "${PROGFILESX86}/${MKL_WINSTD_DIR}")
|
||
endif(MKL_ROOT)
|
||
set(MKL_SEARCH_INCLUDE_DIRS ${MKL_SEARCH_DIRS})
|
||
set(MKL_SEARCH_LIBRARY_DIRS ${MKL_SEARCH_DIRS})
|
||
set(MKL_SEARCH_INCLUDE_DIR_SUFFIX include)
|
||
if("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
|
||
if(CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||
set(MKL_SEARCH_LIBRARY_DEF_SUFFIX "ia32_win")
|
||
else(CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||
set(MKL_SEARCH_LIBRARY_DEF_SUFFIX "intel64_win")
|
||
endif(CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||
endif("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
|
||
set(MKL_SEARCH_LIBRARY_DIR_SUFFIX "lib/${MKL_SEARCH_LIBRARY_DEF_SUFFIX}")
|
||
|
||
#todo возможно сделать опцию, static или dll
|
||
set(MKL_LIB_FILE_SUFFIX "_dll")
|
||
|
||
else(WIN32)
|
||
|
||
if(NOT MKL_ROOT)
|
||
set(MKL_ROOT $ENV{MKLROOT})
|
||
endif(NOT MKL_ROOT)
|
||
|
||
|
||
|
||
if (MKL_ROOT)
|
||
set(MKL_SEARCH_INCLUDE_DIRS ${MKL_ROOT}/include)
|
||
else(MKL_ROOT)
|
||
set(MKL_SEARCH_INCLUDE_DIRS include local/include)
|
||
endif(MKL_ROOT)
|
||
|
||
if(CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||
if (MKL_ROOT)
|
||
set(MKL_SEARCH_LIBRARY_DIRS ${MKL_ROOT}/lib)
|
||
else (MKL_ROOT)
|
||
set(MKL_SEARCH_LIBRARY_DIRS lib local/lib lib/i386-linux-gnu)
|
||
endif(MKL_ROOT)
|
||
elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||
if (MKL_ROOT)
|
||
set(MKL_SEARCH_LIBRARY_DIRS ${MKL_ROOT}/lib64 ${MKL_ROOT}/lib/intel64)
|
||
else(MKL_ROOT)
|
||
set(MKL_SEARCH_LIBRARY_DIRS lib64 lib/x86_64-linux-gnu local/lib64)
|
||
endif(MKL_ROOT)
|
||
|
||
#взято из готового примера - проверить необходимость
|
||
set(ABI "-m64")
|
||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${ABI}")
|
||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${ABI}")
|
||
endif(CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||
endif(WIN32)
|
||
|
||
|
||
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||
#todo возможно сделать опцию выбора между ILP64 и LP64 (MKL_LONG 64 или 32)
|
||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DMKL_ILP64")
|
||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMKL_ILP64")
|
||
endif(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||
|
||
|
||
if(MKL_CUSTOM_LIBRARY_DIR)
|
||
set(MKL_SEARCH_INCLUDE_DIRS ${MKL_CUSTOM_LIBRARY_DIR} ${MKL_SEARCH_INCLUDE_DIRS})
|
||
endif(MKL_CUSTOM_LIBRARY_DIR)
|
||
|
||
find_path(MKL_INCLUDE_DIR NAMES mkl.h
|
||
PATHS
|
||
${MKL_SEARCH_INCLUDE_DIRS}
|
||
PATH_SUFFIXES ${MKL_SEARCH_INCLUDE_DIR_SUFFIX}
|
||
)
|
||
|
||
if (NOT MKL_CUSTOM_LIBRARY_NAME)
|
||
if(CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||
MKL_FIND_LIBRARY(MKL_INTERFACE_LIBRARY mkl_intel_c${MKL_LIB_FILE_SUFFIX})
|
||
elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||
MKL_FIND_LIBRARY(MKL_INTERFACE_LIBRARY mkl_intel_ilp64${MKL_LIB_FILE_SUFFIX})
|
||
endif(CMAKE_SIZEOF_VOID_P EQUAL 4)
|
||
MKL_FIND_LIBRARY(MKL_CORE_LIBRARY mkl_core${MKL_LIB_FILE_SUFFIX})
|
||
|
||
MKL_FIND_LIBRARY(MKL_THREAD_LIBRARY mkl_tbb_thread${MKL_LIB_FILE_SUFFIX})
|
||
if(NOT WIN32)
|
||
MKL_FIND_LIBRARY(MKL_TBB_LIBRARY tbb)
|
||
endif(NOT WIN32)
|
||
else(NOT MKL_CUSTOM_LIBRARY_NAME)
|
||
set(MKL_SEARCH_LIBRARY_DIRS ${MKL_SEARCH_LIBRARY_DIRS} ${MKL_CUSTOM_LIBRARY_DIR})
|
||
MKL_FIND_LIBRARY(MKL_CUSTOM_LIBRARY ${MKL_CUSTOM_LIBRARY_NAME})
|
||
endif(NOT MKL_CUSTOM_LIBRARY_NAME)
|
||
|
||
include(FindPackageHandleStandardArgs)
|
||
|
||
|
||
find_package_handle_standard_args(MKL
|
||
REQUIRED_VARS MKL_INCLUDE_DIR ${MKL_REQIRED_LIBS}
|
||
)
|
||
if(MKL_FOUND)
|
||
foreach(MKL_LIB ${MKL_REQIRED_LIBS})
|
||
set(MKL_LIBRARIES ${MKL_LIBRARIES} ${${MKL_LIB}})
|
||
endforeach()
|
||
set(MKL_INCLUDE_DIRS ${MKL_INCLUDE_DIR})
|
||
|
||
endif(MKL_FOUND)
|
||
endif()
|
||
|