aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/dependencies/misc.py
diff options
context:
space:
mode:
authorMichael Hirsch, Ph.D <scivision@users.noreply.github.com>2019-11-20 17:03:28 -0500
committerJussi Pakkanen <jpakkane@gmail.com>2019-11-25 13:08:01 +0200
commit8313e8fd54c95459efbc413bb60d460cce10a12b (patch)
tree796951f452f27d8ebde669d6dc5a305aff91dd0f /mesonbuild/dependencies/misc.py
parent0241948d8fa37f59eb93088a26e9b7ae642cc2d0 (diff)
downloadmeson-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.py204
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.