diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index c61d87d4d19..3798a7b1487 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -3403,6 +3403,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