From e66ae3959deec6212d0f5c913105616e5b8a2354 Mon Sep 17 00:00:00 2001 From: Gregory Becker Date: Mon, 21 Apr 2025 17:29:18 -0700 Subject: [PATCH] Spec.long_spec: update for conditional deps Signed-off-by: Gregory Becker --- lib/spack/spack/spec.py | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py index ea8809c2092..2c7139523aa 100644 --- a/lib/spack/spack/spec.py +++ b/lib/spack/spack/spec.py @@ -1639,20 +1639,26 @@ def edge_attributes(self) -> str: union = DependencySpec(parent=Spec(), spec=self, depflag=0, virtuals=()) all_direct_edges = all(x.direct for x in edges) + dep_conditions = [] for edge in edges: union.update_deptypes(edge.depflag) union.update_virtuals(edge.virtuals) + dep_conditions.append(edge.when) deptypes_str = "" if not all_direct_edges and union.depflag: deptypes_str = f"deptypes={','.join(dt.flag_to_tuple(union.depflag))}" virtuals_str = f"virtuals={','.join(union.virtuals)}" if union.virtuals else "" - if not deptypes_str and not virtuals_str: - return "" - result = f"{deptypes_str} {virtuals_str}".strip() - return f"[{result}]" + + conditions = [str(c) for c in dep_conditions if c != Spec()] + when_str = f"when={','.join(conditions)}" if conditions else "" + + result = f"{when_str} {deptypes_str} {virtuals_str}".strip() + if result: + result = f"[{result}]" + return result def dependencies( self, @@ -2109,15 +2115,15 @@ def long_spec(self): new_name = spack.aliases.BUILTIN_TO_LEGACY_COMPILER.get(current_name, current_name) # note: depflag not allowed, currently, on "direct" edges edge_attributes = "" - if item.virtuals: - edge_attributes = item.spec.format("{edge_attributes}") + " " + if item.virtuals or item.when: + edge_attributes = item.spec.format("{edge_attributes}") + "" parts.append(f"%{edge_attributes}{item.spec.format()}".replace(current_name, new_name)) for item in sorted(transitive, key=lambda x: x.spec.name): # Recurse to attach build deps in order edge_attributes = "" - if item.virtuals or item.depflag: - edge_attributes = item.spec.format("{edge_attributes}") + " " + if item.virtuals or item.depflag or item.when: + edge_attributes = item.spec.format("{edge_attributes}") + "" parts.append(f"^{edge_attributes}{str(item.spec)}") return " ".join(parts).strip()