From 3a48f5f931a3ef7f8b984248ff1cc87868013b3f Mon Sep 17 00:00:00 2001 From: Robert Cohn Date: Fri, 24 Sep 2021 13:32:06 -0400 Subject: intel-oneapi-mpi/mkl packages: add ilp64 support (#26045) --- .../builtin/packages/intel-oneapi-mkl/package.py | 21 ++++++++++--- .../builtin/packages/intel-oneapi-mpi/package.py | 36 +++++++++++++++------- 2 files changed, 42 insertions(+), 15 deletions(-) (limited to 'var') diff --git a/var/spack/repos/builtin/packages/intel-oneapi-mkl/package.py b/var/spack/repos/builtin/packages/intel-oneapi-mkl/package.py index 6d9ee6dd91..1df2451588 100644 --- a/var/spack/repos/builtin/packages/intel-oneapi-mkl/package.py +++ b/var/spack/repos/builtin/packages/intel-oneapi-mkl/package.py @@ -30,6 +30,9 @@ class IntelOneapiMkl(IntelOneApiLibraryPackage): sha256='818b6bd9a6c116f4578cda3151da0612ec9c3ce8b2c8a64730d625ce5b13cc0c', expand=False) + variant('ilp64', default=False, + description='Build with ILP64 support') + depends_on('intel-oneapi-tbb') provides('fftw-api@3') @@ -42,10 +45,20 @@ class IntelOneapiMkl(IntelOneApiLibraryPackage): def component_dir(self): return 'mkl' + def xlp64_lib(self, lib): + return lib + ('_ilp64' + if '+ilp64' in self.spec + else '_lp64') + + @property + def headers(self): + include_path = join_path(self.component_path, 'include') + return find_headers('*', include_path) + @property def libs(self): - lib_path = join_path(self.component_path, 'lib', 'intel64') - mkl_libs = ['libmkl_intel_lp64', 'libmkl_sequential', 'libmkl_core'] - libs = find_libraries(mkl_libs, root=lib_path, shared=True, recursive=False) - libs += find_system_libraries(['libpthread', 'libm', 'libdl'], shared=True) + mkl_libs = [self.xlp64_lib('libmkl_intel'), 'libmkl_sequential', 'libmkl_core'] + libs = find_libraries(mkl_libs, + join_path(self.component_path, 'lib', 'intel64')) + libs += find_system_libraries(['libpthread', 'libm', 'libdl']) return libs diff --git a/var/spack/repos/builtin/packages/intel-oneapi-mpi/package.py b/var/spack/repos/builtin/packages/intel-oneapi-mpi/package.py index 05e1401842..4f712dcd3f 100644 --- a/var/spack/repos/builtin/packages/intel-oneapi-mpi/package.py +++ b/var/spack/repos/builtin/packages/intel-oneapi-mpi/package.py @@ -4,6 +4,7 @@ # SPDX-License-Identifier: (Apache-2.0 OR MIT) +import glob import platform import subprocess @@ -31,7 +32,10 @@ class IntelOneapiMpi(IntelOneApiLibraryPackage): sha256='8b7693a156c6fc6269637bef586a8fd3ea6610cac2aae4e7f48c1fbb601625fe', expand=False) - provides('mpi@:3') + variant('ilp64', default=False, + description='Build with ILP64 support') + + provides('mpi@:3.1') depends_on('patchelf', type='build') @@ -61,26 +65,36 @@ class IntelOneapiMpi(IntelOneApiLibraryPackage): env.set('MPIF90', join_path(dir, 'mpif90')) env.set('MPIFC', join_path(dir, 'mpifc')) + @property + def headers(self): + include_path = join_path(self.component_path, 'include') + headers = find_headers('*', include_path) + if '+ilp64' in self.spec: + headers += find_headers('*', join_path(include_path, 'ilp64')) + return headers + @property def libs(self): + lib_dir = join_path(self.component_path, 'lib') + release_lib_dir = join_path(lib_dir, 'release') libs = [] - for dir in [join_path('lib', 'release_mt'), - 'lib', - join_path('libfabric', 'lib')]: - lib_path = join_path(self.component_path, dir) - ldir = find_libraries('*', root=lib_path, shared=True, recursive=False) - libs += ldir + if '+ilp64' in self.spec: + libs += find_libraries('libmpi_ilp64', release_lib_dir) + libs += find_libraries(['libmpicxx', 'libmpifort'], lib_dir) + libs += find_libraries('libmpi', release_lib_dir) + libs += find_system_libraries(['libdl', 'librt', 'libpthread']) return libs def install(self, spec, prefix): super(IntelOneapiMpi, self).install(spec, prefix) - # need to patch libmpi.so so it can always find libfabric + # Patch libmpi.so rpath so it can find libfabric libfabric_rpath = join_path(self.component_path, 'libfabric', 'lib') - for lib_version in ['debug', 'release', 'release_mt', 'debug_mt']: - file = join_path(self.component_path, 'lib', lib_version, 'libmpi.so') - subprocess.call(['patchelf', '--set-rpath', libfabric_rpath, file]) + 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__ scripts = ["mpif77", "mpif90", "mpigcc", "mpigxx", "mpiicc", "mpiicpc", -- cgit v1.2.3-60-g2f50