New "extends" relation adds another special list to the package class.

This commit is contained in:
Todd Gamblin 2015-01-06 14:49:13 -05:00
parent 88afad3e46
commit ebe0c1d83a
2 changed files with 28 additions and 1 deletions

View File

@ -314,6 +314,9 @@ class SomePackage(Package):
"""Specs of virtual packages provided by this package, keyed by name.""" """Specs of virtual packages provided by this package, keyed by name."""
provided = {} provided = {}
"""Specs of packages this one extends, keyed by name."""
extendees = {}
"""Specs of conflicting packages, keyed by name. """ """Specs of conflicting packages, keyed by name. """
conflicted = {} conflicted = {}

View File

@ -107,8 +107,9 @@ def depends_on(*specs):
"""Adds a dependencies local variable in the locals of """Adds a dependencies local variable in the locals of
the calling class, based on args. """ the calling class, based on args. """
pkg = get_calling_package_name() pkg = get_calling_package_name()
clocals = caller_locals()
dependencies = clocals.setdefault('dependencies', {})
dependencies = caller_locals().setdefault('dependencies', {})
for string in specs: for string in specs:
for spec in spack.spec.parse(string): for spec in spack.spec.parse(string):
if pkg == spec.name: if pkg == spec.name:
@ -116,6 +117,29 @@ def depends_on(*specs):
dependencies[spec.name] = spec dependencies[spec.name] = spec
def extends(*specs):
"""Same as depends_on, but dependency is symlinked into parent prefix.
This is for Python and other language modules where the module
needs to be installed into the prefix of the Python installation.
Spack handles this by installing modules into their own prefix,
but allowing ONE module version to be symlinked into a parent
Python install at a time.
"""
pkg = get_calling_package_name()
clocals = caller_locals()
dependencies = clocals.setdefault('dependencies', {})
extendees = clocals.setdefault('extendees', {})
for string in specs:
for spec in spack.spec.parse(string):
if pkg == spec.name:
raise CircularReferenceError('depends_on', pkg)
dependencies[spec.name] = spec
extendees[spec.name] = spec
def provides(*specs, **kwargs): def provides(*specs, **kwargs):
"""Allows packages to provide a virtual dependency. If a package provides """Allows packages to provide a virtual dependency. If a package provides
'mpi', other packages can declare that they depend on "mpi", and spack 'mpi', other packages can declare that they depend on "mpi", and spack