Maintain bw compatibility for requesting bad options. Closes: #14255.
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 @@ 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 @@ (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 @@ 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')