Skip to content
Snippets Groups Projects
Commit 8770957b authored by Sergey Kosukhin's avatar Sergey Kosukhin Committed by Adam J. Stewart
Browse files

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

* Make 'netlib-lapack' a CMakePackage.

* Add a comment.

* Some refactoring.
parent 25c9a521
No related branches found
No related tags found
No related merge requests found
...@@ -25,7 +25,7 @@ ...@@ -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): ...@@ -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): ...@@ -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): ...@@ -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'), def cmake_args(self):
'-DLAPACKE_WITH_TMG:BOOL=%s' % ( args = ['-DBUILD_SHARED_LIBS:BOOL=' +
'ON' if '+lapacke' in spec else 'OFF')] ('ON' if self._building_shared else 'OFF')]
if spec.satisfies('@3.6.0:'):
cmake_args.extend(['-DCBLAS=ON']) # always build CBLAS if self.spec.satisfies('+lapacke'):
args.extend(['-DLAPACKE:BOOL=ON', '-DLAPACKE_WITH_TMG:BOOL=ON'])
if self.compiler.name == 'intel': 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 self.spec.satisfies('+external-blas'):
args.extend(['-DUSE_OPTIMIZED_BLAS:BOOL=ON',
'-DBLAS_LIBRARIES:PATH=' +
self.spec['blas'].libs.joined(';')])
if self.spec.satisfies('+xblas'):
args.extend(['-DXBLAS_INCLUDE_DIR=' +
self.spec['netlib-xblas'].prefix.include,
'-DXBLAS_LIBRARY=' +
self.spec['netlib-xblas'].libs.joined(';')])
if '+external-blas' in spec: args.append('-DBUILD_TESTING:BOOL=' +
cmake_args.extend([ ('ON' if self.run_tests else 'OFF'))
'-DUSE_OPTIMIZED_BLAS:BOOL=ON',
'-DBLAS_LIBRARIES:PATH=%s' % spec['blas'].libs.joined(';')
])
if spec.satisfies('+xblas'): return args
xblas_include_dir = spec['netlib-xblas'].prefix.include
xblas_library = spec['netlib-xblas'].libs.joined(';')
cmake_args.extend([
'-DXBLAS_INCLUDE_DIR={0}'.format(xblas_include_dir),
'-DXBLAS_LIBRARY={0}'.format(xblas_library)])
cmake_args.extend(std_cmake_args) # 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)
build_dir = 'spack-build' + ('-shared' if shared else '-static') @when('+shared')
with working_dir(build_dir, create=True): def build(self, spec, prefix):
cmake('..', *cmake_args) for self._building_shared in (False, True):
make() super(NetlibLapack, self).build(spec, prefix)
make("install")
@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()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment