Spec.long_spec: update for conditional deps

Signed-off-by: Gregory Becker <becker33@llnl.gov>
This commit is contained in:
Gregory Becker 2025-04-21 17:29:18 -07:00
parent 02513eae7e
commit e66ae3959d
No known key found for this signature in database
GPG Key ID: 2362541F6D14ED84

View File

@ -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()