From 12cf4eb7347acadede98314d88d3a807520603ca Mon Sep 17 00:00:00 2001 From: Jon Rood Date: Thu, 10 Jan 2019 10:14:24 -0700 Subject: Explicitly listing blas and lapack sections in site.cfg for numpy (#8708) * Explicitly listing blas and lapack sections in site.cfg for numpy when using netlib-lapack so that scipy can find them as well. * Reducing code to use a function call instead of copying and pasting. * Fixing flake8 errors. * Fixing python 3.6 error when site.cfg lists library_dirs multiple times. * Formatting. * Verifying blas and lapack are enabled before writing to site.cfg. * Fixing flake8 errors. * Fixing conflicts since this package file has been updated. * Fixing flake8 stuff. * Handling blas and lapack variants for netlib-lapack in site.cfg for py-numpy. * Don't write netlib-lapack site.cfg file if no blas or lapack variants enabled in py-numpy. * Removing redundant if statement. * Fixing mistake in py-numpy site.cfg generation. * Separating blas and lapack further in site.cfg for netlib-lapack in py-numpy. --- .../repos/builtin/packages/py-numpy/package.py | 54 ++++++++++++++++------ 1 file changed, 40 insertions(+), 14 deletions(-) (limited to 'var') diff --git a/var/spack/repos/builtin/packages/py-numpy/package.py b/var/spack/repos/builtin/packages/py-numpy/package.py index ffb045790b..aba417c54b 100644 --- a/var/spack/repos/builtin/packages/py-numpy/package.py +++ b/var/spack/repos/builtin/packages/py-numpy/package.py @@ -66,13 +66,25 @@ class PyNumpy(PythonPackage): def patch(self): spec = self.spec + + def write_library_dirs(f, dirs): + f.write('library_dirs=%s\n' % dirs) + if not ((platform.system() == "Darwin") and + (platform.mac_ver()[0] == '10.12')): + f.write('rpath=%s\n' % dirs) + # for build notes see http://www.scipy.org/scipylib/building/linux.html - lapackblas = LibraryList('') + blas_info = [] + lapack_info = [] + lapackblas_info = [] + if '+lapack' in spec: - lapackblas += spec['lapack'].libs + lapack_info += spec['lapack'].libs if '+blas' in spec: - lapackblas += spec['blas'].libs + blas_info += spec['blas'].libs + + lapackblas_info = lapack_info + blas_info if '+blas' in spec or '+lapack' in spec: # note that one should not use [blas_opt] and [lapack_opt], see @@ -80,14 +92,19 @@ class PyNumpy(PythonPackage): with open('site.cfg', 'w') as f: # Unfortunately, numpy prefers to provide each BLAS/LAPACK # differently. - names = ','.join(lapackblas.names) - dirs = ':'.join(lapackblas.directories) + blas_names = ','.join(blas_info.names) + blas_dirs = ':'.join(blas_info.directories) + lapack_names = ','.join(lapack_info.names) + lapack_dirs = ':'.join(lapack_info.directories) + lapackblas_names = ','.join(lapackblas_info.names) + lapackblas_dirs = ':'.join(lapackblas_info.directories) # Special treatment for some (!) BLAS/LAPACK. Note that # in this case library_dirs can not be specified within [ALL]. if '^openblas' in spec: f.write('[openblas]\n') - f.write('libraries=%s\n' % names) + f.write('libraries=%s\n' % lapackblas_names) + write_library_dirs(f, lapackblas_dirs) elif '^mkl' in spec: # numpy does not expect system libraries needed for MKL # here. @@ -105,10 +122,23 @@ class PyNumpy(PythonPackage): # perspective it is no different from throwing away RPATH's # and using LD_LIBRARY_PATH throughout Spack. f.write('[mkl]\n') - f.write('mkl_libs=%s\n' % 'mkl_rt') + f.write('mkl_libs=%s\n' % 'mkl_rt') + write_library_dirs(f, lapackblas_dirs) elif '^atlas' in spec: f.write('[atlas]\n') - f.write('atlas_libs=%s\n' % names) + f.write('atlas_libs=%s\n' % lapackblas_names) + write_library_dirs(f, lapackblas_dirs) + elif '^netlib-lapack' in spec: + # netlib requires blas and lapack listed + # separately so that scipy can find them + if spec.satisfies('+blas'): + f.write('[blas]\n') + f.write('blas_libs=%s\n' % blas_names) + write_library_dirs(f, blas_dirs) + if spec.satisfies('+lapack'): + f.write('[lapack]\n') + f.write('lapack_libs=%s\n' % lapack_names) + write_library_dirs(f, lapack_dirs) else: # The section title for the defaults changed in @1.10, see # https://github.com/numpy/numpy/blob/master/site.cfg.example @@ -116,12 +146,8 @@ class PyNumpy(PythonPackage): f.write('[DEFAULT]\n') else: f.write('[ALL]\n') - f.write('libraries=%s\n' % names) - - f.write('library_dirs=%s\n' % dirs) - if not ((platform.system() == "Darwin") and - (platform.mac_ver()[0] == '10.12')): - f.write('rpath=%s\n' % dirs) + f.write('libraries=%s\n' % lapackblas_names) + write_library_dirs(f, lapackblas_dirs) def build_args(self, spec, prefix): args = [] -- cgit v1.2.3-60-g2f50