Skip to content

Commit c62617e

Browse files
committed
options: replace all uses of get_value with get_value_for*
This was an unsafe version of the other function, but without proper subproject handling. In most cases (except unittests) the safe variant was actually better anyway, especially with the fallback parameter
1 parent a361b16 commit c62617e

File tree

15 files changed

+58
-69
lines changed

15 files changed

+58
-69
lines changed

mesonbuild/backend/ninjabackend.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -3827,8 +3827,7 @@ def generate_clangtool(self, name: str, extra_arg: T.Optional[str] = None, need_
38273827
if extra_arg:
38283828
target_name += f'-{extra_arg}'
38293829
extra_args.append(f'--{extra_arg}')
3830-
colorout = self.environment.coredata.optstore.get_value('b_colorout') \
3831-
if OptionKey('b_colorout') in self.environment.coredata.optstore else 'always'
3830+
colorout = self.environment.coredata.optstore.get_value_for(OptionKey('b_colorout'), str, fallback='always')
38323831
extra_args.extend(['--color', colorout])
38333832
if not os.path.exists(os.path.join(self.environment.source_dir, '.clang-' + name)) and \
38343833
not os.path.exists(os.path.join(self.environment.source_dir, '_clang-' + name)):

mesonbuild/backend/vs2010backend.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,7 @@ def generate_solution(self, sln_filename: str, projlist: T.List[Project]) -> Non
531531
replace_if_different(sln_filename, sln_filename_tmp)
532532

533533
def generate_projects(self, vslite_ctx: dict = None) -> T.List[Project]:
534-
startup_project = self.environment.coredata.optstore.get_value('backend_startup_project')
534+
startup_project = self.environment.coredata.optstore.get_value_for(OptionKey('backend_startup_project'), str)
535535
projlist: T.List[Project] = []
536536
startup_idx = 0
537537
for (i, (name, target)) in enumerate(self.build.targets.items()):

mesonbuild/compilers/mixins/emscripten.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ def _get_compile_output(self, dirname: str, mode: CompileCheckMode) -> str:
5050

5151
def thread_link_flags(self, env: 'Environment') -> T.List[str]:
5252
args = ['-pthread']
53-
count = env.coredata.optstore.get_value(OptionKey(f'{self.language}_thread_count', machine=self.for_machine))
54-
assert isinstance(count, int)
53+
count = env.coredata.optstore.get_value_for(OptionKey(f'{self.language}_thread_count', machine=self.for_machine), int)
5554
if count:
5655
args.append(f'-sPTHREAD_POOL_SIZE={count}')
5756
return args

mesonbuild/coredata.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,7 @@ def _set_others_from_buildtype(self, value: str) -> bool:
478478
def get_external_args(self, for_machine: MachineChoice, lang: str) -> T.List[str]:
479479
# mypy cannot analyze type of OptionKey
480480
key = OptionKey(f'{lang}_args', machine=for_machine)
481-
return T.cast('T.List[str]', self.optstore.get_value(key))
481+
return self.optstore.get_value_for(key, list)
482482

483483
@lru_cache(maxsize=None)
484484
def get_external_link_args(self, for_machine: MachineChoice, lang: str) -> T.List[str]:
@@ -589,7 +589,7 @@ def process_compiler_options(self, lang: str, comp: Compiler, subproject: str) -
589589

590590
def emit_base_options_warnings(self) -> None:
591591
bcodekey = OptionKey('b_bitcode')
592-
if bcodekey in self.optstore and self.optstore.get_value(bcodekey):
592+
if bcodekey in self.optstore and self.optstore.get_value_for(bcodekey, bool):
593593
msg = textwrap.dedent('''Base option 'b_bitcode' is enabled, which is incompatible with many linker options.
594594
Incompatible options such as \'b_asneeded\' have been disabled.'
595595
Please see https://mesonbuild.com/Builtin-options.html#Notes_about_Apple_Bitcode_support for more details.''')

mesonbuild/dependencies/pkgconfig.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -419,7 +419,7 @@ def _search_libs(self, libs_in: ImmutableListProtocol[str], raw_libs_in: Immutab
419419
#
420420
# Only prefix_libpaths are reordered here because there should not be
421421
# too many system_libpaths to cause library version issues.
422-
pkg_config_path: T.List[str] = self.env.coredata.optstore.get_value(OptionKey('pkg_config_path', machine=self.for_machine)) # type: ignore[assignment]
422+
pkg_config_path = self.env.coredata.optstore.get_value_for(OptionKey('pkg_config_path', machine=self.for_machine), list)
423423
pkg_config_path = self._convert_mingw_paths(pkg_config_path)
424424
prefix_libpaths = OrderedSet(sort_libpaths(list(prefix_libpaths), pkg_config_path))
425425
system_libpaths: OrderedSet[str] = OrderedSet()

mesonbuild/dependencies/python.py

+3-4
Original file line numberDiff line numberDiff line change
@@ -249,10 +249,9 @@ def get_windows_link_args(self, limited_api: bool) -> T.Optional[T.List[str]]:
249249
# `debugoptimized` buildtype may not set debug=True currently, see gh-11645
250250
is_debug_build = debug or buildtype == 'debug'
251251
vscrt_debug = False
252-
if OptionKey('b_vscrt') in self.env.coredata.optstore:
253-
vscrt = self.env.coredata.optstore.get_value('b_vscrt')
254-
if vscrt in {'mdd', 'mtd', 'from_buildtype', 'static_from_buildtype'}:
255-
vscrt_debug = True
252+
vscrt = self.env.coredata.optstore.get_value_for(OptionKey('b_vscrt'), str, fallback='meson-sentinel')
253+
if vscrt in {'mdd', 'mtd', 'from_buildtype', 'static_from_buildtype'}:
254+
vscrt_debug = True
256255
if is_debug_build and vscrt_debug and not self.variables.get('Py_DEBUG'):
257256
mlog.warning(textwrap.dedent('''\
258257
Using a debug build type with MSVC or an MSVC-compatible compiler

mesonbuild/interpreter/interpreter.py

+8-12
Original file line numberDiff line numberDiff line change
@@ -3059,18 +3059,14 @@ def print_extra_warnings(self) -> None:
30593059
break
30603060

30613061
def check_clang_asan_lundef(self) -> None:
3062-
if OptionKey('b_lundef') not in self.coredata.optstore:
3063-
return
3064-
if OptionKey('b_sanitize') not in self.coredata.optstore:
3065-
return
3066-
if (self.coredata.optstore.get_value('b_lundef') and
3067-
self.coredata.optstore.get_value('b_sanitize')):
3068-
value = self.coredata.optstore.get_value('b_sanitize')
3069-
mlog.warning(textwrap.dedent(f'''\
3070-
Trying to use {value} sanitizer on Clang with b_lundef.
3071-
This will probably not work.
3072-
Try setting b_lundef to false instead.'''),
3073-
location=self.current_node) # noqa: E128
3062+
if self.coredata.optstore.get_value_for(OptionKey('b_lundef'), bool, fallback=False):
3063+
value = self.coredata.optstore.get_value_for(OptionKey('b_sanitize'), list, fallback=[])
3064+
if value:
3065+
mlog.warning(textwrap.dedent(f'''\
3066+
Trying to use {value} sanitizer on Clang with b_lundef.
3067+
This will probably not work.
3068+
Try setting b_lundef to false instead.'''),
3069+
location=self.current_node) # noqa: E128
30743070

30753071
# Check that the indicated file is within the same subproject
30763072
# as we currently are. This is to stop people doing

mesonbuild/modules/gnome.py

+2-3
Original file line numberDiff line numberDiff line change
@@ -910,9 +910,8 @@ def _get_langs_compilers_flags(state: 'ModuleState', langs_compilers: T.List[T.T
910910
cflags += state.global_args[lang]
911911
if state.project_args.get(lang):
912912
cflags += state.project_args[lang]
913-
if OptionKey('b_sanitize') in compiler.base_options:
914-
sanitize = state.environment.coredata.optstore.get_value('b_sanitize')
915-
assert isinstance(sanitize, list)
913+
sanitize = state.environment.coredata.optstore.get_value_for(OptionKey('b_sanitize'), list, fallback=[])
914+
if sanitize:
916915
cflags += compiler.sanitizer_compile_args(sanitize)
917916
# These must be first in ldflags
918917
if 'address' in sanitize:

mesonbuild/modules/python.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ def extension_module_method(self, args: T.Tuple[str, T.List[BuildTargetSource]],
207207

208208
new_link_args = mesonlib.extract_as_list(kwargs, 'link_args')
209209

210-
is_debug = self.interpreter.environment.coredata.optstore.get_value('debug')
210+
is_debug = self.interpreter.environment.coredata.optstore.get_value_for(OptionKey('debug'), bool)
211211
if is_debug:
212212
new_link_args.append(python_windows_debug_link_exception)
213213
else:

mesonbuild/modules/rust.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
from ..interpreterbase import ContainerTypeInfo, InterpreterException, KwargInfo, typed_kwargs, typed_pos_args, noPosargs, permittedKwargs
2222
from ..interpreter.interpreterobjects import Doctest
2323
from ..mesonlib import File, MesonException, PerMachine
24+
from ..options import OptionKey
2425
from ..programs import ExternalProgram, NonExistingExternalProgram
2526

2627
if T.TYPE_CHECKING:
@@ -439,8 +440,7 @@ def bindgen(self, state: ModuleState, args: T.List, kwargs: FuncBindgen) -> Modu
439440
if self._bindgen_rust_target and '--rust-target' not in cmd:
440441
cmd.extend(['--rust-target', self._bindgen_rust_target])
441442
if self._bindgen_set_std and '--rust-edition' not in cmd:
442-
rust_std = state.environment.coredata.optstore.get_value('rust_std')
443-
assert isinstance(rust_std, str), 'for mypy'
443+
rust_std = state.environment.coredata.optstore.get_value_for(OptionKey('rust_std'), str)
444444
if rust_std != 'none':
445445
cmd.extend(['--rust-edition', rust_std])
446446
cmd.append('--')

mesonbuild/options.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -846,9 +846,6 @@ def get_pending_value(self, key: T.Union[OptionKey, str], default: T.Optional[El
846846
return self.options[key].value
847847
return self.pending_options.get(key, default)
848848

849-
def get_value(self, key: T.Union[OptionKey, str]) -> ElementaryOptionValues:
850-
return self.get_value_object(key).value
851-
852849
def __len__(self) -> int:
853850
return len(self.options)
854851

@@ -1161,7 +1158,7 @@ def get_default_for_b_option(self, key: OptionKey) -> ElementaryOptionValues:
11611158
assert self.is_base_option(key)
11621159
try:
11631160
return T.cast('ElementaryOptionValues', COMPILER_BASE_OPTIONS[key.evolve(subproject=None)].default)
1164-
except KeyErrorexcept Key:
1161+
except KeyError:
11651162
raise MesonBugException(f'Requested base option {key} which does not exist.')
11661163

11671164
def remove(self, key: OptionKey) -> None:

unittests/allplatformstests.py

+30-30
Original file line numberDiff line numberDiff line change
@@ -2677,35 +2677,35 @@ def test_command_line(self):
26772677
out = self.init(testdir, extra_args=['--profile-self', '--fatal-meson-warnings'])
26782678
self.assertNotIn('[default: true]', out)
26792679
obj = mesonbuild.coredata.load(self.builddir)
2680-
self.assertEqual(obj.optstore.get_value('default_library'), 'static')
2681-
self.assertEqual(obj.optstore.get_value('warning_level'), '1')
2682-
self.assertEqual(obj.optstore.get_value(OptionKey('set_sub_opt', '')), True)
2683-
self.assertEqual(obj.optstore.get_value(OptionKey('subp_opt', 'subp')), 'default3')
2680+
self.assertEqual(obj.optstore.get_value_for_unsafe('default_library'), 'static')
2681+
self.assertEqual(obj.optstore.get_value_for_unsafe('warning_level'), '1')
2682+
self.assertEqual(obj.optstore.get_value_for_unsafe(OptionKey('set_sub_opt', '')), True)
2683+
self.assertEqual(obj.optstore.get_value_for_unsafe(OptionKey('subp_opt', 'subp')), 'default3')
26842684
self.wipe()
26852685

26862686
# warning_level is special, it's --warnlevel instead of --warning-level
26872687
# for historical reasons
26882688
self.init(testdir, extra_args=['--warnlevel=2', '--fatal-meson-warnings'])
26892689
obj = mesonbuild.coredata.load(self.builddir)
2690-
self.assertEqual(obj.optstore.get_value('warning_level'), '2')
2690+
self.assertEqual(obj.optstore.get_value_for_unsafe('warning_level'), '2')
26912691
self.setconf('--warnlevel=3')
26922692
obj = mesonbuild.coredata.load(self.builddir)
2693-
self.assertEqual(obj.optstore.get_value('warning_level'), '3')
2693+
self.assertEqual(obj.optstore.get_value_for_unsafe('warning_level'), '3')
26942694
self.setconf('--warnlevel=everything')
26952695
obj = mesonbuild.coredata.load(self.builddir)
2696-
self.assertEqual(obj.optstore.get_value('warning_level'), 'everything')
2696+
self.assertEqual(obj.optstore.get_value_for_unsafe('warning_level'), 'everything')
26972697
self.wipe()
26982698

26992699
# But when using -D syntax, it should be 'warning_level'
27002700
self.init(testdir, extra_args=['-Dwarning_level=2', '--fatal-meson-warnings'])
27012701
obj = mesonbuild.coredata.load(self.builddir)
2702-
self.assertEqual(obj.optstore.get_value('warning_level'), '2')
2702+
self.assertEqual(obj.optstore.get_value_for_unsafe('warning_level'), '2')
27032703
self.setconf('-Dwarning_level=3')
27042704
obj = mesonbuild.coredata.load(self.builddir)
2705-
self.assertEqual(obj.optstore.get_value('warning_level'), '3')
2705+
self.assertEqual(obj.optstore.get_value_for_unsafe('warning_level'), '3')
27062706
self.setconf('-Dwarning_level=everything')
27072707
obj = mesonbuild.coredata.load(self.builddir)
2708-
self.assertEqual(obj.optstore.get_value('warning_level'), 'everything')
2708+
self.assertEqual(obj.optstore.get_value_for_unsafe('warning_level'), 'everything')
27092709
self.wipe()
27102710

27112711
# Mixing --option and -Doption is forbidden
@@ -2729,15 +2729,15 @@ def test_command_line(self):
27292729
# --default-library should override default value from project()
27302730
self.init(testdir, extra_args=['--default-library=both', '--fatal-meson-warnings'])
27312731
obj = mesonbuild.coredata.load(self.builddir)
2732-
self.assertEqual(obj.optstore.get_value('default_library'), 'both')
2732+
self.assertEqual(obj.optstore.get_value_for_unsafe('default_library'), 'both')
27332733
self.setconf('--default-library=shared')
27342734
obj = mesonbuild.coredata.load(self.builddir)
2735-
self.assertEqual(obj.optstore.get_value('default_library'), 'shared')
2735+
self.assertEqual(obj.optstore.get_value_for_unsafe('default_library'), 'shared')
27362736
if self.backend is Backend.ninja:
27372737
# reconfigure target works only with ninja backend
27382738
self.build('reconfigure')
27392739
obj = mesonbuild.coredata.load(self.builddir)
2740-
self.assertEqual(obj.optstore.get_value('default_library'), 'shared')
2740+
self.assertEqual(obj.optstore.get_value_for_unsafe('default_library'), 'shared')
27412741
self.wipe()
27422742

27432743
# Should fail on unknown options
@@ -2774,22 +2774,22 @@ def test_command_line(self):
27742774
# Test we can set subproject option
27752775
self.init(testdir, extra_args=['-Dsubp:subp_opt=foo', '--fatal-meson-warnings'])
27762776
obj = mesonbuild.coredata.load(self.builddir)
2777-
self.assertEqual(obj.optstore.get_value(OptionKey('subp_opt', 'subp')), 'foo')
2777+
self.assertEqual(obj.optstore.get_value_for_unsafe(OptionKey('subp_opt', 'subp')), 'foo')
27782778
self.wipe()
27792779

27802780
# c_args value should be parsed with split_args
27812781
self.init(testdir, extra_args=['-Dc_args=-Dfoo -Dbar "-Dthird=one two"', '--fatal-meson-warnings'])
27822782
obj = mesonbuild.coredata.load(self.builddir)
2783-
self.assertEqual(obj.optstore.get_value(OptionKey('c_args')), ['-Dfoo', '-Dbar', '-Dthird=one two'])
2783+
self.assertEqual(obj.optstore.get_value_for_unsafe(OptionKey('c_args')), ['-Dfoo', '-Dbar', '-Dthird=one two'])
27842784

27852785
self.setconf('-Dc_args="foo bar" one two')
27862786
obj = mesonbuild.coredata.load(self.builddir)
2787-
self.assertEqual(obj.optstore.get_value(OptionKey('c_args')), ['foo bar', 'one', 'two'])
2787+
self.assertEqual(obj.optstore.get_value_for_unsafe(OptionKey('c_args')), ['foo bar', 'one', 'two'])
27882788
self.wipe()
27892789

27902790
self.init(testdir, extra_args=['-Dset_percent_opt=myoption%', '--fatal-meson-warnings'])
27912791
obj = mesonbuild.coredata.load(self.builddir)
2792-
self.assertEqual(obj.optstore.get_value(OptionKey('set_percent_opt', '')), 'myoption%')
2792+
self.assertEqual(obj.optstore.get_value_for_unsafe(OptionKey('set_percent_opt', '')), 'myoption%')
27932793
self.wipe()
27942794

27952795
# Setting a 2nd time the same option should override the first value
@@ -2800,19 +2800,19 @@ def test_command_line(self):
28002800
'-Dc_args=-Dfoo', '-Dc_args=-Dbar',
28012801
'-Db_lundef=false', '--fatal-meson-warnings'])
28022802
obj = mesonbuild.coredata.load(self.builddir)
2803-
self.assertEqual(obj.optstore.get_value('bindir'), 'bar')
2804-
self.assertEqual(obj.optstore.get_value('buildtype'), 'release')
2805-
self.assertEqual(obj.optstore.get_value('b_sanitize'), ['thread'])
2806-
self.assertEqual(obj.optstore.get_value(OptionKey('c_args')), ['-Dbar'])
2803+
self.assertEqual(obj.optstore.get_value_for_unsafe('bindir'), 'bar')
2804+
self.assertEqual(obj.optstore.get_value_for_unsafe('buildtype'), 'release')
2805+
self.assertEqual(obj.optstore.get_value_for_unsafe('b_sanitize'), ['thread'])
2806+
self.assertEqual(obj.optstore.get_value_for_unsafe(OptionKey('c_args')), ['-Dbar'])
28072807
self.setconf(['--bindir=bar', '--bindir=foo',
28082808
'-Dbuildtype=release', '-Dbuildtype=plain',
28092809
'-Db_sanitize=thread', '-Db_sanitize=address',
28102810
'-Dc_args=-Dbar', '-Dc_args=-Dfoo'])
28112811
obj = mesonbuild.coredata.load(self.builddir)
2812-
self.assertEqual(obj.optstore.get_value('bindir'), 'foo')
2813-
self.assertEqual(obj.optstore.get_value('buildtype'), 'plain')
2814-
self.assertEqual(obj.optstore.get_value('b_sanitize'), ['address'])
2815-
self.assertEqual(obj.optstore.get_value(OptionKey('c_args')), ['-Dfoo'])
2812+
self.assertEqual(obj.optstore.get_value_for_unsafe('bindir'), 'foo')
2813+
self.assertEqual(obj.optstore.get_value_for_unsafe('buildtype'), 'plain')
2814+
self.assertEqual(obj.optstore.get_value_for_unsafe('b_sanitize'), ['address'])
2815+
self.assertEqual(obj.optstore.get_value_for_unsafe(OptionKey('c_args')), ['-Dfoo'])
28162816
self.wipe()
28172817
except KeyError:
28182818
# Ignore KeyError, it happens on CI for compilers that does not
@@ -2826,25 +2826,25 @@ def test_warning_level_0(self):
28262826
# Verify default values when passing no args
28272827
self.init(testdir)
28282828
obj = mesonbuild.coredata.load(self.builddir)
2829-
self.assertEqual(obj.optstore.get_value('warning_level'), '0')
2829+
self.assertEqual(obj.optstore.get_value_for_unsafe('warning_level'), '0')
28302830
self.wipe()
28312831

28322832
# verify we can override w/ --warnlevel
28332833
self.init(testdir, extra_args=['--warnlevel=1'])
28342834
obj = mesonbuild.coredata.load(self.builddir)
2835-
self.assertEqual(obj.optstore.get_value('warning_level'), '1')
2835+
self.assertEqual(obj.optstore.get_value_for_unsafe('warning_level'), '1')
28362836
self.setconf('--warnlevel=0')
28372837
obj = mesonbuild.coredata.load(self.builddir)
2838-
self.assertEqual(obj.optstore.get_value('warning_level'), '0')
2838+
self.assertEqual(obj.optstore.get_value_for_unsafe('warning_level'), '0')
28392839
self.wipe()
28402840

28412841
# verify we can override w/ -Dwarning_level
28422842
self.init(testdir, extra_args=['-Dwarning_level=1'])
28432843
obj = mesonbuild.coredata.load(self.builddir)
2844-
self.assertEqual(obj.optstore.get_value('warning_level'), '1')
2844+
self.assertEqual(obj.optstore.get_value_for_unsafe('warning_level'), '1')
28452845
self.setconf('-Dwarning_level=0')
28462846
obj = mesonbuild.coredata.load(self.builddir)
2847-
self.assertEqual(obj.optstore.get_value('warning_level'), '0')
2847+
self.assertEqual(obj.optstore.get_value_for_unsafe('warning_level'), '0')
28482848
self.wipe()
28492849

28502850
def test_feature_check_usage_subprojects(self):

unittests/datatests.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -168,9 +168,9 @@ def remove_module_name(key: OptionKey) -> OptionKey:
168168
else:
169169
raise RuntimeError(f'Invalid debug value {debug!r} in row:\n{m.group()}')
170170
env.coredata.set_option(OptionKey('buildtype'), buildtype)
171-
self.assertEqual(env.coredata.optstore.get_value('buildtype'), buildtype)
172-
self.assertEqual(env.coredata.optstore.get_value('optimization'), opt)
173-
self.assertEqual(env.coredata.optstore.get_value('debug'), debug)
171+
self.assertEqual(env.coredata.optstore.get_value_for_unsafe('buildtype'), buildtype)
172+
self.assertEqual(env.coredata.optstore.get_value_for_unsafe('optimization'), opt)
173+
self.assertEqual(env.coredata.optstore.get_value_for_unsafe('debug'), debug)
174174

175175
def test_cpu_families_documented(self):
176176
with open("docs/markdown/Reference-tables.md", encoding='utf-8') as f:

0 commit comments

Comments
 (0)