aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
authorMichael Hirsch, Ph.D <scivision@users.noreply.github.com>2019-11-24 00:13:54 -0500
committerMichael Hirsch, Ph.D <scivision@users.noreply.github.com>2019-11-30 21:29:49 -0500
commit92b77cb3210280315c47d18f3c87cdd2c59021bc (patch)
tree6d2e5196aab7a1d6827ad1416761bbfbc135e226 /mesonbuild
parent818c92003c41b72194cdc668a3346a4b7247bd23 (diff)
downloadmeson-92b77cb3210280315c47d18f3c87cdd2c59021bc.zip
meson-92b77cb3210280315c47d18f3c87cdd2c59021bc.tar.gz
meson-92b77cb3210280315c47d18f3c87cdd2c59021bc.tar.bz2
deps: add scalapack
Scalapack uses a library stack that can be challenging to manage. Not least of all since many Scalapacks ship with broken / incomplete pkg-config files and CMake FindScalapack.cmake This resolves those issues for typical Scalapack setups including: * Linux: Intel MKL or OpenMPI + Netlib * MacOS: Intel MKL or OpenMPI + Netlib * Windows: Intel MKL (OpenMPI not available on Windows)
Diffstat (limited to 'mesonbuild')
-rw-r--r--mesonbuild/dependencies/__init__.py10
-rw-r--r--mesonbuild/dependencies/scalapack.py121
2 files changed, 128 insertions, 3 deletions
diff --git a/mesonbuild/dependencies/__init__.py b/mesonbuild/dependencies/__init__.py
index 1b7c03f..889a610 100644
--- a/mesonbuild/dependencies/__init__.py
+++ b/mesonbuild/dependencies/__init__.py
@@ -22,6 +22,7 @@ from .base import ( # noqa: F401
from .dev import GMockDependency, GTestDependency, LLVMDependency, ValgrindDependency
from .coarrays import CoarrayDependency
from .mpi import MPIDependency
+from .scalapack import ScalapackDependency
from .misc import (BlocksDependency, NetCDFDependency, OpenMPDependency, Python3Dependency, ThreadDependency, PcapDependency, CupsDependency, LibWmfDependency, LibGCryptDependency, GpgmeDependency, ShadercDependency)
from .platform import AppleFrameworks
from .ui import GLDependency, GnuStepDependency, Qt4Dependency, Qt5Dependency, SDL2Dependency, WxDependency, VulkanDependency
@@ -37,11 +38,14 @@ packages.update({
'boost': BoostDependency,
'cuda': CudaDependency,
- # From misc:
- 'blocks': BlocksDependency,
+ # per-file
'coarray': CoarrayDependency,
- 'mpi': MPIDependency,
'hdf5': HDF5Dependency,
+ 'mpi': MPIDependency,
+ 'scalapack': ScalapackDependency,
+
+ # From misc:
+ 'blocks': BlocksDependency,
'netcdf': NetCDFDependency,
'openmp': OpenMPDependency,
'python3': Python3Dependency,
diff --git a/mesonbuild/dependencies/scalapack.py b/mesonbuild/dependencies/scalapack.py
new file mode 100644
index 0000000..4057091
--- /dev/null
+++ b/mesonbuild/dependencies/scalapack.py
@@ -0,0 +1,121 @@
+# Copyright 2013-2019 The Meson development team
+
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+
+# http://www.apache.org/licenses/LICENSE-2.0
+
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from pathlib import Path
+import os
+
+from .. import mesonlib
+from .base import (CMakeDependency, ExternalDependency, PkgConfigDependency)
+
+
+class ScalapackDependency(ExternalDependency):
+ def __init__(self, environment, kwargs: dict):
+ language = kwargs.get('language')
+ super().__init__('scalapack', environment, language, kwargs)
+ kwargs['required'] = False
+ kwargs['silent'] = True
+ self.is_found = False
+ self.static = kwargs.get('static', False)
+
+ # 1. try pkg-config
+ pkgconfig_files = []
+ mklroot = None
+ is_gcc = None
+ if language == 'fortran':
+ is_gcc = environment.detect_fortran_compiler(self.for_machine).get_id() == 'gcc'
+ elif language == 'c':
+ is_gcc = environment.detect_c_compiler(self.for_machine).get_id() == 'gcc'
+ elif language == 'cpp':
+ is_gcc = environment.detect_cpp_compiler(self.for_machine).get_id() == 'gcc'
+ # Intel MKL works with non-Intel compilers too -- but not gcc on windows
+ if 'MKLROOT' in os.environ and not (mesonlib.is_windows() and is_gcc):
+ try:
+ mklroot = Path(os.environ['MKLROOT']).resolve()
+ except Exception:
+ pass
+ if mklroot is not None:
+ # MKL pkg-config is a start, but you have to add / change stuff
+ # https://software.intel.com/en-us/articles/intel-math-kernel-library-intel-mkl-and-pkg-config-tool
+ pkgconfig_files = (
+ ['mkl-static-lp64-iomp'] if self.static else ['mkl-dynamic-lp64-iomp']
+ )
+ if mesonlib.is_windows():
+ suffix = '.lib'
+ elif self.static:
+ suffix = '.a'
+ else:
+ suffix = ''
+ libdir = mklroot / 'lib/intel64'
+ # Intel compiler might not have Parallel Suite
+ pkgconfig_files += ['scalapack-openmpi', 'scalapack']
+
+ for pkg in pkgconfig_files:
+ pkgdep = PkgConfigDependency(
+ pkg, environment, kwargs, language=self.language
+ )
+ if pkgdep.found():
+ self.compile_args = pkgdep.get_compile_args()
+ if mklroot:
+ link_args = pkgdep.get_link_args()
+ if is_gcc:
+ for i, a in enumerate(link_args):
+ if 'mkl_intel_lp64' in a:
+ link_args[i] = a.replace('intel', 'gf')
+ break
+ # MKL pkg-config omits scalapack
+ # be sure "-L" and "-Wl" are first if present
+ i = 0
+ for j, a in enumerate(link_args):
+ if a.startswith(('-L', '-Wl')):
+ i = j + 1
+ elif j > 3:
+ break
+ if mesonlib.is_windows() or self.static:
+ link_args.insert(
+ i, str(libdir / ('mkl_scalapack_lp64' + suffix))
+ )
+ link_args.insert(
+ i + 1, str(libdir / ('mkl_blacs_intelmpi_lp64' + suffix))
+ )
+ else:
+ link_args.insert(i, '-lmkl_scalapack_lp64')
+ link_args.insert(i + 1, '-lmkl_blacs_intelmpi_lp64')
+ else:
+ link_args = pkgdep.get_link_args()
+ self.link_args = link_args
+
+ self.version = pkgdep.get_version()
+ if self.version == 'unknown' and mklroot:
+ try:
+ v = (
+ mklroot.as_posix()
+ .split('compilers_and_libraries_')[1]
+ .split('/', 1)[0]
+ )
+ if v:
+ self.version = v
+ except IndexError:
+ pass
+
+ self.is_found = True
+ self.pcdep = pkgdep
+ return
+ # 2. try CMake
+ cmakedep = CMakeDependency('Scalapack', environment, kwargs)
+ if cmakedep.found():
+ self.compile_args = cmakedep.get_compile_args()
+ self.link_args = cmakedep.get_link_args()
+ self.version = cmakedep.get_version()
+ self.is_found = True
+ return