summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2025-04-19 14:39:14 +0200
committerJussi Pakkanen <jpakkane@gmail.com>2025-04-24 17:49:05 +0300
commit8fe6edfa4f8b6e64a19bbae471f37a2750023af6 (patch)
treecaf3e1f4651156c81f8f88d961141ea6252367e3
parent705a63fc3a95c3a6fdb9506e07b1fd5e5c0522e4 (diff)
downloadmeson-8fe6edfa4f8b6e64a19bbae471f37a2750023af6.tar.gz
options: subproject system options require the global ones
Because system options apply to all subprojects, they need to be present globally whenever a subproject needs them. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--mesonbuild/options.py6
-rw-r--r--unittests/optiontests.py14
2 files changed, 20 insertions, 0 deletions
diff --git a/mesonbuild/options.py b/mesonbuild/options.py
index 2226e6bf0..62413b1a7 100644
--- a/mesonbuild/options.py
+++ b/mesonbuild/options.py
@@ -899,6 +899,12 @@ class OptionStore:
self.options[key] = valobj
pval = self.pending_options.pop(key, None)
+ if key.subproject:
+ proj_key = key.evolve(subproject=None)
+ self.add_system_option_internal(proj_key, valobj)
+ if pval is None:
+ pval = self.options[proj_key].value
+
if pval is not None:
self.set_option(key, pval)
diff --git a/unittests/optiontests.py b/unittests/optiontests.py
index 3b3ffc98e..5ed601fed 100644
--- a/unittests/optiontests.py
+++ b/unittests/optiontests.py
@@ -35,6 +35,20 @@ class OptionTests(unittest.TestCase):
optstore.initialize_from_top_level_project_call({OptionKey('someoption'): new_value}, {}, {})
self.assertEqual(optstore.get_value_for(k), new_value)
+ def test_subproject_system_option(self):
+ """Test that subproject system options get their default value from the global
+ option (e.g. "sub:b_lto" can be initialized from "b_lto")."""
+ optstore = OptionStore(False)
+ name = 'someoption'
+ default_value = 'somevalue'
+ new_value = 'new_value'
+ k = OptionKey(name)
+ subk = k.evolve(subproject='sub')
+ optstore.initialize_from_top_level_project_call({}, {}, {OptionKey(name): new_value})
+ vo = UserStringOption(k.name, 'An option of some sort', default_value)
+ optstore.add_system_option(subk, vo)
+ self.assertEqual(optstore.get_value_for(subk), new_value)
+
def test_parsing(self):
with self.subTest('subproject'):
s1 = OptionKey.from_string('sub:optname')