diff options
author | Massimiliano Culpo <massimiliano.culpo@gmail.com> | 2021-01-05 15:42:22 +0100 |
---|---|---|
committer | Tamara Dahlgren <dahlgren1@llnl.gov> | 2021-02-17 17:07:39 -0800 |
commit | ddd9c86ce0372cc1208a0160e2e6ba3c2fe47d3d (patch) | |
tree | 3dcd2a1cfa5a09946a3f8fe9912b6e42fca88a63 /lib | |
parent | 8e442d6dc165d11650fdc4daa4bd8528b49551b9 (diff) | |
download | spack-ddd9c86ce0372cc1208a0160e2e6ba3c2fe47d3d.tar.gz spack-ddd9c86ce0372cc1208a0160e2e6ba3c2fe47d3d.tar.bz2 spack-ddd9c86ce0372cc1208a0160e2e6ba3c2fe47d3d.tar.xz spack-ddd9c86ce0372cc1208a0160e2e6ba3c2fe47d3d.zip |
concretizer: make rules on virtual packages more linear
fixes #20679
In this refactor we have a single cardinality rule on the
provider, which triggers a rule transforming a dependency
on a virtual package into a dependency on the provider of
the virtual.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/spack/spack/solver/concretize.lp | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/lib/spack/spack/solver/concretize.lp b/lib/spack/spack/solver/concretize.lp index dd225a4da3..2b3d87136d 100644 --- a/lib/spack/spack/solver/concretize.lp +++ b/lib/spack/spack/solver/concretize.lp @@ -132,22 +132,21 @@ attr(Name, Arg1, Arg2, Arg3) :- %----------------------------------------------------------------------------- % Virtual dependencies %----------------------------------------------------------------------------- -% if you declare a dependency on a virtual AND the package is not an external, -% you depend on one of its providers -1 { - depends_on(Package, Provider, Type) : possible_provider(Provider, Virtual) -} 1 + +% if a package depends on a virtual, it's not external and we have a +% provider for that virtual then it depends on the provider +depends_on(Package, Provider, Type) :- dependency_conditions(Package, Virtual, Type), - virtual(Virtual), + provides_virtual(Provider, Virtual), not external(Package). -% if a virtual was required by some package, one provider is in the DAG -1 { node(Package) : provider(Package, Virtual) } 1 +% if there's a virtual node, we must select one provider +1 { provides_virtual(Package, Virtual) : possible_provider(Package, Virtual) } 1 :- virtual_node(Virtual). % virtual roots imply virtual nodes, and that one provider is a root virtual_node(Virtual) :- virtual_root(Virtual). -1 { root(Package) : possible_provider(Package, Virtual) } 1 +1 { root(Package) : provides_virtual(Package, Virtual) } 1 :- virtual_root(Virtual). % all virtual providers come from provider conditions like this @@ -174,8 +173,7 @@ virtual_node(Virtual) virtual(Virtual), not external(Package). % for any virtual, there can be at most one provider in the DAG -0 { provider(Package, Virtual) : - node(Package), provides_virtual(Package, Virtual) } 1 :- virtual(Virtual). +0 { node(Package) : provides_virtual(Package, Virtual) } 1 :- virtual(Virtual). %----------------------------------------------------------------------------- % Virtual dependency weights |