Make 'netlib-lapack' a CMakePackage. (#8661)

* Make 'netlib-lapack' a CMakePackage.

* Add a comment.

* Some refactoring.
This commit is contained in:
Sergey Kosukhin 2018-07-09 20:21:55 +02:00 committed by Adam J. Stewart
parent 25c9a5216f
commit 8770957b7a

View File

@ -25,7 +25,7 @@
from spack import * from spack import *
class NetlibLapack(Package): class NetlibLapack(CMakePackage):
"""LAPACK version 3.X is a comprehensive FORTRAN library that does """LAPACK version 3.X is a comprehensive FORTRAN library that does
linear algebra operations including matrix inversions, least squared linear algebra operations including matrix inversions, least squared
solutions to linear sets of equations, eigenvector analysis, singular solutions to linear sets of equations, eigenvector analysis, singular
@ -48,8 +48,6 @@ class NetlibLapack(Package):
version('3.4.0', '02d5706ec03ba885fc246e5fa10d8c70') version('3.4.0', '02d5706ec03ba885fc246e5fa10d8c70')
version('3.3.1', 'd0d533ec9a5b74933c2a1e84eedc58b4') version('3.3.1', 'd0d533ec9a5b74933c2a1e84eedc58b4')
variant('debug', default=False,
description='Activates the Debug build type')
variant('shared', default=True, description="Build shared library version") variant('shared', default=True, description="Build shared library version")
variant('external-blas', default=False, variant('external-blas', default=False,
description='Build lapack with an external blas') description='Build lapack with an external blas')
@ -66,9 +64,21 @@ class NetlibLapack(Package):
provides('blas', when='~external-blas') provides('blas', when='~external-blas')
provides('lapack') provides('lapack')
depends_on('cmake', type='build')
depends_on('blas', when='+external-blas') depends_on('blas', when='+external-blas')
depends_on('netlib-xblas+fortran+plain_blas', when='+xblas') depends_on('netlib-xblas+fortran+plain_blas', when='+xblas')
depends_on('python@2.7:', type='test')
# We need to run every phase twice in order to get static and shared
# versions of the libraries. When ~shared, we run the default
# implementations of the CMakePackage's phases and get only one building
# directory 'spack-build-static' with -DBUILD_SHARED_LIBS:BOOL=OFF (see
# implementations of self.build_directory and self.cmake_args() below).
# When +shared, we run the overridden methods for the phases, each
# running the default implementation twice with different values for
# self._building_shared. As a result, we get two building directories:
# 'spack-build-static' with -DBUILD_SHARED_LIBS:BOOL=OFF and
# 'spack-build-shared' with -DBUILD_SHARED_LIBS:BOOL=ON.
_building_shared = False
def patch(self): def patch(self):
# Fix cblas CMakeLists.txt -- has wrong case for subdirectory name. # Fix cblas CMakeLists.txt -- has wrong case for subdirectory name.
@ -131,61 +141,73 @@ def headers(self):
lapacke_h = join_path(include_dir, 'lapacke.h') lapacke_h = join_path(include_dir, 'lapacke.h')
return HeaderList([cblas_h, lapacke_h]) return HeaderList([cblas_h, lapacke_h])
def install_one(self, spec, prefix, shared): @property
cmake_args = [ def build_directory(self):
'-DBUILD_SHARED_LIBS:BOOL=%s' % ('ON' if shared else 'OFF'), return join_path(self.stage.source_path,
'-DCMAKE_BUILD_TYPE:STRING=%s' % ( 'spack-build-shared' if self._building_shared
'Debug' if '+debug' in spec else 'Release'), else 'spack-build-static')
'-DLAPACKE:BOOL=%s' % (
'ON' if '+lapacke' in spec else 'OFF'),
'-DLAPACKE_WITH_TMG:BOOL=%s' % (
'ON' if '+lapacke' in spec else 'OFF')]
if spec.satisfies('@3.6.0:'):
cmake_args.extend(['-DCBLAS=ON']) # always build CBLAS
if self.compiler.name == 'intel': def cmake_args(self):
args = ['-DBUILD_SHARED_LIBS:BOOL=' +
('ON' if self._building_shared else 'OFF')]
if self.spec.satisfies('+lapacke'):
args.extend(['-DLAPACKE:BOOL=ON', '-DLAPACKE_WITH_TMG:BOOL=ON'])
else:
args.extend(['-DLAPACKE:BOOL=OFF', '-DLAPACKE_WITH_TMG:BOOL=OFF'])
if self.spec.satisfies('@3.6.0:'):
args.append('-DCBLAS=ON') # always build CBLAS
if self.spec.satisfies('%intel'):
# Intel compiler finds serious syntax issues when trying to # Intel compiler finds serious syntax issues when trying to
# build CBLAS and LapackE # build CBLAS and LapackE
cmake_args.extend(['-DCBLAS=OFF']) args.extend(['-DCBLAS=OFF', '-DLAPACKE:BOOL=OFF'])
cmake_args.extend(['-DLAPACKE:BOOL=OFF'])
if self.compiler.name == 'xl' or self.compiler.name == 'xl_r': if self.spec.satisfies('%xl') or self.spec.satisfies('%xl_r'):
# use F77 compiler if IBM XL # use F77 compiler if IBM XL
cmake_args.extend([ args.extend(['-DCMAKE_Fortran_COMPILER=' + self.compiler.f77,
'-DCMAKE_Fortran_COMPILER=%s' % self.compiler.f77, '-DCMAKE_Fortran_FLAGS=' +
'-DCMAKE_Fortran_FLAGS=%s' % ( (' '.join(self.spec.compiler_flags['fflags']))])
' '.join(self.spec.compiler_flags['fflags'])),
])
# deprecated routines are commonly needed by, for example, suitesparse # deprecated routines are commonly needed by, for example, suitesparse
# Note that OpenBLAS spack is built with deprecated routines # Note that OpenBLAS spack is built with deprecated routines
cmake_args.extend(['-DBUILD_DEPRECATED:BOOL=ON']) args.append('-DBUILD_DEPRECATED:BOOL=ON')
if '+external-blas' in spec: if self.spec.satisfies('+external-blas'):
cmake_args.extend([ args.extend(['-DUSE_OPTIMIZED_BLAS:BOOL=ON',
'-DUSE_OPTIMIZED_BLAS:BOOL=ON', '-DBLAS_LIBRARIES:PATH=' +
'-DBLAS_LIBRARIES:PATH=%s' % spec['blas'].libs.joined(';') self.spec['blas'].libs.joined(';')])
])
if spec.satisfies('+xblas'): if self.spec.satisfies('+xblas'):
xblas_include_dir = spec['netlib-xblas'].prefix.include args.extend(['-DXBLAS_INCLUDE_DIR=' +
xblas_library = spec['netlib-xblas'].libs.joined(';') self.spec['netlib-xblas'].prefix.include,
cmake_args.extend([ '-DXBLAS_LIBRARY=' +
'-DXBLAS_INCLUDE_DIR={0}'.format(xblas_include_dir), self.spec['netlib-xblas'].libs.joined(';')])
'-DXBLAS_LIBRARY={0}'.format(xblas_library)])
cmake_args.extend(std_cmake_args) args.append('-DBUILD_TESTING:BOOL=' +
('ON' if self.run_tests else 'OFF'))
build_dir = 'spack-build' + ('-shared' if shared else '-static') return args
with working_dir(build_dir, create=True):
cmake('..', *cmake_args)
make()
make("install")
# Build, install, and check both static and shared versions of the
# libraries when +shared
@when('+shared')
def cmake(self, spec, prefix):
for self._building_shared in (False, True):
super(NetlibLapack, self).cmake(spec, prefix)
@when('+shared')
def build(self, spec, prefix):
for self._building_shared in (False, True):
super(NetlibLapack, self).build(spec, prefix)
@when('+shared')
def install(self, spec, prefix): def install(self, spec, prefix):
# Always build static libraries. for self._building_shared in (False, True):
self.install_one(spec, prefix, False) super(NetlibLapack, self).install(spec, prefix)
# Build shared libraries if requested. @when('+shared')
if '+shared' in spec: def check(self):
self.install_one(spec, prefix, True) for self._building_shared in (False, True):
super(NetlibLapack, self).check()