Files
E502_ADC_BF_PC_companion/lib/e502/cmake/modules/FindMKL.cmake

174 lines
7.4 KiB
CMake
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# базовая директория может быть задана с помощью переменной 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()