diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/spack/spack/solver/concretize.lp | 21 | ||||
-rw-r--r-- | lib/spack/spack/test/concretize_preferences.py | 20 |
2 files changed, 31 insertions, 10 deletions
diff --git a/lib/spack/spack/solver/concretize.lp b/lib/spack/spack/solver/concretize.lp index 8006e5f94f..e444faffec 100644 --- a/lib/spack/spack/solver/concretize.lp +++ b/lib/spack/spack/solver/concretize.lp @@ -732,23 +732,24 @@ opt_criterion(14, "number of non-default variants (roots)"). : variant_not_default(Package, Variant, Value, Weight), root(Package) }. +opt_criterion(13, "preferred providers for roots"). +#minimize{ 0@13 : #true }. +#minimize{ + Weight@13,Provider,Virtual + : provider_weight(Provider, Virtual, Weight), root(Provider) +}. + % If the value is a multivalued variant there could be multiple % values set as default. Since a default value has a weight of 0 we % need to maximize their number below to ensure they're all set -opt_criterion(13, "multi-valued variants"). -#minimize{ 0@13 : #true }. +opt_criterion(12, "number of values in multi valued variants (root)"). +#minimize{ 0@12 : #true }. #maximize { - 1@13,Package,Variant,Value + 1@12,Package,Variant,Value : variant_not_default(Package, Variant, Value, Weight), not variant_single_value(Package, Variant), root(Package) }. -opt_criterion(12, "preferred providers for roots"). -#minimize{ 0@12 : #true }. -#minimize{ - Weight@12,Provider,Virtual - : provider_weight(Provider, Virtual, Weight), root(Provider) -}. % Try to use default variants or variants that have been set opt_criterion(11, "number of non-default variants (non-roots)"). @@ -782,7 +783,7 @@ opt_criterion(7, "version badness"). % If the value is a multivalued variant there could be multiple % values set as default. Since a default value has a weight of 0 we % need to maximize their number below to ensure they're all set -opt_criterion(6, "count of non-root multi-valued variants"). +opt_criterion(6, "number of values in multi valued variants (non-root)"). #minimize{ 0@6 : #true }. #maximize { 1@6,Package,Variant,Value diff --git a/lib/spack/spack/test/concretize_preferences.py b/lib/spack/spack/test/concretize_preferences.py index 598e9d08fb..733e3efa77 100644 --- a/lib/spack/spack/test/concretize_preferences.py +++ b/lib/spack/spack/test/concretize_preferences.py @@ -396,3 +396,23 @@ mpi: assert s.satisfies('^version-test-pkg@2.4.6') assert 'version-test-dependency-preferred' not in s + + @pytest.mark.regression('26598') + def test_multivalued_variants_are_lower_priority_than_providers(self): + """Test that the rule to maximize the number of values for multivalued + variants is considered at lower priority than selecting the default + provider for virtual dependencies. + + This ensures that we don't e.g. select openmpi over mpich even if we + specified mpich as the default mpi provider, just because openmpi supports + more fabrics by default. + """ + with spack.config.override( + 'packages:all', { + 'providers': { + 'somevirtual': ['some-virtual-preferred'] + } + } + ): + s = Spec('somevirtual').concretized() + assert s.name == 'some-virtual-preferred' |