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:
		| @@ -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): | ||||||
|   | |||||||
| @@ -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 |  | ||||||
|   | |||||||
| @@ -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 | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Adam J. Stewart
					Adam J. Stewart