diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2025-02-18 13:37:04 +0200 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2025-02-27 13:30:24 +0200 |
commit | 2c2023e43d2327886acd1ebfecf06f359ae40bdb (patch) | |
tree | e773982ecd5cb0294316e4aa5a79b2478a5f1fcb | |
parent | 1b54239a88261cbb679a342162d72632cd6b8093 (diff) | |
download | meson-optiondefaults.zip meson-optiondefaults.tar.gz meson-optiondefaults.tar.bz2 |
Maintain bw compatibility for requesting bad options. Closes: #14255.optiondefaults
-rw-r--r-- | mesonbuild/interpreter/interpreter.py | 11 | ||||
-rw-r--r-- | mesonbuild/options.py | 8 | ||||
-rw-r--r-- | unittests/optiontests.py | 5 |
3 files changed, 21 insertions, 3 deletions
diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py index 9c37ffb..0b16266 100644 --- a/mesonbuild/interpreter/interpreter.py +++ b/mesonbuild/interpreter/interpreter.py @@ -1083,9 +1083,14 @@ class Interpreter(InterpreterBase, HoldableObject): try: value_object, value = self.coredata.optstore.get_option_from_meson_file(options.OptionKey(optname, self.subproject)) except KeyError: - if self.subproject: - raise MesonException(f'Option {optname} does not exist for subproject {self.subproject}.') - raise MesonException(f'Option {optname} does not exist.') + if self.coredata.optstore.is_base_option(optname): + # Due to backwards compatibility return the default + # option for base options instead of erroring out. + value_object, value = self.get_default_for_b_option(optname) + else: + if self.subproject: + raise MesonException(f'Option {optname} does not exist for subproject {self.subproject}.') + raise MesonException(f'Option {optname} does not exist.') if isinstance(value_object, options.UserFeatureOption): ocopy = copy.copy(value_object) ocopy.name = optname diff --git a/mesonbuild/options.py b/mesonbuild/options.py index 7c22332..609e4a9 100644 --- a/mesonbuild/options.py +++ b/mesonbuild/options.py @@ -1101,6 +1101,14 @@ class OptionStore: (value_object, value) = self.get_value_object_and_value_for(key) return (value_object, value) + def get_default_for_b_option(self, keyname: str) -> 'T.Tuple[AnyOptionType, OptionValueType]': + assert keyname.startswith('b_') + from .compilers.compilers import BASE_OPTIONS + for bkey, bvalue in BASE_OPTIONS.items(): + if bkey.name == keyname: + return (bvalue, bvalue.default) + raise MesonBugException(f'Requested base option {keyname} which does not exist.') + def remove(self, key: OptionKey) -> None: del self.options[key] try: diff --git a/unittests/optiontests.py b/unittests/optiontests.py index bbf9c0e..fb502fe 100644 --- a/unittests/optiontests.py +++ b/unittests/optiontests.py @@ -182,3 +182,8 @@ class OptionTests(unittest.TestCase): optstore.set_subproject_options(subproject, [f'cpp_std={unused_value}'], [f'cpp_std={unused_value}']) self.assertEqual(optstore.get_value_for(name), default_value) self.assertEqual(optstore.get_value_for(name, subproject), override_value) + + def test_b_default(self): + optstore = OptionStore(False) + _, value = optstore.get_default_for_b_option('b_vscrt') + self.assertEqual(value, 'from_buildtype') |