def _depends_on(pkg, spec, when=None, type=default_deptype, patches=None): when_spec = make_when_spec(when) if not when_spec: return dep_spec = spack.spec.Spec(spec) if pkg.name == dep_spec.name: raise CircularReferenceError("Package '%s' cannot depend on itself." % pkg.name) type = canonical_deptype(type) conditions = pkg.dependencies.setdefault(dep_spec.name, {}) # call this patches here for clarity -- we want patch to be a list, # but the caller doesn't have to make it one. # Note: we cannot check whether a package is virtual in a directive # because directives are run as part of class instantiation, and specs # instantiate the package class as part of the `virtual` check. # To be technical, specs only instantiate the package class as part of the # virtual check if the provider index hasn't been created yet. # TODO: There could be a cache warming strategy that would allow us to # ensure `Spec.virtual` is a valid thing to call in a directive. # For now, we comment out the following check to allow for virtual packages # with package files. # if patches and dep_spec.virtual: # raise DependencyPatchError("Cannot patch a virtual dependency.") # ensure patches is a list if patches is None: patches = [] elif not isinstance(patches, (list, tuple)): patches = [patches] # auto-call patch() directive on any strings in patch list patches = [ patch(p) if isinstance(p, six.string_types) else p for p in patches ] assert all(callable(p) for p in patches) # this is where we actually add the dependency to this package if when_spec not in conditions: dependency = Dependency(pkg, dep_spec, type=type) conditions[when_spec] = dependency else: dependency = conditions[when_spec] dependency.spec.constrain(dep_spec, deps=False) dependency.type |= set(type) # apply patches to the dependency for execute_patch in patches: execute_patch(dependency)
def _depends_on(pkg, spec, when=None, type=default_deptype, patches=None): # If when is False do nothing if when is False: return # If when is None or True make sure the condition is always satisfied if when is None or when is True: when = pkg.name when_spec = spack.spec.parse_anonymous_spec(when, pkg.name) dep_spec = spack.spec.Spec(spec) if pkg.name == dep_spec.name: raise CircularReferenceError("Package '%s' cannot depend on itself." % pkg.name) type = canonical_deptype(type) conditions = pkg.dependencies.setdefault(dep_spec.name, {}) # call this patches here for clarity -- we want patch to be a list, # but the caller doesn't have to make it one. if patches and dep_spec.virtual: raise DependencyPatchError("Cannot patch a virtual dependency.") # ensure patches is a list if patches is None: patches = [] elif not isinstance(patches, (list, tuple)): patches = [patches] # auto-call patch() directive on any strings in patch list patches = [patch(p) if isinstance(p, string_types) else p for p in patches] assert all(callable(p) for p in patches) # this is where we actually add the dependency to this package if when_spec not in conditions: dependency = Dependency(pkg, dep_spec, type=type) conditions[when_spec] = dependency else: dependency = conditions[when_spec] dependency.spec.constrain(dep_spec, deps=False) dependency.type |= set(type) # apply patches to the dependency for execute_patch in patches: execute_patch(dependency)