From 93c16f1ee377606fa232ceb3141cc1be32dbfeba Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Wed, 29 Jun 2022 11:55:24 -0700 Subject: PythonPackage: add default libs/headers attributes (#28527) * PythonPackage: add default libs/headers attributes * Style fix * libs and headers should be properties * Check both platlib and include * Fix variable reference --- lib/spack/spack/build_systems/python.py | 34 ++++++++++++++++++++++ .../repos/builtin/packages/py-mpi4py/package.py | 5 ---- .../repos/builtin/packages/py-torch/package.py | 18 ------------ 3 files changed, 34 insertions(+), 23 deletions(-) diff --git a/lib/spack/spack/build_systems/python.py b/lib/spack/spack/build_systems/python.py index d72b9c5a8d..3eec9d5d3b 100644 --- a/lib/spack/spack/build_systems/python.py +++ b/lib/spack/spack/build_systems/python.py @@ -12,6 +12,8 @@ import llnl.util.tty as tty from llnl.util.filesystem import ( filter_file, find, + find_all_headers, + find_libraries, is_nonsymlink_exe_with_shebang, path_contains_subdirectory, same_path, @@ -20,6 +22,7 @@ from llnl.util.filesystem import ( from llnl.util.lang import match_predicate from spack.directives import depends_on, extends +from spack.error import NoHeadersError, NoLibrariesError from spack.package_base import PackageBase, run_after @@ -178,6 +181,37 @@ class PythonPackage(PackageBase): with working_dir(self.build_directory): pip(*args) + @property + def headers(self): + """Discover header files in platlib.""" + + # Headers may be in either location + include = inspect.getmodule(self).include + platlib = inspect.getmodule(self).platlib + headers = find_all_headers(include) + find_all_headers(platlib) + + if headers: + return headers + + msg = 'Unable to locate {} headers in {} or {}' + raise NoHeadersError(msg.format(self.spec.name, include, platlib)) + + @property + def libs(self): + """Discover libraries in platlib.""" + + # Remove py- prefix in package name + library = 'lib' + self.spec.name[3:].replace('-', '?') + root = inspect.getmodule(self).platlib + + for shared in [True, False]: + libs = find_libraries(library, root, shared=shared, recursive=True) + if libs: + return libs + + msg = 'Unable to recursively locate {} libraries in {}' + raise NoLibrariesError(msg.format(self.spec.name, root)) + # Testing def test(self): diff --git a/var/spack/repos/builtin/packages/py-mpi4py/package.py b/var/spack/repos/builtin/packages/py-mpi4py/package.py index ff0f29a540..966d6dc461 100644 --- a/var/spack/repos/builtin/packages/py-mpi4py/package.py +++ b/var/spack/repos/builtin/packages/py-mpi4py/package.py @@ -35,8 +35,3 @@ class PyMpi4py(PythonPackage): @when('@3.1:') def install_options(self, spec, prefix): return ['--mpicc=%s -shared' % spec['mpi'].mpicc] - - @property - def headers(self): - headers = find_all_headers(self.prefix.lib) - return headers diff --git a/var/spack/repos/builtin/packages/py-torch/package.py b/var/spack/repos/builtin/packages/py-torch/package.py index cbefcde583..c1737b0f1f 100644 --- a/var/spack/repos/builtin/packages/py-torch/package.py +++ b/var/spack/repos/builtin/packages/py-torch/package.py @@ -269,24 +269,6 @@ class PyTorch(PythonPackage, CudaPackage): patch('https://github.com/pytorch/pytorch/commit/c74c0c571880df886474be297c556562e95c00e0.patch?full_index=1', sha256='8ff7d285e52e4718bad1ca01ceb3bb6471d7828329036bb94222717fcaa237da', when='@:1.9.1 ^cuda@11.4.100:') - @property - def libs(self): - # TODO: why doesn't `python_platlib` work here? - root = join_path( - self.prefix, self.spec['python'].package.platlib, 'torch', 'lib' - ) - return find_libraries('libtorch', root) - - @property - def headers(self): - # TODO: why doesn't `python_platlib` work here? - root = join_path( - self.prefix, self.spec['python'].package.platlib, 'torch', 'include' - ) - headers = find_all_headers(root) - headers.directories = [root] - return headers - @when('@1.5.0:') def patch(self): # https://github.com/pytorch/pytorch/issues/52208 -- cgit v1.2.3-70-g09d2