From d94d9575360ad3a5078263fc63b5876f92237a3a Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sat, 10 Aug 2019 18:04:26 -0700 Subject: 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. --- lib/spack/spack/solver/asp.py | 20 ++++++++++++-------- lib/spack/spack/solver/concretize.lp | 7 +++++++ 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). -- cgit v1.2.3-70-g09d2