diff --git a/lib/spack/spack/solver/asp.py b/lib/spack/spack/solver/asp.py index 23e7141497b..6ba9111e941 100644 --- a/lib/spack/spack/solver/asp.py +++ b/lib/spack/spack/solver/asp.py @@ -806,6 +806,8 @@ def visit(node): self.control.load(os.path.join(parent_dir, "concretize.lp")) self.control.load(os.path.join(parent_dir, "os_compatibility.lp")) self.control.load(os.path.join(parent_dir, "display.lp")) + if spack.error.debug: + self.control.load(os.path.join(parent_dir, "causation.lp")) timer.stop("load") # Grounding is the first step in the solve -- it turns our facts diff --git a/lib/spack/spack/solver/concretize.lp b/lib/spack/spack/solver/concretize.lp index 24cff31cc85..470137070e0 100644 --- a/lib/spack/spack/solver/concretize.lp +++ b/lib/spack/spack/solver/concretize.lp @@ -48,6 +48,13 @@ error(100, multiple_values_error, Attribute, Package) attr_single_value(Attribute), 2 { attr(Attribute, Package, Version) }. +%----------------------------------------------------------------------------- +% Define functions for error handling +%----------------------------------------------------------------------------- + +#defined error/9. +#defined condition_cause/2. + %----------------------------------------------------------------------------- % Version semantics %----------------------------------------------------------------------------- @@ -86,17 +93,6 @@ version_satisfies(Package, Constraint, HashVersion) :- version_satisfies(Package { attr("version", Package, Version) : version_declared(Package, Version) } :- attr("node", Package). -% error we expect users to see -error(0, "Version '{0}' of {1} does not satisfy '@{2}'", Version, Package, Constraint, startcauses, VersionCause, ConstraintCause) - :- attr("node", Package), - attr("version", Package, Version), - imposed_constraint(VersionCause, "node_version_satisfies", Package, Version), - condition_holds(VersionCause), - attr("node_version_satisfies", Package, Constraint), - imposed_constraint(ConstraintCause, "node_version_satisfies", Package, Constraint), - condition_holds(ConstraintCause), - not version_satisfies(Package, Constraint, Version). - % Error to ensure structure of the program is not violated error(2, "No version from '{0}' satisfies '@{1}' and '@{2}'", Package, Version1, Version2) :- attr("node", Package), @@ -108,17 +104,6 @@ error(2, "No versions available for package '{0}'", Package) :- attr("node", Package), not attr("version", Package, _). % A virtual package may or may not have a version, but never has more than one -% Error to catch how it happens -error(0, "Version '{0}' of {1} does not satisfy '@{2}'", Version, Virtual, Constraint, startcauses, VersionCause, ConstraintCause) - :- attr("virtual_node", Virtual), - attr("version", Virtual, Version), - imposed_constraint(VersionCause, "node_version_satisfies", Virtual, Version), - condition_holds(VersionCause), - attr("node_version_satisfies", Virtual, Constraint), - imposed_constraint(ConstraintCause, "node_version_satisfies", Virtual, Constraint), - condition_holds(ConstraintCause), - not version_satisfies(Virtual, Constraint, Version). - % fallback error for structure in case there's another way for it to happen error(100, "Cannot select a single version for virtual '{0}'", Virtual) :- attr("virtual_node", Virtual), @@ -173,15 +158,6 @@ possible_version_weight(Package, Weight) :- attr("node_version_satisfies", Package, Constraint), version_satisfies(Package, Constraint, _). -% More specific error message if the version cannot satisfy some constraint -% Otherwise covered by `no_version_error` and `versions_conflict_error`. -error(0, "No valid version for '{0}' satisfies '@{1}'", Package, Constraint, startcauses, ConstraintCause) - :- attr("node_version_satisfies", Package, Constraint), - imposed_constraint(ConstraintCause, "node_version_satisfies", Package, Constraint), - condition_holds(ConstraintCause), - C = #count{ Version : attr("version", Package, Version), version_satisfies(Package, Constraint, Version)}, - C < 1. - % Error for structure of program error(10, "Cannot satisfy '{0}@{1}'", Package, Constraint) :- attr("node_version_satisfies", Package, Constraint), @@ -234,28 +210,6 @@ attr(Name, A1, A2, A3, A4) :- impose(ID), imposed_constraint(ID, Name, A1, A2, A not imposed_constraint(Hash, "node_flag", Package, FlagType, Flag), internal_error("imposed hash without imposing all flag values"). -% associated conditions by cause -> effect -condition_cause(Effect, Cause) :- - condition_holds(Effect), condition_holds(Cause), - attr(Name, A1), - condition_requirement(Effect, Name, A1), - imposed_constraint(Cause, Name, A1). -condition_cause(Effect, Cause) :- - condition_holds(Effect), condition_holds(Cause), - attr(Name, A1, A2), - condition_requirement(Effect, Name, A1, A2), - imposed_constraint(Cause, Name, A1, A2). -condition_cause(Effect, Cause) :- - condition_holds(Effect), condition_holds(Cause), - attr(Name, A1, A2, A3), - condition_requirement(Effect, Name, A1, A2, A3), - imposed_constraint(Cause, Name, A1, A2, A3). -condition_cause(Effect, Cause) :- - condition_holds(Effect), condition_holds(Cause), - attr(Name, A1, A2, A3, A4), - condition_requirement(Effect, Name, A1, A2, A3, A4), - imposed_constraint(Cause, Name, A1, A2, A3, A4). - #defined condition/2. #defined condition_requirement/3. #defined condition_requirement/4. @@ -613,19 +567,6 @@ attr("variant_value", Package, Variant, Value) :- variant(Package, Variant), build(Package). -error(0, "'{0}' required multiple values for single-valued variant '{1}'\n Requested 'Spec({1}={2})' and 'Spec({1}={3})'", Package, Variant, Value1, Value2, startcauses, Cause1, Cause2) - :- attr("node", Package), - variant(Package, Variant), - variant_single_value(Package, Variant), - build(Package), - attr("variant_value", Package, Variant, Value1), - imposed_constraint(Cause1, "variant_set", Package, Variant, Value1), - condition_holds(Cause1), - attr("variant_value", Package, Variant, Value2), - imposed_constraint(Cause2, "variant_set", Package, Variant, Value2), - condition_holds(Cause2), - Value1 < Value2. % see[1] - error(100, "'{0}' required multiple values for single-valued variant '{1}'", Package, Variant) :- attr("node", Package), variant(Package, Variant),