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
This commit is contained in:
Adam J. Stewart
2022-06-29 11:55:24 -07:00
committed by GitHub
parent 7bacde16e4
commit 93c16f1ee3
3 changed files with 34 additions and 23 deletions

View File

@@ -12,6 +12,8 @@
from llnl.util.filesystem import ( from llnl.util.filesystem import (
filter_file, filter_file,
find, find,
find_all_headers,
find_libraries,
is_nonsymlink_exe_with_shebang, is_nonsymlink_exe_with_shebang,
path_contains_subdirectory, path_contains_subdirectory,
same_path, same_path,
@@ -20,6 +22,7 @@
from llnl.util.lang import match_predicate from llnl.util.lang import match_predicate
from spack.directives import depends_on, extends from spack.directives import depends_on, extends
from spack.error import NoHeadersError, NoLibrariesError
from spack.package_base import PackageBase, run_after from spack.package_base import PackageBase, run_after
@@ -178,6 +181,37 @@ def install(self, spec, prefix):
with working_dir(self.build_directory): with working_dir(self.build_directory):
pip(*args) 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 # Testing
def test(self): def test(self):

View File

@@ -35,8 +35,3 @@ class PyMpi4py(PythonPackage):
@when('@3.1:') @when('@3.1:')
def install_options(self, spec, prefix): def install_options(self, spec, prefix):
return ['--mpicc=%s -shared' % spec['mpi'].mpicc] return ['--mpicc=%s -shared' % spec['mpi'].mpicc]
@property
def headers(self):
headers = find_all_headers(self.prefix.lib)
return headers

View File

@@ -269,24 +269,6 @@ class PyTorch(PythonPackage, CudaPackage):
patch('https://github.com/pytorch/pytorch/commit/c74c0c571880df886474be297c556562e95c00e0.patch?full_index=1', patch('https://github.com/pytorch/pytorch/commit/c74c0c571880df886474be297c556562e95c00e0.patch?full_index=1',
sha256='8ff7d285e52e4718bad1ca01ceb3bb6471d7828329036bb94222717fcaa237da', when='@:1.9.1 ^cuda@11.4.100:') 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:') @when('@1.5.0:')
def patch(self): def patch(self):
# https://github.com/pytorch/pytorch/issues/52208 # https://github.com/pytorch/pytorch/issues/52208