Intel mpi: allow use of external libfabric (#27292)

Intel mpi comes with an installation of libfabric (which it needs as a
dependency). It can use other implementations of libfabric at runtime
though, so if you install a package that depends on `mpi` and
`libfabric`, you can specify `intel-mpi+external-libfabric` and ensure
that the Spack-built instance is used (both by `intel-mpi` and the
root).

Apply analogous change to intel-oneapi-mpi.
This commit is contained in:
Robert Cohn
2021-11-16 15:55:24 -05:00
committed by GitHub
parent b194b957ce
commit 67cba372e8
3 changed files with 23 additions and 19 deletions

View File

@@ -59,6 +59,9 @@ class IntelMpi(IntelPackage):
provides('mpi')
variant('external-libfabric', default=False, description='Enable external libfabric dependency')
depends_on('libfabric', when='+external-libfabric', type=('build', 'link', 'run'))
def setup_dependent_build_environment(self, *args):
# Handle in callback, conveying client's compilers in additional arg.
# CAUTION - DUP code in:

View File

@@ -4,9 +4,7 @@
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import glob
import platform
import subprocess
from spack import *
@@ -38,11 +36,11 @@ class IntelOneapiMpi(IntelOneApiLibraryPackage):
variant('ilp64', default=False,
description='Build with ILP64 support')
variant('external-libfabric', default=False, description='Enable external libfabric dependency')
depends_on('libfabric', when='+external-libfabric', type=('link', 'run'))
provides('mpi@:3.1')
depends_on('patchelf', type='build')
@property
def component_dir(self):
return 'mpi'
@@ -87,17 +85,19 @@ def libs(self):
libs += find_libraries(['libmpicxx', 'libmpifort'], lib_dir)
libs += find_libraries('libmpi', release_lib_dir)
libs += find_system_libraries(['libdl', 'librt', 'libpthread'])
# Find libfabric for libmpi.so
if '+external-libfabric' in self.spec:
libs += self.spec['libfabric'].libs
else:
libs += find_libraries(['libfabric'],
join_path(self.component_path, 'libfabric', 'lib'))
return libs
def install(self, spec, prefix):
super(IntelOneapiMpi, self).install(spec, prefix)
# Patch libmpi.so rpath so it can find libfabric
libfabric_rpath = join_path(self.component_path, 'libfabric', 'lib')
for libmpi in glob.glob(join_path(self.component_path,
'lib', '**', 'libmpi*.so')):
subprocess.call(['patchelf', '--set-rpath', libfabric_rpath, libmpi])
# When spack builds from source
# fix I_MPI_SUBSTITUTE_INSTALLDIR and
# __EXEC_PREFIX_TO_BE_FILLED_AT_INSTALL_TIME__