diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index 0fa64efc198..26eab260ac6 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -3506,6 +3506,19 @@ def satisfies(self, other: Union[str, "Spec"], deps: bool = True) -> bool: if rhs_edge.spec.virtual: rhs_edge.update_virtuals(virtuals=(rhs_edge.spec.name,)) + if rhs_edge.direct: + # Note: this relies on abstract specs from string not being deeper than 2 levels + # e.g. in foo %fee ^bar %baz we cannot go deeper than "baz" and e.g. specify its + # dependencies too. + current_node = self if rhs_edge.parent.name is None else self[rhs_edge.parent.name] + candidates = current_node.dependencies( + name=rhs_edge.spec.name, + deptype=rhs_edge.depflag, + virtuals=rhs_edge.virtuals or None, + ) + if not candidates or not any(x.satisfies(rhs_edge.spec) for x in candidates): + return False + if not rhs_edge.virtuals: continue