diff options
author | Todd Gamblin <tgamblin@llnl.gov> | 2021-08-08 12:42:45 -0700 |
---|---|---|
committer | Todd Gamblin <tgamblin@llnl.gov> | 2021-11-05 00:15:47 -0700 |
commit | 40b914503e2441c0f51de737e3901f8f546ccbce (patch) | |
tree | 959c01ce501daf1af28a9b18924923245cfda2b4 | |
parent | 2c142f9dd4cf29220f6b2840f4d448c5c9d936f1 (diff) | |
download | spack-40b914503e2441c0f51de737e3901f8f546ccbce.tar.gz spack-40b914503e2441c0f51de737e3901f8f546ccbce.tar.bz2 spack-40b914503e2441c0f51de737e3901f8f546ccbce.tar.xz spack-40b914503e2441c0f51de737e3901f8f546ccbce.zip |
concretizer: adjust integrity constraints to only apply to builds.
Many of the integrity constraints in the concretizer are there to restrict how solves are done, but
they ignore that past solves may have had different initial conditions. For example, for things
we're building, we want the allowed variants to be restricted to those currently in Spack packages,
but if we are reusing a concrete spec, we need to be flexible about names that may have existed in
old packages.
Similarly, restrictions around compatibility of OS's, compiler versions, compiler OS support, etc.
are really only about what is supported by the *current* set of compilers/build tools known to
Spack, not about what we may get from concrete specs.
- [x] restrict certain integrity constraints to only apply to packages that we need to build, and
omit concrete specs from consideration.
-rw-r--r-- | lib/spack/spack/solver/concretize.lp | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/lib/spack/spack/solver/concretize.lp b/lib/spack/spack/solver/concretize.lp index 782321a05f..efd364dd92 100644 --- a/lib/spack/spack/solver/concretize.lp +++ b/lib/spack/spack/solver/concretize.lp @@ -107,8 +107,7 @@ dependency_holds(Package, Dependency, Type) :- dependency_condition(ID, Package, Dependency), dependency_type(ID, Type), condition_holds(ID), - not external(Package), - not concrete(Package). + build(Package). % We cut off dependencies of externals (as we don't really know them). % Don't impose constraints on dependencies that don't exist. @@ -153,10 +152,10 @@ path(Parent, Descendant) :- path(Parent, A), depends_on(A, Descendant). % Conflicts %----------------------------------------------------------------------------- :- node(Package), - not external(Package), conflict(Package, TriggerID, ConstraintID), condition_holds(TriggerID), condition_holds(ConstraintID), + not external(Package), % ignore conflicts for externals error("A conflict was triggered"). #defined conflict/3. @@ -402,7 +401,11 @@ variant(Package, Variant) :- variant_condition(ID, Package, Variant), variant_set(Package, Variant) :- variant_set(Package, Variant, _). % A variant cannot have a value that is not also a possible value -:- variant_value(Package, Variant, Value), not variant_possible_value(Package, Variant, Value), +% This only applies to packages we need to build -- concrete packages may +% have been built w/different variants from older/different package versions. +:- variant_value(Package, Variant, Value), + not variant_possible_value(Package, Variant, Value), + build(Package), error("Variant set to invalid value"). % Some multi valued variants accept multiple values from disjoint sets. @@ -477,8 +480,11 @@ variant_default_value(Package, Variant, Value) :- variant_default_value_from_cli % Treat 'none' in a special way - it cannot be combined with other % values even if the variant is multi-valued -:- 2 {variant_value(Package, Variant, Value): variant_possible_value(Package, Variant, Value)}, +:- 2 { + variant_value(Package, Variant, Value) : variant_possible_value(Package, Variant, Value) + }, variant_value(Package, Variant, "none"), + build(Package), error("Variant value 'none' cannot be combined with any other value"). % patches and dev_path are special variants -- they don't have to be @@ -603,6 +609,7 @@ target_weight(Target, Package, Weight) not compiler_supports_target(Compiler, Version, Target), node_compiler(Package, Compiler), node_compiler_version(Package, Compiler, Version), + build(Package), error("No satisfying compiler available is compatible with a satisfying target"). % if a target is set explicitly, respect it @@ -673,6 +680,7 @@ node_compiler_version(Package, Compiler, Version) :- node_compiler_version_set(P :- node_compiler_version(Package, Compiler, Version), node_os(Package, OS), not compiler_supports_os(Compiler, Version, OS), not allow_compiler(Compiler, Version), + build(Package), error("No satisfying compiler available is compatible with a satisfying os"). % If a package and one of its dependencies don't have the @@ -891,4 +899,3 @@ opt_criterion(2, "target mismatches"). opt_criterion(1, "non-preferred targets"). #minimize{ 0@1: #true }. #minimize{ Weight@1,Package : node_target_weight(Package, Weight) }. - |