python: extensions support for easy-install.pth

This commit is contained in:
Oliver Breitwieser 2017-09-14 16:23:38 -04:00 committed by scheibelp
parent d5a3d9d20e
commit 643a28aac5

View File

@ -496,6 +496,10 @@ def python_include_dir(self):
def site_packages_dir(self):
return join_path(self.python_lib_dir, 'site-packages')
@property
def easy_install_file(self):
return join_path(self.site_packages_dir, "easy-install.pth")
def setup_dependent_environment(self, spack_env, run_env, dependent_spec):
"""Set PYTHONPATH to include the site-packages directory for the
extension and any other python extensions it depends on."""
@ -577,11 +581,15 @@ def python_ignore(self, ext_pkg, args):
return match_predicate(ignore_arg, patterns)
def write_easy_install_pth(self, exts):
def write_easy_install_pth(self, exts, prefix=None):
if not prefix:
prefix = self.prefix
paths = []
unique_paths = set()
for ext in sorted(exts.values()):
ext_site_packages = join_path(ext.prefix, self.site_packages_dir)
easy_pth = join_path(ext_site_packages, "easy-install.pth")
easy_pth = join_path(ext.prefix, self.easy_install_file)
if not os.path.isfile(easy_pth):
continue
@ -599,10 +607,11 @@ def write_easy_install_pth(self, exts):
re.search(r'setuptools.*egg$', line)):
continue
paths.append(line)
if line not in unique_paths:
unique_paths.add(line)
paths.append(line)
site_packages = join_path(self.home, self.site_packages_dir)
main_pth = join_path(site_packages, "easy-install.pth")
main_pth = join_path(prefix, self.easy_install_file)
if not paths:
if os.path.isfile(main_pth):
@ -623,18 +632,29 @@ def activate(self, ext_pkg, **args):
ignore = self.python_ignore(ext_pkg, args)
args.update(ignore=ignore)
extensions_layout = args.get("extensions_layout",
spack.store.extensions)
super(Python, self).activate(ext_pkg, **args)
exts = spack.store.layout.extension_map(self.spec)
exts = extensions_layout.extension_map(self.spec)
exts[ext_pkg.name] = ext_pkg.spec
self.write_easy_install_pth(exts)
self.write_easy_install_pth(
exts,
prefix=extensions_layout.extendee_target_directory(self))
def deactivate(self, ext_pkg, **args):
args.update(ignore=self.python_ignore(ext_pkg, args))
super(Python, self).deactivate(ext_pkg, **args)
exts = spack.store.layout.extension_map(self.spec)
extensions_layout = args.get("extensions_layout",
spack.store.extensions)
exts = extensions_layout.extension_map(self.spec)
# Make deactivate idempotent
if ext_pkg.name in exts:
del exts[ext_pkg.name]
self.write_easy_install_pth(exts)
self.write_easy_install_pth(
exts,
prefix=extensions_layout.extendee_target_directory(self))