summaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
authorLisandro Dalcin <dalcinl@gmail.com>2025-12-11 09:14:00 +0300
committerDylan Baker <dylan@pnwbakers.com>2025-12-11 09:29:19 -0800
commitbfa96def243340841c1752bb63eeb4add92fe25a (patch)
tree5a49d33313d1d7f52840324a3279e731c1b6e74b /mesonbuild
parentbc61d5c161146aade9be90a09a3655cc7999749a (diff)
downloadmeson-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.py50
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')]