summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd Gamblin <tgamblin@llnl.gov>2019-08-10 18:04:26 -0700
committerTodd Gamblin <tgamblin@llnl.gov>2020-11-17 10:04:13 -0800
commitd94d9575360ad3a5078263fc63b5876f92237a3a (patch)
tree4dc71aaf2aafe9f190c503a16c2d41d295eb97cb
parentb171ac5050d0118e58a465253d5d6cd23147ccfb (diff)
downloadspack-d94d9575360ad3a5078263fc63b5876f92237a3a.tar.gz
spack-d94d9575360ad3a5078263fc63b5876f92237a3a.tar.bz2
spack-d94d9575360ad3a5078263fc63b5876f92237a3a.tar.xz
spack-d94d9575360ad3a5078263fc63b5876f92237a3a.zip
concretizer: simplify and suppress warnings for variant handling
We are relying on default logic in the variant handling in that we set a default value if we never see `variant_set(P, V, X)`. - Move the logic for this into `concretize.lp` instead of generating it for every package. - For programs that don't have explicit variant settings, clingo warns that variant_set(P, V, X) doesn't appear in any rule head, because a setting is never generated. - Specifically suppress this warning.
-rw-r--r--lib/spack/spack/solver/asp.py20
-rw-r--r--lib/spack/spack/solver/concretize.lp7
2 files changed, 19 insertions, 8 deletions
diff --git a/lib/spack/spack/solver/asp.py b/lib/spack/spack/solver/asp.py
index 1380675dd9..dff1f385c7 100644
--- a/lib/spack/spack/solver/asp.py
+++ b/lib/spack/spack/solver/asp.py
@@ -196,14 +196,17 @@ class AspGenerator(object):
single = fn.variant_single_value(pkg.name, name)
if single_value:
self.rule(single, fn.node(pkg.name))
- self.rule(fn.variant_value(pkg.name, name, variant.default),
- self._not(fn.variant_set(pkg.name, name)))
+ self.rule(
+ fn.variant_default_value(pkg.name, name, variant.default),
+ fn.node(pkg.name))
else:
self.rule(self._not(single), fn.node(pkg.name))
defaults = variant.default.split(',')
for val in defaults:
- self.rule(fn.variant_value(pkg.name, name, val),
- self._not(fn.variant_set(pkg.name, name)))
+ self.rule(
+ fn.variant_default_value(pkg.name, name, val),
+ fn.node(pkg.name))
+ self.out.write('\n')
# dependencies
for name, conditions in pkg.dependencies.items():
@@ -231,7 +234,7 @@ class AspGenerator(object):
# variants
for vname, variant in spec.variants.items():
- self.fact(fn.variant_value(spec.name, vname, variant.value))
+ self.fact(fn.variant_set(spec.name, vname, variant.value))
# TODO
# dependencies
@@ -265,9 +268,10 @@ class AspGenerator(object):
self.title('Spec Constraints')
for spec in specs:
- self.section('Spec: %s' % pkg)
- self.spec_rules(spec)
- self.out.write('\n')
+ for dep in spec.traverse():
+ self.section('Spec: %s' % str(dep))
+ self.spec_rules(dep)
+ self.out.write('\n')
self.out.write(pkgutil.get_data('spack.solver', 'display.lp'))
self.out.write('\n')
diff --git a/lib/spack/spack/solver/concretize.lp b/lib/spack/spack/solver/concretize.lp
index b805583043..15c061ef20 100644
--- a/lib/spack/spack/solver/concretize.lp
+++ b/lib/spack/spack/solver/concretize.lp
@@ -25,6 +25,13 @@ arch_target(D, A) :- node(D), depends_on(P, D), arch_target(P, A).
% if a variant is set to anything, it is considered 'set'.
variant_set(P, V) :- variant_set(P, V, _).
+% suppress wranings about this atom being unset. It's only set if some
+% spec or some package sets it, and without this, clingo will give
+% warnings like 'info: atom does not occur in any rule head'.
+#defined variant_set/3.
+
% variant_set is an explicitly set variant value. If it's not 'set',
% we revert to the default value. If it is set, we force the set value
variant_value(P, V, X) :- node(P), variant(P, V), variant_set(P, V, X).
+variant_value(P, V, X) :- node(P), variant(P, V), not variant_set(P, V),
+ variant_default_value(P, V, X).