summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2025-05-05 13:20:16 +0200
committerDylan Baker <dylan@pnwbakers.com>2025-05-07 09:43:43 -0700
commit82bcab13d3088c1907a9a530795aa36f1e7e84b5 (patch)
treeb436f1bcd7177e11ad800345a699cfa58dd0d201
parente092bed1a487bf66b0929bcb6a3a7266e7073419 (diff)
downloadmeson-82bcab13d3088c1907a9a530795aa36f1e7e84b5.tar.gz
options: early convert project default options to dictionary
This makes it possible to remove all list cases from first_handle_prefix and callees. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--mesonbuild/options.py50
1 files changed, 17 insertions, 33 deletions
diff --git a/mesonbuild/options.py b/mesonbuild/options.py
index c6ae4b20d..f8408bb72 100644
--- a/mesonbuild/options.py
+++ b/mesonbuild/options.py
@@ -1222,40 +1222,31 @@ class OptionStore:
perproject_global_options.append(strvaluetuple)
return (global_options, perproject_global_options, project_options)
- def optlist2optdict(self, optlist: T.List[str]) -> T.Dict[str, str]:
- optdict = {}
+ def optlist2optdict(self, optlist: T.List[str]) -> OptionStringLikeDict:
+ optdict: OptionStringLikeDict = {}
for p in optlist:
k, v = p.split('=', 1)
optdict[k] = v
return optdict
- def prefix_split_options(self, coll: T.Union[T.List[str], OptionStringLikeDict]) -> T.Tuple[str, T.Union[T.List[str], OptionStringLikeDict]]:
+ def prefix_split_options(self, coll: OptionStringLikeDict) -> T.Tuple[str, OptionStringLikeDict]:
prefix = None
- if isinstance(coll, list):
- others: T.List[str] = []
- for e in coll:
- if e.startswith('prefix='):
- prefix = e.split('=', 1)[1]
- else:
- others.append(e)
- return (prefix, others)
- else:
- others_d: OptionStringLikeDict = {}
- for k, v in coll.items():
- if isinstance(k, OptionKey) and k.name == 'prefix':
- prefix = v
- elif k == 'prefix':
- prefix = v
- else:
- others_d[k] = v
- return (prefix, others_d)
+ others_d: OptionStringLikeDict = {}
+ for k, v in coll.items():
+ if isinstance(k, OptionKey) and k.name == 'prefix':
+ prefix = v
+ elif k == 'prefix':
+ prefix = v
+ else:
+ others_d[k] = v
+ return (prefix, others_d)
def first_handle_prefix(self,
- project_default_options: T.Union[T.List[str], OptionStringLikeDict],
+ project_default_options: OptionStringLikeDict,
cmd_line_options: OptionStringLikeDict,
machine_file_options: T.Mapping[OptionKey, ElementaryOptionValues]) \
- -> T.Tuple[T.Union[T.List[str], OptionStringLikeDict],
- T.Union[T.List[str], OptionStringLikeDict],
+ -> T.Tuple[OptionStringLikeDict,
+ OptionStringLikeDict,
T.MutableMapping[OptionKey, ElementaryOptionValues]]:
# Copy to avoid later mutation
nopref_machine_file_options = T.cast(
@@ -1294,16 +1285,11 @@ class OptionStore:
cmd_line_options_in: OptionStringLikeDict,
machine_file_options_in: T.Mapping[OptionKey, ElementaryOptionValues]) -> None:
first_invocation = True
+ if isinstance(project_default_options_in, list):
+ project_default_options_in = self.optlist2optdict(project_default_options_in)
(project_default_options, cmd_line_options, machine_file_options) = self.first_handle_prefix(project_default_options_in,
cmd_line_options_in,
machine_file_options_in)
- if isinstance(project_default_options, str):
- project_default_options = [project_default_options]
- if isinstance(project_default_options, list):
- project_default_options = self.optlist2optdict(project_default_options) # type: ignore [assignment]
- if project_default_options is None:
- project_default_options = {}
- assert isinstance(machine_file_options, dict)
for key, valstr in machine_file_options.items():
# Due to backwards compatibility we ignore all build-machine options
# when building natively.
@@ -1320,7 +1306,6 @@ class OptionStore:
self.set_option(proj_key, valstr, first_invocation)
else:
self.pending_options[key] = valstr
- assert isinstance(project_default_options, dict)
for keystr, valstr in project_default_options.items():
# Ths is complicated by the fact that a string can have two meanings:
#
@@ -1356,7 +1341,6 @@ class OptionStore:
self.set_option(proj_key, valstr)
else:
self.pending_options[key] = valstr
- assert isinstance(cmd_line_options, dict)
for keystr, valstr in cmd_line_options.items():
if isinstance(keystr, str):
key = OptionKey.from_string(keystr)