options: store augments as OptionKeys

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2025-05-05 13:30:22 +02:00 committed by Dylan Baker
parent 9bff9de834
commit 614aa835ed
2 changed files with 20 additions and 26 deletions

View File

@ -342,7 +342,7 @@ class Conf:
if self.coredata.optstore.augments:
mlog.log('\nCurrently set option augments:')
for k, v in self.coredata.optstore.augments.items():
mlog.log(f'{k:21}{v:10}')
mlog.log(f'{k!s:21}{v:10}')
else:
mlog.log('\nThere are no option augments.')

View File

@ -810,7 +810,7 @@ class OptionStore:
from .compilers import all_languages
self.all_languages = set(all_languages)
self.project_options = set()
self.augments: T.Dict[str, ElementaryOptionValues] = {}
self.augments: T.Dict[OptionKey, ElementaryOptionValues] = {}
self.is_cross = is_cross
# Pending options are options that need to be initialized later, either
@ -879,9 +879,8 @@ class OptionStore:
vobject = self.get_value_object_for(key)
computed_value = vobject.value
if key.subproject is not None:
keystr = str(key)
if keystr in self.augments:
computed_value = vobject.validate_value(self.augments[keystr])
if key in self.augments:
computed_value = vobject.validate_value(self.augments[key])
return (vobject, computed_value)
def get_value_for(self, name: 'T.Union[OptionKey, str]', subproject: T.Optional[str] = None) -> ElementaryOptionValues:
@ -1070,17 +1069,18 @@ class OptionStore:
dirty |= self.set_option_from_string(key, valstr)
for key, valstr in project_options:
dirty |= self.set_option_from_string(key, valstr)
for keystr, valstr in perproject_global_options:
if keystr in self.augments:
if self.augments[keystr] != valstr:
self.augments[keystr] = valstr
for key, valstr in perproject_global_options:
if key in self.augments:
if self.augments[key] != valstr:
self.augments[key] = valstr
dirty = True
else:
self.augments[keystr] = valstr
self.augments[key] = valstr
dirty = True
for delete in U_args:
if delete in self.augments:
del self.augments[delete]
for keystr in U_args:
key = OptionKey.from_string(keystr)
if key in self.augments:
del self.augments[key]
dirty = True
return dirty
@ -1203,7 +1203,7 @@ class OptionStore:
return key in self.module_options
def classify_D_arguments(self, D: T.List[str]) -> T.Tuple[T.List[T.Tuple[OptionKey, str]],
T.List[T.Tuple[str, str]],
T.List[T.Tuple[OptionKey, str]],
T.List[T.Tuple[OptionKey, str]]]:
global_options = []
project_options = []
@ -1217,9 +1217,7 @@ class OptionStore:
elif key.subproject is None:
global_options.append(valuetuple)
else:
# FIXME, augments are currently stored as strings, not OptionKeys
strvaluetuple = (keystr, valstr)
perproject_global_options.append(strvaluetuple)
perproject_global_options.append(valuetuple)
return (global_options, perproject_global_options, project_options)
def optlist2optdict(self, optlist: T.List[str]) -> OptionDict:
@ -1296,8 +1294,7 @@ class OptionStore:
if not self.is_cross and key.is_for_build():
continue
if key.subproject:
augstr = str(key)
self.augments[augstr] = valstr
self.augments[key] = valstr
elif key in self.options:
self.set_option(key, valstr, first_invocation)
else:
@ -1327,8 +1324,7 @@ class OptionStore:
if not self.is_cross and key.is_for_build():
continue
if key.subproject:
augstr = str(key)
self.augments[augstr] = valstr
self.augments[key] = valstr
elif key in self.options:
self.set_option(key, valstr, first_invocation)
else:
@ -1351,8 +1347,7 @@ class OptionStore:
if not self.is_cross and key.is_for_build():
continue
if key.subproject:
augstr = str(key)
self.augments[augstr] = valstr
self.augments[key] = valstr
elif key in self.options:
self.set_option(key, valstr, True)
else:
@ -1406,8 +1401,7 @@ class OptionStore:
self.set_option(key, valstr, is_first_invocation)
else:
self.pending_options.pop(key, None)
aug_str = str(key)
self.augments[aug_str] = valstr
self.augments[key] = valstr
# Check for pending options
for key, valstr in cmd_line_options.items(): # type: ignore [assignment]
if not isinstance(key, OptionKey):
@ -1418,7 +1412,7 @@ class OptionStore:
if key in self.options:
self.set_option(key, valstr, is_first_invocation)
else:
self.augments[str(key)] = valstr
self.augments[key] = valstr
def update_project_options(self, project_options: MutableKeyedOptionDictType, subproject: SubProject) -> None:
for key, value in project_options.items():