diff options
| author | Paolo Bonzini <pbonzini@redhat.com> | 2025-05-06 18:53:26 +0200 |
|---|---|---|
| committer | Dylan Baker <dylan@pnwbakers.com> | 2025-05-07 09:43:43 -0700 |
| commit | 5558453e18aa85aefd69112bb06ae7a375141b61 (patch) | |
| tree | 13aea114f4fafda547b49318ca7478feaa383bd6 /mesonbuild | |
| parent | 3a020bbd65270a69ca45a7102a4d67de5ac5ae03 (diff) | |
| download | meson-5558453e18aa85aefd69112bb06ae7a375141b61.tar.gz | |
interpreter: reintroduce a convertor for override_options and default_options
Replace optlist2optdict with a convertor. However, while default_options
should use OptionKeys like it did before the option refactoring,
override_options keeps using strings.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'mesonbuild')
| -rw-r--r-- | mesonbuild/build.py | 20 | ||||
| -rw-r--r-- | mesonbuild/interpreter/dependencyfallbacks.py | 2 | ||||
| -rw-r--r-- | mesonbuild/interpreter/interpreter.py | 4 | ||||
| -rw-r--r-- | mesonbuild/interpreter/type_checking.py | 25 | ||||
| -rw-r--r-- | mesonbuild/options.py | 15 |
5 files changed, 25 insertions, 41 deletions
diff --git a/mesonbuild/build.py b/mesonbuild/build.py index 7320b88fd..6ed333629 100644 --- a/mesonbuild/build.py +++ b/mesonbuild/build.py @@ -656,29 +656,11 @@ class Target(HoldableObject, metaclass=abc.ABCMeta): # set, use the value of 'install' if it's enabled. self.build_by_default = True - self.raw_overrides = self.parse_overrides(kwargs) + self.raw_overrides = kwargs.get('override_options', {}) def get_override(self, name: str) -> T.Optional[str]: return self.raw_overrides.get(name, None) - @staticmethod - def parse_overrides(kwargs: T.Dict[str, T.Any]) -> T.Dict[str, str]: - opts = kwargs.get('override_options', []) - - # In this case we have an already parsed and ready to go dictionary - # provided by typed_kwargs - if isinstance(opts, dict): - return T.cast('T.Dict[OptionKey, str]', opts) - - result: T.Dict[str, str] = {} - overrides = stringlistify(opts) - for o in overrides: - if '=' not in o: - raise InvalidArguments('Overrides must be of form "key=value"') - k, v = o.split('=', 1) - result[k] = v - return result - def is_linkable_target(self) -> bool: return False diff --git a/mesonbuild/interpreter/dependencyfallbacks.py b/mesonbuild/interpreter/dependencyfallbacks.py index 53eeb2911..3bbb43404 100644 --- a/mesonbuild/interpreter/dependencyfallbacks.py +++ b/mesonbuild/interpreter/dependencyfallbacks.py @@ -126,7 +126,7 @@ class DependencyFallbacksHolder(MesonInterpreterObject): if static is not None: default_library = 'static' if static else 'shared' mlog.log(f'Building fallback subproject with default_library={default_library}') - extra_default_options['default_library'] = default_library + extra_default_options[OptionKey('default_library')] = default_library # Configure the subproject subp_name = self.subproject_name diff --git a/mesonbuild/interpreter/interpreter.py b/mesonbuild/interpreter/interpreter.py index 2113362d8..59255bf3c 100644 --- a/mesonbuild/interpreter/interpreter.py +++ b/mesonbuild/interpreter/interpreter.py @@ -879,10 +879,6 @@ class Interpreter(InterpreterBase, HoldableObject): return self.disabled_subproject(subp_name, disabled_feature=feature) default_options = kwargs['default_options'] - if isinstance(default_options, str): - default_options = [default_options] - if isinstance(default_options, list): - default_options = dict((x.split('=', 1) for x in default_options)) if extra_default_options: default_options = {**extra_default_options, **default_options} diff --git a/mesonbuild/interpreter/type_checking.py b/mesonbuild/interpreter/type_checking.py index 78938ba9c..fbe3e3ec3 100644 --- a/mesonbuild/interpreter/type_checking.py +++ b/mesonbuild/interpreter/type_checking.py @@ -11,10 +11,10 @@ from .. import compilers from ..build import (CustomTarget, BuildTarget, CustomTargetIndex, ExtractedObjects, GeneratedList, IncludeDirs, BothLibraries, SharedLibrary, StaticLibrary, Jar, Executable, StructuredSources) -from ..options import UserFeatureOption +from ..options import OptionKey, UserFeatureOption from ..dependencies import Dependency, InternalDependency from ..interpreterbase.decorators import KwargInfo, ContainerTypeInfo -from ..mesonlib import (File, FileMode, MachineChoice, listify, has_path_sep, +from ..mesonlib import (File, FileMode, MachineChoice, has_path_sep, listify, stringlistify, EnvironmentVariables) from ..programs import ExternalProgram @@ -293,11 +293,22 @@ COMMAND_KW: KwargInfo[T.List[T.Union[str, BuildTarget, CustomTarget, CustomTarge ) -OVERRIDE_OPTIONS_KW: KwargInfo[T.Union[str, T.Dict[str, ElementaryOptionValues], T.List[str]]] = KwargInfo( +def _override_options_convertor(raw: T.Union[str, T.List[str], T.Dict[str, ElementaryOptionValues]]) -> T.Dict[str, ElementaryOptionValues]: + if isinstance(raw, dict): + return raw + raw = stringlistify(raw) + output: T.Dict[str, ElementaryOptionValues] = {} + for each in raw: + k, v = split_equal_string(each) + output[k] = v + return output + +OVERRIDE_OPTIONS_KW: KwargInfo[T.Union[str, T.List[str], T.Dict[str, ElementaryOptionValues]]] = KwargInfo( 'override_options', (str, ContainerTypeInfo(list, str), ContainerTypeInfo(dict, (str, int, bool, list))), default={}, validator=_options_validator, + convertor=_override_options_convertor, since_values={dict: '1.2.0'}, ) @@ -394,7 +405,13 @@ INCLUDE_DIRECTORIES: KwargInfo[T.List[T.Union[str, IncludeDirs]]] = KwargInfo( default=[], ) -DEFAULT_OPTIONS = OVERRIDE_OPTIONS_KW.evolve(name='default_options') +def _default_options_convertor(raw: T.Union[str, T.List[str], T.Dict[str, ElementaryOptionValues]]) -> T.Dict[OptionKey, ElementaryOptionValues]: + d = _override_options_convertor(raw) + return {OptionKey.from_string(k): v for k, v in d.items()} + +DEFAULT_OPTIONS = OVERRIDE_OPTIONS_KW.evolve( + name='default_options', + convertor=_default_options_convertor) ENV_METHOD_KW = KwargInfo('method', str, default='set', since='0.62.0', validator=in_set_validator({'set', 'prepend', 'append'})) diff --git a/mesonbuild/options.py b/mesonbuild/options.py index e520bb4ed..3653f5062 100644 --- a/mesonbuild/options.py +++ b/mesonbuild/options.py @@ -1220,13 +1220,6 @@ class OptionStore: perproject_global_options.append(valuetuple) return (global_options, perproject_global_options, project_options) - def optlist2optdict(self, optlist: T.List[str]) -> OptionDict: - optdict: OptionDict = {} - for p in optlist: - k, v = p.split('=', 1) - optdict[k] = v - return optdict - def prefix_split_options(self, coll: OptionDict) -> T.Tuple[T.Optional[str], OptionDict]: prefix = None others_d: OptionDict = {} @@ -1279,12 +1272,10 @@ class OptionStore: self.options[OptionKey('prefix')].set_value(prefix) def initialize_from_top_level_project_call(self, - project_default_options_in: T.Union[T.List[str], OptionDict], + project_default_options_in: OptionDict, cmd_line_options_in: OptionDict, 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) @@ -1380,11 +1371,9 @@ class OptionStore: def initialize_from_subproject_call(self, subproject: str, spcall_default_options: OptionDict, - project_default_options: T.Union[T.List[str], OptionDict], + project_default_options: OptionDict, cmd_line_options: OptionDict) -> None: is_first_invocation = True - if isinstance(project_default_options, list): - project_default_options = self.optlist2optdict(project_default_options) for keystr, valstr in itertools.chain(project_default_options.items(), spcall_default_options.items()): if isinstance(keystr, str): key = OptionKey.from_string(keystr) |
