The Meson Build System
http://mesonbuild.com/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
221 lines
5.7 KiB
221 lines
5.7 KiB
5 years ago
|
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||
|
# file Copyright.txt or https://cmake.org/licensing for details.
|
||
|
|
||
|
#[=======================================================================[.rst:
|
||
|
|
||
|
FindSCALAPACK
|
||
|
-------------
|
||
|
|
||
|
* Michael Hirsch, Ph.D. www.scivision.dev
|
||
|
|
||
|
Let Michael know if there are more MKL / Lapack / compiler combination you want.
|
||
|
Refer to https://software.intel.com/en-us/articles/intel-mkl-link-line-advisor
|
||
|
|
||
|
Finds SCALAPACK libraries for MKL, OpenMPI and MPICH.
|
||
|
Intel MKL relies on having environment variable MKLROOT set, typically by sourcing
|
||
|
mklvars.sh beforehand.
|
||
|
|
||
|
Parameters
|
||
|
^^^^^^^^^^
|
||
|
|
||
|
``MKL``
|
||
|
Intel MKL for MSVC, ICL, ICC, GCC and PGCC. Working with IntelMPI (default Window, Linux), MPICH (default Mac) or OpenMPI (Linux only).
|
||
|
|
||
|
``IntelMPI``
|
||
|
MKL BLACS IntelMPI
|
||
|
|
||
|
``MKL64``
|
||
|
MKL only: 64-bit integers (default is 32-bit integers)
|
||
|
|
||
|
``OpenMPI``
|
||
|
SCALAPACK + OpenMPI
|
||
|
|
||
|
``MPICH``
|
||
|
SCALAPACK + MPICH
|
||
|
|
||
|
|
||
|
Result Variables
|
||
|
^^^^^^^^^^^^^^^^
|
||
|
|
||
|
``SCALAPACK_FOUND``
|
||
|
SCALapack libraries were found
|
||
|
``SCALAPACK_<component>_FOUND``
|
||
|
SCALAPACK <component> specified was found
|
||
|
``SCALAPACK_LIBRARIES``
|
||
|
SCALapack library files
|
||
|
``SCALAPACK_INCLUDE_DIRS``
|
||
|
SCALapack include directories
|
||
|
|
||
|
|
||
|
References
|
||
|
^^^^^^^^^^
|
||
|
|
||
|
* Pkg-Config and MKL: https://software.intel.com/en-us/articles/intel-math-kernel-library-intel-mkl-and-pkg-config-tool
|
||
|
* MKL for Windows: https://software.intel.com/en-us/mkl-windows-developer-guide-static-libraries-in-the-lib-intel64-win-directory
|
||
|
* MKL Windows directories: https://software.intel.com/en-us/mkl-windows-developer-guide-high-level-directory-structure
|
||
|
#]=======================================================================]
|
||
|
|
||
|
#===== functions
|
||
|
function(mkl_scala)
|
||
|
|
||
|
set(_mkl_libs ${ARGV})
|
||
|
|
||
|
foreach(s ${_mkl_libs})
|
||
|
find_library(SCALAPACK_${s}_LIBRARY
|
||
|
NAMES ${s}
|
||
|
PATHS ENV MKLROOT ENV I_MPI_ROOT ENV TBBROOT
|
||
|
PATH_SUFFIXES
|
||
|
lib/intel64 lib/intel64_win
|
||
|
intel64/lib/release
|
||
|
lib/intel64/gcc4.7 ../tbb/lib/intel64/gcc4.7
|
||
|
lib/intel64/vc_mt ../tbb/lib/intel64/vc_mt
|
||
|
../compiler/lib/intel64
|
||
|
HINTS ${MKL_LIBRARY_DIRS} ${MKL_LIBDIR}
|
||
|
NO_DEFAULT_PATH)
|
||
|
if(NOT SCALAPACK_${s}_LIBRARY)
|
||
|
message(WARNING "MKL component not found: " ${s})
|
||
|
return()
|
||
|
endif()
|
||
|
|
||
|
list(APPEND SCALAPACK_LIB ${SCALAPACK_${s}_LIBRARY})
|
||
|
endforeach()
|
||
|
|
||
|
|
||
|
find_path(SCALAPACK_INCLUDE_DIR
|
||
|
NAMES mkl_scalapack.h
|
||
|
PATHS ENV MKLROOT ENV I_MPI_ROOT ENV TBBROOT
|
||
|
PATH_SUFFIXES
|
||
|
include
|
||
|
include/intel64/${_mkl_bitflag}lp64
|
||
|
HINTS ${MKL_INCLUDE_DIRS})
|
||
|
|
||
|
if(NOT SCALAPACK_INCLUDE_DIR)
|
||
|
message(WARNING "MKL Include Dir not found")
|
||
|
return()
|
||
|
endif()
|
||
|
|
||
|
list(APPEND SCALAPACK_INCLUDE_DIR
|
||
|
${MKL_INCLUDE_DIRS})
|
||
|
|
||
|
set(SCALAPACK_LIBRARY ${SCALAPACK_LIB} PARENT_SCOPE)
|
||
|
set(SCALAPACK_INCLUDE_DIR ${SCALAPACK_INCLUDE_DIR} PARENT_SCOPE)
|
||
|
|
||
|
endfunction(mkl_scala)
|
||
|
|
||
|
#==== main program
|
||
|
|
||
|
cmake_policy(VERSION 3.11)
|
||
|
|
||
|
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.12)
|
||
|
cmake_policy(SET CMP0074 NEW)
|
||
|
cmake_policy(SET CMP0075 NEW)
|
||
|
endif()
|
||
|
|
||
|
if(NOT (OpenMPI IN_LIST SCALAPACK_FIND_COMPONENTS
|
||
|
OR MPICH IN_LIST SCALAPACK_FIND_COMPONENTS
|
||
|
OR MKL IN_LIST SCALAPACK_FIND_COMPONENTS))
|
||
|
if(DEFINED ENV{MKLROOT})
|
||
|
if(APPLE)
|
||
|
list(APPEND SCALAPACK_FIND_COMPONENTS MKL MPICH)
|
||
|
else()
|
||
|
list(APPEND SCALAPACK_FIND_COMPONENTS MKL IntelMPI)
|
||
|
endif()
|
||
|
else()
|
||
|
list(APPEND SCALAPACK_FIND_COMPONENTS OpenMPI)
|
||
|
endif()
|
||
|
endif()
|
||
|
|
||
|
find_package(PkgConfig)
|
||
|
|
||
|
if(NOT WIN32)
|
||
|
find_package(Threads) # not required--for example Flang
|
||
|
endif()
|
||
|
|
||
|
if(MKL IN_LIST SCALAPACK_FIND_COMPONENTS)
|
||
|
|
||
|
if(BUILD_SHARED_LIBS)
|
||
|
set(_mkltype dynamic)
|
||
|
else()
|
||
|
set(_mkltype static)
|
||
|
endif()
|
||
|
|
||
|
if(MKL64 IN_LIST SCALAPACK_FIND_COMPONENTS)
|
||
|
set(_mkl_bitflag i)
|
||
|
else()
|
||
|
set(_mkl_bitflag)
|
||
|
endif()
|
||
|
|
||
|
|
||
|
if(WIN32)
|
||
|
set(_impi impi)
|
||
|
else()
|
||
|
unset(_impi)
|
||
|
endif()
|
||
|
|
||
|
|
||
|
pkg_check_modules(MKL mkl-${_mkltype}-${_mkl_bitflag}lp64-iomp)
|
||
|
|
||
|
if(OpenMPI IN_LIST SCALAPACK_FIND_COMPONENTS)
|
||
|
mkl_scala(mkl_scalapack_${_mkl_bitflag}lp64 mkl_blacs_openmpi_${_mkl_bitflag}lp64)
|
||
|
if(SCALAPACK_LIBRARY)
|
||
|
set(SCALAPACK_OpenMPI_FOUND true)
|
||
|
endif()
|
||
|
elseif(MPICH IN_LIST SCALAPACK_FIND_COMPONENTS)
|
||
|
if(APPLE)
|
||
|
mkl_scala(mkl_scalapack_${_mkl_bitflag}lp64 mkl_blacs_mpich_${_mkl_bitflag}lp64)
|
||
|
elseif(WIN32)
|
||
|
mkl_scala(mkl_scalapack_${_mkl_bitflag}lp64 mkl_blacs_mpich2_${_mkl_bitflag}lp64.lib mpi.lib fmpich2.lib)
|
||
|
else() # linux, yes it's just like IntelMPI
|
||
|
mkl_scala(mkl_scalapack_${_mkl_bitflag}lp64 mkl_blacs_intelmpi_${_mkl_bitflag}lp64)
|
||
|
endif()
|
||
|
if(SCALAPACK_LIBRARY)
|
||
|
set(SCALAPACK_MPICH_FOUND true)
|
||
|
endif()
|
||
|
else() # IntelMPI
|
||
|
mkl_scala(mkl_scalapack_${_mkl_bitflag}lp64 mkl_blacs_intelmpi_${_mkl_bitflag}lp64 ${_impi})
|
||
|
if(SCALAPACK_LIBRARY)
|
||
|
set(SCALAPACK_IntelMPI_FOUND true)
|
||
|
endif()
|
||
|
endif()
|
||
|
|
||
|
if(SCALAPACK_LIBRARY)
|
||
|
set(SCALAPACK_MKL_FOUND true)
|
||
|
endif()
|
||
|
|
||
|
elseif(OpenMPI IN_LIST SCALAPACK_FIND_COMPONENTS)
|
||
|
|
||
|
pkg_check_modules(SCALAPACK scalapack-openmpi)
|
||
|
|
||
|
find_library(SCALAPACK_LIBRARY
|
||
|
NAMES scalapack scalapack-openmpi
|
||
|
HINTS ${SCALAPACK_LIBRARY_DIRS} ${SCALAPACK_LIBDIR})
|
||
|
|
||
|
if(SCALAPACK_LIBRARY)
|
||
|
set(SCALAPACK_OpenMPI_FOUND true)
|
||
|
endif()
|
||
|
|
||
|
elseif(MPICH IN_LIST SCALAPACK_FIND_COMPONENTS)
|
||
|
find_library(SCALAPACK_LIBRARY
|
||
|
NAMES scalapack-mpich scalapack-mpich2)
|
||
|
|
||
|
if(SCALAPACK_LIBRARY)
|
||
|
set(SCALAPACK_MPICH_FOUND true)
|
||
|
endif()
|
||
|
|
||
|
endif()
|
||
|
|
||
|
# Finalize
|
||
|
|
||
|
include(FindPackageHandleStandardArgs)
|
||
|
find_package_handle_standard_args(
|
||
|
SCALAPACK
|
||
|
REQUIRED_VARS SCALAPACK_LIBRARY
|
||
|
HANDLE_COMPONENTS)
|
||
|
|
||
|
if(SCALAPACK_FOUND)
|
||
|
set(SCALAPACK_LIBRARIES ${SCALAPACK_LIBRARY})
|
||
|
set(SCALAPACK_INCLUDE_DIRS ${SCALAPACK_INCLUDE_DIR})
|
||
|
endif()
|
||
|
|
||
|
mark_as_advanced(SCALAPACK_LIBRARY SCALAPACK_INCLUDE_DIR)
|