diff options
author | Michael Hirsch, Ph.D <scivision@users.noreply.github.com> | 2019-11-20 17:03:28 -0500 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2019-11-25 13:08:01 +0200 |
commit | 8313e8fd54c95459efbc413bb60d460cce10a12b (patch) | |
tree | 796951f452f27d8ebde669d6dc5a305aff91dd0f /mesonbuild/dependencies/misc.py | |
parent | 0241948d8fa37f59eb93088a26e9b7ae642cc2d0 (diff) | |
download | meson-8313e8fd54c95459efbc413bb60d460cce10a12b.zip meson-8313e8fd54c95459efbc413bb60d460cce10a12b.tar.gz meson-8313e8fd54c95459efbc413bb60d460cce10a12b.tar.bz2 |
dep: MPI make work for intel-cl and improve robustness
optimize intelMPI variables
mpi: extract version from non-OpenMPI wrapper
Diffstat (limited to 'mesonbuild/dependencies/misc.py')
-rw-r--r-- | mesonbuild/dependencies/misc.py | 204 |
1 files changed, 1 insertions, 203 deletions
diff --git a/mesonbuild/dependencies/misc.py b/mesonbuild/dependencies/misc.py index 56a852e..789015a 100644 --- a/mesonbuild/dependencies/misc.py +++ b/mesonbuild/dependencies/misc.py @@ -16,18 +16,16 @@ from pathlib import Path import functools -import os import re import sysconfig from .. import mlog from .. import mesonlib -from ..mesonlib import split_args from ..environment import detect_cpu_family from .base import ( DependencyException, DependencyMethods, ExternalDependency, - ExternalProgram, ExtraFrameworkDependency, PkgConfigDependency, + ExtraFrameworkDependency, PkgConfigDependency, CMakeDependency, ConfigToolDependency, ) @@ -108,206 +106,6 @@ class NetCDFDependency(ExternalDependency): self.is_found = True self.pcdep.append(pkgdep) -class MPIDependency(ExternalDependency): - - def __init__(self, environment, kwargs): - language = kwargs.get('language', 'c') - super().__init__('mpi', environment, language, kwargs) - kwargs['required'] = False - kwargs['silent'] = True - self.is_found = False - - # NOTE: Only OpenMPI supplies a pkg-config file at the moment. - if language == 'c': - env_vars = ['MPICC'] - pkgconfig_files = ['ompi-c'] - default_wrappers = ['mpicc'] - elif language == 'cpp': - env_vars = ['MPICXX'] - pkgconfig_files = ['ompi-cxx'] - default_wrappers = ['mpic++', 'mpicxx', 'mpiCC'] - elif language == 'fortran': - env_vars = ['MPIFC', 'MPIF90', 'MPIF77'] - pkgconfig_files = ['ompi-fort'] - default_wrappers = ['mpifort', 'mpif90', 'mpif77'] - else: - raise DependencyException('Language {} is not supported with MPI.'.format(language)) - - for pkg in pkgconfig_files: - try: - pkgdep = PkgConfigDependency(pkg, environment, kwargs, language=self.language) - if pkgdep.found(): - self.compile_args = pkgdep.get_compile_args() - self.link_args = pkgdep.get_link_args() - self.version = pkgdep.get_version() - self.is_found = True - self.pcdep = pkgdep - break - except Exception: - pass - - if not self.is_found: - # Prefer environment. - for var in env_vars: - if var in os.environ: - wrappers = [os.environ[var]] - break - else: - # Or search for default wrappers. - wrappers = default_wrappers - - for prog in wrappers: - result = self._try_openmpi_wrapper(prog) - if result is not None: - self.is_found = True - self.version = result[0] - self.compile_args = self._filter_compile_args(result[1]) - self.link_args = self._filter_link_args(result[2]) - break - result = self._try_other_wrapper(prog) - if result is not None: - self.is_found = True - self.version = result[0] - self.compile_args = self._filter_compile_args(result[1]) - self.link_args = self._filter_link_args(result[2]) - break - - if not self.is_found and mesonlib.is_windows(): - # only Intel Fortran compiler is compatible with Microsoft MPI at this time. - if language == 'fortran' and environment.detect_fortran_compiler(self.for_machine).name_string() != 'intel-cl': - return - result = self._try_msmpi() - if result is not None: - self.is_found = True - self.version, self.compile_args, self.link_args = result - - def _filter_compile_args(self, args): - """ - MPI wrappers return a bunch of garbage args. - Drop -O2 and everything that is not needed. - """ - result = [] - multi_args = ('-I', ) - if self.language == 'fortran': - fc = self.env.coredata.compilers[self.for_machine]['fortran'] - multi_args += fc.get_module_incdir_args() - - include_next = False - for f in args: - if f.startswith(('-D', '-f') + multi_args) or f == '-pthread' \ - or (f.startswith('-W') and f != '-Wall' and not f.startswith('-Werror')): - result.append(f) - if f in multi_args: - # Path is a separate argument. - include_next = True - elif include_next: - include_next = False - result.append(f) - return result - - def _filter_link_args(self, args): - """ - MPI wrappers return a bunch of garbage args. - Drop -O2 and everything that is not needed. - """ - result = [] - include_next = False - for f in args: - if f.startswith(('-L', '-l', '-Xlinker')) or f == '-pthread' \ - or (f.startswith('-W') and f != '-Wall' and not f.startswith('-Werror')): - result.append(f) - if f in ('-L', '-Xlinker'): - include_next = True - elif include_next: - include_next = False - result.append(f) - return result - - def _try_openmpi_wrapper(self, prog): - prog = ExternalProgram(prog, silent=True) - if prog.found(): - cmd = prog.get_command() + ['--showme:compile'] - p, o, e = mesonlib.Popen_safe(cmd) - p.wait() - if p.returncode != 0: - mlog.debug('Command', mlog.bold(cmd), 'failed to run:') - mlog.debug(mlog.bold('Standard output\n'), o) - mlog.debug(mlog.bold('Standard error\n'), e) - return - cargs = split_args(o) - - cmd = prog.get_command() + ['--showme:link'] - p, o, e = mesonlib.Popen_safe(cmd) - p.wait() - if p.returncode != 0: - mlog.debug('Command', mlog.bold(cmd), 'failed to run:') - mlog.debug(mlog.bold('Standard output\n'), o) - mlog.debug(mlog.bold('Standard error\n'), e) - return - libs = split_args(o) - - cmd = prog.get_command() + ['--showme:version'] - p, o, e = mesonlib.Popen_safe(cmd) - p.wait() - if p.returncode != 0: - mlog.debug('Command', mlog.bold(cmd), 'failed to run:') - mlog.debug(mlog.bold('Standard output\n'), o) - mlog.debug(mlog.bold('Standard error\n'), e) - return - version = re.search(r'\d+.\d+.\d+', o) - if version: - version = version.group(0) - else: - version = None - - return version, cargs, libs - - def _try_other_wrapper(self, prog): - prog = ExternalProgram(prog, silent=True) - if prog.found(): - cmd = prog.get_command() + ['-show'] - p, o, e = mesonlib.Popen_safe(cmd) - p.wait() - if p.returncode != 0: - mlog.debug('Command', mlog.bold(cmd), 'failed to run:') - mlog.debug(mlog.bold('Standard output\n'), o) - mlog.debug(mlog.bold('Standard error\n'), e) - return - args = split_args(o) - - version = None - - return version, args, args - - def _try_msmpi(self): - if self.language == 'cpp': - # MS-MPI does not support the C++ version of MPI, only the standard C API. - return - if 'MSMPI_INC' not in os.environ: - return - incdir = os.environ['MSMPI_INC'] - arch = detect_cpu_family(self.env.coredata.compilers.host) - if arch == 'x86': - if 'MSMPI_LIB32' not in os.environ: - return - libdir = os.environ['MSMPI_LIB32'] - post = 'x86' - elif arch == 'x86_64': - if 'MSMPI_LIB64' not in os.environ: - return - libdir = os.environ['MSMPI_LIB64'] - post = 'x64' - else: - return - if self.language == 'fortran': - return (None, - ['-I' + incdir, '-I' + os.path.join(incdir, post)], - [os.path.join(libdir, 'msmpi.lib'), os.path.join(libdir, 'msmpifec.lib')]) - else: - return (None, - ['-I' + incdir, '-I' + os.path.join(incdir, post)], - [os.path.join(libdir, 'msmpi.lib')]) - class OpenMPDependency(ExternalDependency): # Map date of specification release (which is the macro value) to a version. |