Externals are preferred even when they have non-default variant values
fixes #22596 Variants which are specified in an external spec are not scored negatively if they encode a non-default value.
This commit is contained in:
parent
4ed5c366fa
commit
4079bbce97
@ -368,23 +368,40 @@ variant_value(Package, Variant, Value)
|
|||||||
variant(Package, Variant),
|
variant(Package, Variant),
|
||||||
variant_set(Package, Variant, Value).
|
variant_set(Package, Variant, Value).
|
||||||
|
|
||||||
% prefer default values.
|
% The rules below allow us to prefer default values for variants
|
||||||
|
% whenever possible. If a variant is set in a spec, or if it is
|
||||||
|
% specified in an external, we score it as if it was a default value.
|
||||||
variant_not_default(Package, Variant, Value, 1)
|
variant_not_default(Package, Variant, Value, 1)
|
||||||
:- variant_value(Package, Variant, Value),
|
:- variant_value(Package, Variant, Value),
|
||||||
not variant_default_value(Package, Variant, Value),
|
not variant_default_value(Package, Variant, Value),
|
||||||
not variant_set(Package, Variant, Value),
|
not variant_set(Package, Variant, Value),
|
||||||
|
not external_with_variant_set(Package, Variant, Value),
|
||||||
node(Package).
|
node(Package).
|
||||||
|
|
||||||
|
% We are using the default value for a variant
|
||||||
variant_not_default(Package, Variant, Value, 0)
|
variant_not_default(Package, Variant, Value, 0)
|
||||||
:- variant_value(Package, Variant, Value),
|
:- variant_value(Package, Variant, Value),
|
||||||
variant_default_value(Package, Variant, Value),
|
variant_default_value(Package, Variant, Value),
|
||||||
node(Package).
|
node(Package).
|
||||||
|
|
||||||
|
% The variant is set in the spec
|
||||||
variant_not_default(Package, Variant, Value, 0)
|
variant_not_default(Package, Variant, Value, 0)
|
||||||
:- variant_value(Package, Variant, Value),
|
:- variant_value(Package, Variant, Value),
|
||||||
variant_set(Package, Variant, Value),
|
variant_set(Package, Variant, Value),
|
||||||
node(Package).
|
node(Package).
|
||||||
|
|
||||||
|
% The variant is set in an external spec
|
||||||
|
external_with_variant_set(Package, Variant, Value)
|
||||||
|
:- variant_value(Package, Variant, Value),
|
||||||
|
condition_requirement(ID, "variant_value", Package, Variant, Value),
|
||||||
|
possible_external(ID, Package, _),
|
||||||
|
external(Package),
|
||||||
|
node(Package).
|
||||||
|
|
||||||
|
variant_not_default(Package, Variant, Value, 0)
|
||||||
|
:- variant_value(Package, Variant, Value),
|
||||||
|
external_with_variant_set(Package, Variant, Value),
|
||||||
|
node(Package).
|
||||||
|
|
||||||
% The default value for a variant in a package is what is written
|
% The default value for a variant in a package is what is written
|
||||||
% in the package.py file, unless some preference is set in packages.yaml
|
% in the package.py file, unless some preference is set in packages.yaml
|
||||||
|
@ -1173,3 +1173,13 @@ def test_mv_variants_disjoint_sets_from_packages_yaml(self):
|
|||||||
|
|
||||||
s = Spec('mvapich2').concretized()
|
s = Spec('mvapich2').concretized()
|
||||||
assert set(s.variants['file_systems'].value) == set(['ufs', 'nfs'])
|
assert set(s.variants['file_systems'].value) == set(['ufs', 'nfs'])
|
||||||
|
|
||||||
|
@pytest.mark.regression('22596')
|
||||||
|
def test_external_with_non_default_variant_as_dependency(self):
|
||||||
|
# This package depends on another that is registered as an external
|
||||||
|
# with 'buildable: true' and a variant with a non-default value set
|
||||||
|
s = Spec('trigger-external-non-default-variant').concretized()
|
||||||
|
|
||||||
|
assert '~foo' in s['external-non-default-variant']
|
||||||
|
assert '~bar' in s['external-non-default-variant']
|
||||||
|
assert s['external-non-default-variant'].external
|
||||||
|
@ -41,3 +41,8 @@ packages:
|
|||||||
externals:
|
externals:
|
||||||
- spec: old-external@1.0.0
|
- spec: old-external@1.0.0
|
||||||
prefix: /usr
|
prefix: /usr
|
||||||
|
'external-non-default-variant':
|
||||||
|
buildable: True
|
||||||
|
externals:
|
||||||
|
- spec: external-non-default-variant@3.8.7~foo~bar
|
||||||
|
prefix: /usr
|
||||||
|
@ -0,0 +1,13 @@
|
|||||||
|
# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
class ExternalNonDefaultVariant(Package):
|
||||||
|
"""An external that is registered with a non-default value"""
|
||||||
|
homepage = "http://www.python.org"
|
||||||
|
url = "http://www.python.org/ftp/python/3.8.7/Python-3.8.7.tgz"
|
||||||
|
|
||||||
|
version('3.8.7', 'be78e48cdfc1a7ad90efff146dce6cfe')
|
||||||
|
|
||||||
|
variant('foo', default=True, description='just a variant')
|
||||||
|
variant('bar', default=True, description='just a variant')
|
@ -0,0 +1,12 @@
|
|||||||
|
# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
class TriggerExternalNonDefaultVariant(Package):
|
||||||
|
"""This ackage depends on an external with a non-default variant"""
|
||||||
|
homepage = "http://www.example.com"
|
||||||
|
url = "http://www.someurl.tar.gz"
|
||||||
|
|
||||||
|
version('1.0', 'foobarbaz')
|
||||||
|
|
||||||
|
depends_on('external-non-default-variant')
|
Loading…
Reference in New Issue
Block a user