aboutsummaryrefslogtreecommitdiff
path: root/test cases/frameworks
diff options
context:
space:
mode:
authorMichael Hirsch, Ph.D <scivision@users.noreply.github.com>2019-11-30 22:16:40 -0500
committerMichael Hirsch, Ph.D <scivision@users.noreply.github.com>2019-11-30 22:16:40 -0500
commite209dd2607c775cf8705c3b6ef70389c85a782e3 (patch)
tree962ecb1ce6d7c7a4f26ebf1957969a8572f6bbf5 /test cases/frameworks
parent3120481d7757760ab3f8d81c5848f55e95603182 (diff)
downloadmeson-e209dd2607c775cf8705c3b6ef70389c85a782e3.zip
meson-e209dd2607c775cf8705c3b6ef70389c85a782e3.tar.gz
meson-e209dd2607c775cf8705c3b6ef70389c85a782e3.tar.bz2
scalapack: allow specifying find method
Diffstat (limited to 'test cases/frameworks')
-rw-r--r--test cases/frameworks/30 scalapack/cmake/FindSCALAPACK.cmake223
-rw-r--r--test cases/frameworks/30 scalapack/meson.build2
2 files changed, 225 insertions, 0 deletions
diff --git a/test cases/frameworks/30 scalapack/cmake/FindSCALAPACK.cmake b/test cases/frameworks/30 scalapack/cmake/FindSCALAPACK.cmake
new file mode 100644
index 0000000..d67ff7a
--- /dev/null
+++ b/test cases/frameworks/30 scalapack/cmake/FindSCALAPACK.cmake
@@ -0,0 +1,223 @@
+# 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.
+
+This also uses our FindLAPACK.cmake to deduplicate code.
+
+
+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)
diff --git a/test cases/frameworks/30 scalapack/meson.build b/test cases/frameworks/30 scalapack/meson.build
index 430f54f..afef674 100644
--- a/test cases/frameworks/30 scalapack/meson.build
+++ b/test cases/frameworks/30 scalapack/meson.build
@@ -25,3 +25,5 @@ if add_languages('fortran')
dependencies: [scalapack, mpi_f])
test('scalapack_fortran', f_exe, timeout: 30)
endif
+
+scalapack_cmake = dependency('scalapack', method: 'cmake', cmake_module_path: 'cmake', required: false)