summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorTodd Gamblin <tgamblin@llnl.gov>2019-10-09 12:02:56 -0700
committerTodd Gamblin <tgamblin@llnl.gov>2020-11-17 10:04:13 -0800
commita332981f2f8d06189c50f651d7d9278f7b28bffe (patch)
tree494b5f94acd69388e548984fe51e62064e8e1d59 /lib
parent501cb371c90f3bb3aaa6e12d6d5cd2e6a60e302b (diff)
downloadspack-a332981f2f8d06189c50f651d7d9278f7b28bffe.tar.gz
spack-a332981f2f8d06189c50f651d7d9278f7b28bffe.tar.bz2
spack-a332981f2f8d06189c50f651d7d9278f7b28bffe.tar.xz
spack-a332981f2f8d06189c50f651d7d9278f7b28bffe.zip
concretizer: require only one provider for any virtual in the DAG
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/spack/solver/asp.py6
-rw-r--r--lib/spack/spack/solver/concretize.lp6
2 files changed, 8 insertions, 4 deletions
diff --git a/lib/spack/spack/solver/asp.py b/lib/spack/spack/solver/asp.py
index 4975bcd452..f23fe351cd 100644
--- a/lib/spack/spack/solver/asp.py
+++ b/lib/spack/spack/solver/asp.py
@@ -366,10 +366,7 @@ class AspGenerator(object):
clauses.append(f.node_compiler_version(
spec.name, spec.compiler.name, spec.compiler.version))
-# if spec.dependencies:
-
# TODO
- # dependencies
# external_path
# external_module
# compiler_flags
@@ -404,7 +401,8 @@ class AspGenerator(object):
for vspec in virtuals:
self.fact(fn.virtual(vspec))
for provider in spack.repo.path.providers_for(vspec):
- self.fact(fn.provides_virtual(provider, vspec))
+ # TODO: handle versioned virtuals
+ self.fact(fn.provides_virtual(provider.name, vspec))
def generate_asp_program(self, specs):
"""Write an ASP program for specs.
diff --git a/lib/spack/spack/solver/concretize.lp b/lib/spack/spack/solver/concretize.lp
index 006a5e39ed..041ea76e31 100644
--- a/lib/spack/spack/solver/concretize.lp
+++ b/lib/spack/spack/solver/concretize.lp
@@ -24,6 +24,12 @@ depends_on(P, D) :- declared_dependency(P, D), not virtual(D), node(P).
1 { depends_on(P, Q) : provides_virtual(Q, V) } 1
:- declared_dependency(P, V), virtual(V), node(P).
+% for any virtual, there can only be one node providing it in the DAG
+provider(P, V) :- node(P), provides_virtual(P, V).
+1 { provider(P, V) : node(P) } 1 :- virtual(V).
+
+% all nodes must be reachable from some root
+% TODO: this doesn't seem to be working yet
needed(D) :- depends_on(_, D), node(D).
needed(P) :- root(P).
:- node(P), not needed(P).