intel-oneapi-mkl: add cluster libs and option for static linking (#26256)
This commit is contained in:
parent
dbf67d912c
commit
76ad803f25
@ -99,7 +99,13 @@ def setup_run_environment(self, env):
|
|||||||
|
|
||||||
|
|
||||||
class IntelOneApiLibraryPackage(IntelOneApiPackage):
|
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
|
@property
|
||||||
def headers(self):
|
def headers(self):
|
||||||
@ -111,3 +117,36 @@ def libs(self):
|
|||||||
lib_path = join_path(self.component_path, 'lib', 'intel64')
|
lib_path = join_path(self.component_path, 'lib', 'intel64')
|
||||||
lib_path = lib_path if isdir(lib_path) else dirname(lib_path)
|
lib_path = lib_path if isdir(lib_path) else dirname(lib_path)
|
||||||
return find_libraries('*', root=lib_path, shared=True, recursive=True)
|
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)
|
||||||
|
@ -29,7 +29,11 @@
|
|||||||
from spack.build_systems.maven import MavenPackage
|
from spack.build_systems.maven import MavenPackage
|
||||||
from spack.build_systems.meson import MesonPackage
|
from spack.build_systems.meson import MesonPackage
|
||||||
from spack.build_systems.octave import OctavePackage
|
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.perl import PerlPackage
|
||||||
from spack.build_systems.python import PythonPackage
|
from spack.build_systems.python import PythonPackage
|
||||||
from spack.build_systems.qmake import QMakePackage
|
from spack.build_systems.qmake import QMakePackage
|
||||||
|
@ -34,13 +34,18 @@ class IntelOneapiMkl(IntelOneApiLibraryPackage):
|
|||||||
sha256='818b6bd9a6c116f4578cda3151da0612ec9c3ce8b2c8a64730d625ce5b13cc0c',
|
sha256='818b6bd9a6c116f4578cda3151da0612ec9c3ce8b2c8a64730d625ce5b13cc0c',
|
||||||
expand=False)
|
expand=False)
|
||||||
|
|
||||||
|
variant('shared', default=True, description='Builds shared library')
|
||||||
variant('ilp64', default=False,
|
variant('ilp64', default=False,
|
||||||
description='Build with ILP64 support')
|
description='Build with ILP64 support')
|
||||||
|
variant('cluster', default=False,
|
||||||
|
description='Build with cluster support: scalapack, blacs, etc')
|
||||||
|
|
||||||
depends_on('intel-oneapi-tbb')
|
depends_on('intel-oneapi-tbb')
|
||||||
|
# cluster libraries need mpi
|
||||||
|
depends_on('mpi', when='+cluster')
|
||||||
|
|
||||||
provides('fftw-api@3')
|
provides('fftw-api@3')
|
||||||
provides('scalapack')
|
provides('scalapack', when='+cluster')
|
||||||
provides('mkl')
|
provides('mkl')
|
||||||
provides('lapack')
|
provides('lapack')
|
||||||
provides('blas')
|
provides('blas')
|
||||||
@ -59,13 +64,31 @@ def headers(self):
|
|||||||
include_path = join_path(self.component_path, 'include')
|
include_path = join_path(self.component_path, 'include')
|
||||||
return find_headers('*', include_path)
|
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
|
@property
|
||||||
def libs(self):
|
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,
|
libs = find_libraries(mkl_libs,
|
||||||
join_path(self.component_path, 'lib', 'intel64'))
|
join_path(self.component_path, 'lib', 'intel64'),
|
||||||
libs += find_system_libraries(['libpthread', 'libm', 'libdl'])
|
shared=shared)
|
||||||
return libs
|
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):
|
def setup_dependent_build_environment(self, env, dependent_spec):
|
||||||
env.set('MKLROOT', self.component_path)
|
env.set('MKLROOT', self.component_path)
|
||||||
|
Loading…
Reference in New Issue
Block a user