bugfix: don't look up virtual information for unknown packages

`spec_clauses()` attempts to look up package information for concrete specs in order to
determine which virtuals they may provide. This fails for renamed/deleted dependencies
of buildcaches and installed packages.

This will eventually be fixed by #35258, which adds virtual information on edges, but we
need a workaround to make older buildcaches usable.

- [x] make an exception for renamed packages and omit their virtual constraints
- [x] add a note that this will be solved by adding virtuals to edges
This commit is contained in:
Todd Gamblin 2023-04-17 16:54:27 -07:00 committed by Harmen Stoppels
parent 18b4670d9f
commit a6f41006eb

View File

@ -1669,9 +1669,20 @@ class Body(object):
if concrete_build_deps or dtype != "build": if concrete_build_deps or dtype != "build":
clauses.append(fn.attr("depends_on", spec.name, dep.name, dtype)) clauses.append(fn.attr("depends_on", spec.name, dep.name, dtype))
# Ensure Spack will not coconcretize this with another provider # Skip virtual node constriants for renamed/deleted packages,
# for the same virtual # so their binaries can still be installed.
for virtual in dep.package.virtuals_provided: # NOTE: with current specs (which lack edge attributes) this
# can allow concretizations with two providers, but it's unlikely.
try:
virtuals = dep.package.virtuals_provided
except spack.repo.UnknownPackageError:
continue
# Don't concretize with two providers of the same virtual.
# See above for exception for unknown packages.
# TODO: we will eventually record provider information on edges,
# TODO: which avoids the need for the package lookup above.
for virtual in virtuals:
clauses.append(fn.attr("virtual_node", virtual.name)) clauses.append(fn.attr("virtual_node", virtual.name))
clauses.append(fn.provider(dep.name, virtual.name)) clauses.append(fn.provider(dep.name, virtual.name))