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