diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index aaa1ad6e5ca..8e46364b851 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -1027,6 +1027,7 @@ def select( child: Optional[str] = None, depflag: dt.DepFlag = dt.ALL, virtuals: Optional[Union[str, Sequence[str]]] = None, + when: Optional["Spec"] = None, ) -> List[DependencySpec]: """Selects a list of edges and returns them. @@ -1046,6 +1047,7 @@ def select( child: name of the child package depflag: allowed dependency types in flag form virtuals: list of virtuals or specific virtual on the edge + when: condition on conditional dependency, or Spec() for unconditional dependency only """ if not depflag: return [] @@ -1071,6 +1073,9 @@ def select( else: selected = (dep for dep in selected if any(v in dep.virtuals for v in virtuals)) + if when is not None: + selected = (dep for dep in selected if dep.when == when) + return list(selected) def clear(self): @@ -1618,6 +1623,7 @@ def edges_to_dependencies( depflag: dt.DepFlag = dt.ALL, *, virtuals: Optional[Union[str, Sequence[str]]] = None, + when: Optional["Spec"] = None, ) -> List[DependencySpec]: """Returns a list of edges connecting this node in the DAG to children. @@ -1625,9 +1631,13 @@ def edges_to_dependencies( name: filter dependencies by package name depflag: allowed dependency types virtuals: allowed virtuals + when: condition on conditional dependencies (or Spec() for unconditional) """ return [ - d for d in self._dependencies.select(child=name, depflag=depflag, virtuals=virtuals) + d + for d in self._dependencies.select( + child=name, depflag=depflag, virtuals=virtuals, when=when + ) ] @property @@ -1666,6 +1676,7 @@ def dependencies( deptype: Union[dt.DepTypes, dt.DepFlag] = dt.ALL, *, virtuals: Optional[Union[str, Sequence[str]]] = None, + when: Optional["Spec"] = None, ) -> List["Spec"]: """Returns a list of direct dependencies (nodes in the DAG) @@ -1673,11 +1684,15 @@ def dependencies( name: filter dependencies by package name deptype: allowed dependency types virtuals: allowed virtuals + when: condition on conditional dependency or Spec() for unconditional """ if not isinstance(deptype, dt.DepFlag): deptype = dt.canonicalize(deptype) return [ - d.spec for d in self.edges_to_dependencies(name, depflag=deptype, virtuals=virtuals) + d.spec + for d in self.edges_to_dependencies( + name, depflag=deptype, virtuals=virtuals, when=when + ) ] def dependents(