Allow conditional possible values in variants (#29530)

Allow declaring possible values for variants with an associated condition. If the variant takes one of those values, the condition is imposed as a further constraint.

The idea of this PR is to implement part of the mechanisms needed for modeling [packages with multiple build-systems]( https://github.com/spack/seps/pull/3). After this PR the build-system directive can be implemented as:
```python
variant(
    'build-system',
    default='cmake',
    values=(
        'autotools',
        conditional('cmake', when='@X.Y:')
    ), 
    description='...',
)
```

Modifications:
- [x] Allow conditional possible values in variants
- [x] Add a unit-test for the feature
- [x] Add documentation
This commit is contained in:
Massimiliano Culpo
2022-04-05 02:37:57 +02:00
committed by GitHub
parent d64de54ebe
commit f2fc4ee9af
8 changed files with 214 additions and 13 deletions

View File

@@ -0,0 +1,34 @@
# Copyright 2013-2022 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 ConditionalValuesInVariant(Package):
"""Package with conditional possible values in a variant"""
homepage = "https://dev.null"
version('1.73.0')
version('1.72.0')
version('1.62.0')
version('1.60.0')
version('1.50.0')
variant(
'cxxstd', default='98',
values=(
'98', '11', '14',
# C++17 is not supported by Boost < 1.63.0.
conditional('17', when='@1.63.0:'),
# C++20/2a is not support by Boost < 1.73.0
conditional('2a', when='@1.73.0:')
),
multi=False,
description='Use the specified C++ standard when building.',
when='@1.60.0:'
)
variant(
'staging', values=any_combination_of(
conditional('flexpath', 'dataspaces', when='@1.73.0:')
),
description='Enable dataspaces and/or flexpath staging transports'
)

View File

@@ -140,7 +140,13 @@ def libs(self):
variant('cxxstd',
default='98',
values=('98', '11', '14', '17', '2a'),
values=(
'98', '11', '14',
# C++17 is not supported by Boost < 1.63.0.
conditional('17', when='@1.63.0:'),
# C++20/2a is not support by Boost < 1.73.0
conditional('2a', when='@1.73.0:')
),
multi=False,
description='Use the specified C++ standard when building.')
variant('debug', default=False,
@@ -193,12 +199,6 @@ def libs(self):
conflicts('cxxstd=98', when='+fiber') # Fiber requires >=C++11.
conflicts('~context', when='+fiber') # Fiber requires Context.
# C++20/2a is not support by Boost < 1.73.0
conflicts('cxxstd=2a', when='@:1.72')
# C++17 is not supported by Boost<1.63.0.
conflicts('cxxstd=17', when='@:1.62')
conflicts('+taggedlayout', when='+versionedlayout')
conflicts('+numpy', when='~python')