summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2025-02-18 13:37:04 +0200
committerDylan Baker <dylan@pnwbakers.com>2025-02-27 13:30:06 -0800
commit25f7e33a22967af8c8f91c46029a8fd4d5d78e78 (patch)
tree049c1d76309e327f4d8e5ebd4c9fb75c3d6874f9
parent8ebc8c1878852f914172b99135d2960429402204 (diff)
downloadmeson-25f7e33a22967af8c8f91c46029a8fd4d5d78e78.tar.gz
Maintain bw compatibility for requesting bad options.
Closes: #14255.
-rw-r--r--mesonbuild/interpreter/interpreter.py11
-rw-r--r--mesonbuild/options.py8
-rw-r--r--unittests/optiontests.py5
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')