intel-oneapi-mkl: add cluster libs and option for static linking (#26256)

This commit is contained in:
Robert Cohn 2021-11-24 14:04:05 -05:00 committed by GitHub
parent dbf67d912c
commit 76ad803f25
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 73 additions and 7 deletions

View File

@ -99,7 +99,13 @@ def setup_run_environment(self, env):
class IntelOneApiLibraryPackage(IntelOneApiPackage):
"""Base class for Intel oneAPI library packages."""
"""Base class for Intel oneAPI library packages.
Contains some convenient default implementations for libraries.
Implement the method directly in the package if something
different is needed.
"""
@property
def headers(self):
@ -111,3 +117,36 @@ def libs(self):
lib_path = join_path(self.component_path, 'lib', 'intel64')
lib_path = lib_path if isdir(lib_path) else dirname(lib_path)
return find_libraries('*', root=lib_path, shared=True, recursive=True)
class IntelOneApiStaticLibraryList(object):
"""Provides ld_flags when static linking is needed
Oneapi puts static and dynamic libraries in the same directory, so
-l will default to finding the dynamic library. Use absolute
paths, as recommended by oneapi documentation.
Allow both static and dynamic libraries to be supplied by the
package.
"""
def __init__(self, static_libs, dynamic_libs):
self.static_libs = static_libs
self.dynamic_libs = dynamic_libs
@property
def directories(self):
return self.dynamic_libs.directories
@property
def search_flags(self):
return self.dynamic_libs.search_flags
@property
def link_flags(self):
return '-Wl,--start-group {0} -Wl,--end-group {1}'.format(
' '.join(self.static_libs.libraries), self.dynamic_libs.link_flags)
@property
def ld_flags(self):
return '{0} {1}'.format(self.search_flags, self.link_flags)

View File

@ -29,7 +29,11 @@
from spack.build_systems.maven import MavenPackage
from spack.build_systems.meson import MesonPackage
from spack.build_systems.octave import OctavePackage
from spack.build_systems.oneapi import IntelOneApiLibraryPackage, IntelOneApiPackage
from spack.build_systems.oneapi import (
IntelOneApiLibraryPackage,
IntelOneApiPackage,
IntelOneApiStaticLibraryList,
)
from spack.build_systems.perl import PerlPackage
from spack.build_systems.python import PythonPackage
from spack.build_systems.qmake import QMakePackage

View File

@ -34,13 +34,18 @@ class IntelOneapiMkl(IntelOneApiLibraryPackage):
sha256='818b6bd9a6c116f4578cda3151da0612ec9c3ce8b2c8a64730d625ce5b13cc0c',
expand=False)
variant('shared', default=True, description='Builds shared library')
variant('ilp64', default=False,
description='Build with ILP64 support')
variant('cluster', default=False,
description='Build with cluster support: scalapack, blacs, etc')
depends_on('intel-oneapi-tbb')
# cluster libraries need mpi
depends_on('mpi', when='+cluster')
provides('fftw-api@3')
provides('scalapack')
provides('scalapack', when='+cluster')
provides('mkl')
provides('lapack')
provides('blas')
@ -59,13 +64,31 @@ def headers(self):
include_path = join_path(self.component_path, 'include')
return find_headers('*', include_path)
# provide cluster libraries if +cluster variant is used or
# the scalapack virtual package was requested
def cluster(self):
return '+cluster' in self.spec
@property
def libs(self):
mkl_libs = [self.xlp64_lib('libmkl_intel'), 'libmkl_sequential', 'libmkl_core']
shared = '+shared' in self.spec
mkl_libs = []
if self.cluster():
mkl_libs += [self.xlp64_lib('libmkl_scalapack'),
'libmkl_cdft_core']
mkl_libs += [self.xlp64_lib('libmkl_intel'),
'libmkl_sequential',
'libmkl_core']
if self.cluster():
mkl_libs += [self.xlp64_lib('libmkl_blacs_intelmpi')]
libs = find_libraries(mkl_libs,
join_path(self.component_path, 'lib', 'intel64'))
libs += find_system_libraries(['libpthread', 'libm', 'libdl'])
return libs
join_path(self.component_path, 'lib', 'intel64'),
shared=shared)
system_libs = find_system_libraries(['libpthread', 'libm', 'libdl'])
if shared:
return libs + system_libs
else:
return IntelOneApiStaticLibraryList(libs, system_libs)
def setup_dependent_build_environment(self, env, dependent_spec):
env.set('MKLROOT', self.component_path)