diff options
| author | Lisandro Dalcin <dalcinl@gmail.com> | 2025-12-11 09:14:00 +0300 |
|---|---|---|
| committer | Dylan Baker <dylan@pnwbakers.com> | 2025-12-11 09:29:19 -0800 |
| commit | bfa96def243340841c1752bb63eeb4add92fe25a (patch) | |
| tree | 5a49d33313d1d7f52840324a3279e731c1b6e74b /mesonbuild | |
| parent | bc61d5c161146aade9be90a09a3655cc7999749a (diff) | |
| download | meson-bfa96def243340841c1752bb63eeb4add92fe25a.tar.gz | |
MPI detection: support Intel MPI on Windows
Co-authored-by: Dylan Baker <dylan@pnwbakers.com>
Diffstat (limited to 'mesonbuild')
| -rw-r--r-- | mesonbuild/dependencies/mpi.py | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/mesonbuild/dependencies/mpi.py b/mesonbuild/dependencies/mpi.py index 9c364b2f4..8a0ac0a9c 100644 --- a/mesonbuild/dependencies/mpi.py +++ b/mesonbuild/dependencies/mpi.py @@ -83,6 +83,8 @@ def mpi_factory(env: 'Environment', if DependencyMethods.SYSTEM in methods and env.machines[for_machine].is_windows(): candidates.append(functools.partial( MSMPIDependency, 'msmpi', env, kwargs, language=language)) + candidates.append(functools.partial( + IMPIDependency, 'impi', env, kwargs, language=language)) # Only OpenMPI has pkg-config, and it doesn't work with the intel compilers # for MPI, environment variables and commands like mpicc should have priority @@ -245,3 +247,51 @@ class MSMPIDependency(SystemDependency): self.compile_args = ['-I' + incdir, '-I' + os.path.join(incdir, post)] if self.language == 'fortran': self.link_args.append('-l' + os.path.join(libdir, 'msmpifec')) + + +class IMPIDependency(SystemDependency): + + """Intel(R) MPI for Windows.""" + + def __init__(self, name: str, env: Environment, kwargs: DependencyObjectKWs, + language: T.Optional[str] = None): + super().__init__(name, env, kwargs, language=language) + # only for windows + if not self.env.machines[self.for_machine].is_windows(): + return + # only for x86_64 + if self.env.machines[self.for_machine].cpu_family != 'x86_64': + return + + rootdir = os.environ.get('I_MPI_ROOT') + if rootdir is None: + self.is_found = False + return + + incdir = os.path.join(rootdir, 'include') + libdir = os.path.join(rootdir, 'lib') + + debug = env.coredata.optstore.get_value_for('debug') + assert isinstance(debug, bool) + libdir_post = 'debug' if debug else 'release' + for subdirs in (['mpi', libdir_post], [libdir_post]): + libdir_buildtype = os.path.join(libdir, *subdirs) + if os.path.isdir(libdir_buildtype): + libdir = libdir_buildtype + break + + found_header = os.path.isfile(os.path.join(incdir, 'mpi.h')) + found_library = os.path.isfile(os.path.join(libdir, 'impi.lib')) + if not found_header or not found_library: + self.is_found = False + return + + self.is_found = True + self.compile_args = ['-I' + incdir] + self.link_args = ['-l' + os.path.join(libdir, 'impi')] + if self.language == 'cpp': + # Some installations do not have the MPI C++ bindings library + if not os.path.isfile(os.path.join(libdir, 'impicxx.lib')): + self.is_found = False + return + self.link_args = ['-l' + os.path.join(libdir, 'impicxx')] |
