Skip to content

Commit f95c2bb

Browse files
bonzinijpakkane
authored andcommitted
options: give priority to parent augments over child default_options
Restore behavior of 1.7. Signed-off-by: Paolo Bonzini <[email protected]>
1 parent 70ebe33 commit f95c2bb

File tree

2 files changed

+41
-5
lines changed

2 files changed

+41
-5
lines changed

mesonbuild/options.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,16 +1357,32 @@ def initialize_from_subproject_call(self,
13571357
project_default_options: OptionDict,
13581358
cmd_line_options: OptionDict,
13591359
machine_file_options: OptionDict) -> None:
1360-
# pick up pending per-project settings from the toplevel project() invocation
1361-
options = {k: v for k, v in self.pending_subproject_options.items() if k.subproject == subproject}
13621360

1363-
# apply project() and subproject() default_options
1364-
for key, valstr in itertools.chain(project_default_options.items(), spcall_default_options.items()):
1361+
options: OptionDict = {}
1362+
1363+
# project() default_options
1364+
for key, valstr in project_default_options.items():
1365+
if key.subproject == subproject:
1366+
without_subp = key.evolve(subproject=None)
1367+
raise MesonException(f'subproject name not needed in default_options; use "{without_subp}" instead of "{key}"')
1368+
13651369
if key.subproject is None:
13661370
key = key.evolve(subproject=subproject)
1367-
elif key.subproject == subproject:
1371+
options[key] = valstr
1372+
1373+
# augments from the toplevel project() default_options
1374+
for key, valstr in self.pending_subproject_options.items():
1375+
if key.subproject == subproject:
1376+
options[key] = valstr
1377+
1378+
# subproject() default_options
1379+
for key, valstr in spcall_default_options.items():
1380+
if key.subproject == subproject:
13681381
without_subp = key.evolve(subproject=None)
13691382
raise MesonException(f'subproject name not needed in default_options; use "{without_subp}" instead of "{key}"')
1383+
1384+
if key.subproject is None:
1385+
key = key.evolve(subproject=subproject)
13701386
options[key] = valstr
13711387

13721388
# then global settings from machine file and command line

unittests/optiontests.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,26 @@ def test_subproject_cmdline_override_global(self):
274274
self.assertEqual(optstore.get_value_for(name, subp), new_value)
275275
self.assertEqual(optstore.get_value_for(name), new_value)
276276

277+
def test_subproject_parent_override_subp(self):
278+
name = 'optimization'
279+
subp = 'subp'
280+
default_value = 's'
281+
subp_value = '0'
282+
283+
optstore = OptionStore(False)
284+
prefix = UserStringOption('prefix', 'This is needed by OptionStore', '/usr')
285+
optstore.add_system_option('prefix', prefix)
286+
o = UserComboOption(name, 'Optimization level', '0', choices=['plain', '0', 'g', '1', '2', '3', 's'])
287+
optstore.add_system_option(name, o)
288+
289+
toplevel_proj_default = {OptionKey(name, subproject=subp): subp_value, OptionKey(name): default_value}
290+
subp_proj_default = {OptionKey(name): '3'}
291+
292+
optstore.initialize_from_top_level_project_call(toplevel_proj_default, {}, {})
293+
optstore.initialize_from_subproject_call(subp, {}, subp_proj_default, {}, {})
294+
self.assertEqual(optstore.get_value_for(name, subp), subp_value)
295+
self.assertEqual(optstore.get_value_for(name), default_value)
296+
277297
def test_subproject_cmdline_override_global_and_augment(self):
278298
name = 'optimization'
279299
subp = 'subp'

0 commit comments

Comments
 (0)