diff options
| -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 9c37ffb25..0b16266f7 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 8cad1d1ca..8d4f22fdc 100644 --- a/mesonbuild/options.py +++ b/mesonbuild/options.py @@ -1107,6 +1107,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 (T.cast('AnyOptionType', 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 94d52ae2e..845eba0b9 100644 --- a/unittests/optiontests.py +++ b/unittests/optiontests.py @@ -198,3 +198,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') |
