summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMassimiliano Culpo <massimiliano.culpo@gmail.com>2021-01-05 15:42:22 +0100
committerTamara Dahlgren <dahlgren1@llnl.gov>2021-02-17 17:07:39 -0800
commitddd9c86ce0372cc1208a0160e2e6ba3c2fe47d3d (patch)
tree3dcd2a1cfa5a09946a3f8fe9912b6e42fca88a63 /lib
parent8e442d6dc165d11650fdc4daa4bd8528b49551b9 (diff)
downloadspack-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.lp20
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