hypre: add version 2.22.1; add fortran variant; becomes AutotoolsPackage (#25781)

This commit is contained in:
Olivier Cessenat 2021-10-01 20:31:24 +02:00 committed by GitHub
parent da171bd561
commit df590bb6ee
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -9,7 +9,7 @@
from spack import * from spack import *
class Hypre(Package, CudaPackage): class Hypre(AutotoolsPackage, CudaPackage):
"""Hypre is a library of high performance preconditioners that """Hypre is a library of high performance preconditioners that
features parallel multigrid methods for both structured and features parallel multigrid methods for both structured and
unstructured grid problems.""" unstructured grid problems."""
@ -26,6 +26,7 @@ class Hypre(Package, CudaPackage):
test_requires_compiler = True test_requires_compiler = True
version('develop', branch='master') version('develop', branch='master')
version('2.22.1', sha256='c1e7761b907c2ee0098091b69797e9be977bff8b7fd0479dc20cad42f45c4084')
version('2.22.0', sha256='2c786eb5d3e722d8d7b40254f138bef4565b2d4724041e56a8fa073bda5cfbb5') version('2.22.0', sha256='2c786eb5d3e722d8d7b40254f138bef4565b2d4724041e56a8fa073bda5cfbb5')
version('2.21.0', sha256='e380f914fe7efe22afc44cdf553255410dc8a02a15b2e5ebd279ba88817feaf5') version('2.21.0', sha256='e380f914fe7efe22afc44cdf553255410dc8a02a15b2e5ebd279ba88817feaf5')
version('2.20.0', sha256='5be77b28ddf945c92cde4b52a272d16fb5e9a7dc05e714fc5765948cba802c01') version('2.20.0', sha256='5be77b28ddf945c92cde4b52a272d16fb5e9a7dc05e714fc5765948cba802c01')
@ -66,6 +67,8 @@ class Hypre(Package, CudaPackage):
variant('debug', default=False, variant('debug', default=False,
description='Build debug instead of optimized version') description='Build debug instead of optimized version')
variant('unified-memory', default=False, description='Use unified memory') variant('unified-memory', default=False, description='Use unified memory')
variant('fortran', default=True,
description='Enables fortran bindings')
# Patch to add ppc64le in config.guess # Patch to add ppc64le in config.guess
patch('ibm-ppc64le.patch', when='@:2.11.1') patch('ibm-ppc64le.patch', when='@:2.11.1')
@ -101,6 +104,8 @@ class Hypre(Package, CudaPackage):
# Option added in v2.16.0 # Option added in v2.16.0
conflicts('+mixedint', when='@:2.15.99') conflicts('+mixedint', when='@:2.15.99')
configure_directory = 'src'
def url_for_version(self, version): def url_for_version(self, version):
if version >= Version('2.12.0'): if version >= Version('2.12.0'):
url = 'https://github.com/hypre-space/hypre/archive/v{0}.tar.gz' url = 'https://github.com/hypre-space/hypre/archive/v{0}.tar.gz'
@ -109,7 +114,7 @@ def url_for_version(self, version):
return url.format(version) return url.format(version)
def _configure_args(self): def configure_args(self):
spec = self.spec spec = self.spec
# Note: --with-(lapack|blas)_libs= needs space separated list of names # Note: --with-(lapack|blas)_libs= needs space separated list of names
lapack = spec['lapack'].libs lapack = spec['lapack'].libs
@ -123,98 +128,98 @@ def _configure_args(self):
'--with-blas-lib-dirs=%s' % ' '.join(blas.directories) '--with-blas-lib-dirs=%s' % ' '.join(blas.directories)
] ]
if '+mpi' in self.spec: if '+mpi' in spec:
os.environ['CC'] = spec['mpi'].mpicc os.environ['CC'] = spec['mpi'].mpicc
os.environ['CXX'] = spec['mpi'].mpicxx os.environ['CXX'] = spec['mpi'].mpicxx
os.environ['F77'] = spec['mpi'].mpif77 if '+fortran' in spec:
os.environ['F77'] = spec['mpi'].mpif77
configure_args.append('--with-MPI') configure_args.append('--with-MPI')
else: else:
configure_args.append('--without-MPI') configure_args.append('--without-MPI')
if '+openmp' in self.spec: configure_args.extend(self.with_or_without('openmp'))
configure_args.append('--with-openmp')
else:
configure_args.append('--without-openmp')
if '+int64' in self.spec: if '+int64' in spec:
configure_args.append('--enable-bigint') configure_args.append('--enable-bigint')
else: else:
configure_args.append('--disable-bigint') configure_args.append('--disable-bigint')
if '+mixedint' in self.spec: configure_args.extend(self.enable_or_disable('mixedint'))
configure_args.append('--enable-mixedint')
else:
configure_args.append('--disable-mixedint')
if '+complex' in self.spec: configure_args.extend(self.enable_or_disable('complex'))
configure_args.append('--enable-complex')
else:
configure_args.append('--disable-complex')
if '+shared' in self.spec: if '+shared' in spec:
configure_args.append("--enable-shared") configure_args.append("--enable-shared")
if '~internal-superlu' in self.spec: if '~internal-superlu' in spec:
configure_args.append("--without-superlu") configure_args.append("--without-superlu")
# MLI and FEI do not build without superlu on Linux # MLI and FEI do not build without superlu on Linux
configure_args.append("--without-mli") configure_args.append("--without-mli")
configure_args.append("--without-fei") configure_args.append("--without-fei")
if '+superlu-dist' in self.spec: if '+superlu-dist' in spec:
configure_args.append('--with-dsuperlu-include=%s' % configure_args.append('--with-dsuperlu-include=%s' %
spec['superlu-dist'].prefix.include) spec['superlu-dist'].prefix.include)
configure_args.append('--with-dsuperlu-lib=%s' % configure_args.append('--with-dsuperlu-lib=%s' %
spec['superlu-dist'].libs) spec['superlu-dist'].libs)
configure_args.append('--with-dsuperlu') configure_args.append('--with-dsuperlu')
if '+debug' in self.spec: configure_args.extend(self.enable_or_disable('debug'))
configure_args.append("--enable-debug")
else:
configure_args.append("--disable-debug")
if '+cuda' in self.spec: if '+cuda' in spec:
configure_args.extend([ configure_args.extend([
'--with-cuda', '--with-cuda',
'--enable-curand', '--enable-curand',
'--enable-cub'
]) ])
# New in 2.21.0: replaces --enable-cub
if '@2.21.0:' in spec:
configure_args.append('--enable-device-memory-pool')
configure_args.append('--with-cuda-home={0}'.format(
spec['cuda'].prefix))
else:
configure_args.append('--enable-cub')
else: else:
configure_args.extend([ configure_args.extend([
'--without-cuda', '--without-cuda',
'--disable-curand', '--disable-curand',
'--disable-cub'
]) ])
if '@:2.20.99' in spec:
configure_args.append('--disable-cub')
if '+unified-memory' in self.spec: if '+unified-memory' in spec:
configure_args.append('--enable-unified-memory') configure_args.append('--enable-unified-memory')
configure_args.extend(self.enable_or_disable('fortran'))
return configure_args return configure_args
def setup_build_environment(self, env): def setup_build_environment(self, env):
if '+mpi' in self.spec: spec = self.spec
env.set('CC', self.spec['mpi'].mpicc) if '+mpi' in spec:
env.set('CXX', self.spec['mpi'].mpicxx) env.set('CC', spec['mpi'].mpicc)
env.set('F77', self.spec['mpi'].mpif77) env.set('CXX', spec['mpi'].mpicxx)
if '+fortran' in spec:
env.set('F77', spec['mpi'].mpif77)
if '+cuda' in self.spec: if '+cuda' in spec:
env.set('CUDA_HOME', self.spec['cuda'].prefix) env.set('CUDA_HOME', spec['cuda'].prefix)
env.set('CUDA_PATH', self.spec['cuda'].prefix) env.set('CUDA_PATH', spec['cuda'].prefix)
cuda_arch = self.spec.variants['cuda_arch'].value cuda_arch = spec.variants['cuda_arch'].value
if cuda_arch: if cuda_arch:
arch_sorted = list(sorted(cuda_arch, reverse=True)) arch_sorted = list(sorted(cuda_arch, reverse=True))
env.set('HYPRE_CUDA_SM', arch_sorted[0]) env.set('HYPRE_CUDA_SM', arch_sorted[0])
# In CUDA builds hypre currently doesn't handle flags correctly # In CUDA builds hypre currently doesn't handle flags correctly
env.append_flags( env.append_flags(
'CXXFLAGS', '-O2' if '~debug' in self.spec else '-g') 'CXXFLAGS', '-O2' if '~debug' in spec else '-g')
def build(self, spec, prefix):
with working_dir("src"):
make()
def install(self, spec, prefix): def install(self, spec, prefix):
configure_args = self._configure_args()
# Hypre's source is staged under ./src so we'll have to manually # Hypre's source is staged under ./src so we'll have to manually
# cd into it. # cd into it.
with working_dir("src"): with working_dir("src"):
configure(*configure_args)
make()
if self.run_tests: if self.run_tests:
make("check") make("check")
make("test") make("test")