diff options
| author | Dylan Baker <dylan@pnwbakers.com> | 2025-03-03 10:52:11 -0800 |
|---|---|---|
| committer | Jussi Pakkanen <jpakkane@gmail.com> | 2025-03-05 18:06:11 +0200 |
| commit | f2ead0092f699356809732968a6d3d082b4989ae (patch) | |
| tree | 04a6e31e917af15ebaf2f51ab50f031eba32517e | |
| parent | c227f38560dba23b606ff3336def167c1506283d (diff) | |
| download | meson-f2ead0092f699356809732968a6d3d082b4989ae.tar.gz | |
options: split UserOption -> Argparse conversion out of BuiltinOption
This is the first step do deleting the BuiltinOption altogether.
| -rw-r--r-- | mesonbuild/coredata.py | 8 | ||||
| -rw-r--r-- | mesonbuild/mesonmain.py | 2 | ||||
| -rw-r--r-- | mesonbuild/options.py | 72 |
3 files changed, 38 insertions, 44 deletions
diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py index 7bc3cc218..84b76f615 100644 --- a/mesonbuild/coredata.py +++ b/mesonbuild/coredata.py @@ -802,10 +802,10 @@ def save(obj: CoreData, build_dir: str) -> str: def register_builtin_arguments(parser: argparse.ArgumentParser) -> None: for n, b in options.BUILTIN_OPTIONS.items(): - b.add_to_argparse(n, parser, '') + options.option_to_argparse(b, n, parser, '') for n, b in options.BUILTIN_OPTIONS_PER_MACHINE.items(): - b.add_to_argparse(n, parser, ' (just for host machine)') - b.add_to_argparse(n.as_build(), parser, ' (just for build machine)') + options.option_to_argparse(b, n, parser, ' (just for host machine)') + options.option_to_argparse(b, n.as_build(), parser, ' (just for build machine)') parser.add_argument('-D', action='append', dest='projectoptions', default=[], metavar="option", help='Set the value of an option, can be used several times to set multiple options.') @@ -832,7 +832,7 @@ def parse_cmd_line_options(args: SharedCMDOptions) -> None: value = getattr(args, name, None) if value is not None: if key in args.cmd_line_options: - cmdline_name = options.BuiltinOption.argparse_name_to_arg(name) + cmdline_name = options.argparse_name_to_arg(name) raise MesonException( f'Got argument {name} as both -D{name} and {cmdline_name}. Pick one.') args.cmd_line_options[key.name] = value diff --git a/mesonbuild/mesonmain.py b/mesonbuild/mesonmain.py index 7ec66fce7..8a8678a9a 100644 --- a/mesonbuild/mesonmain.py +++ b/mesonbuild/mesonmain.py @@ -246,7 +246,7 @@ def validate_original_args(args): #ds = [x for x in args if x.startswith('-D')] #longs = [x for x in args if x.startswith('--')] for optionkey in itertools.chain(mesonbuild.options.BUILTIN_DIR_OPTIONS, mesonbuild.options.BUILTIN_CORE_OPTIONS): - longarg = mesonbuild.options.BuiltinOption.argparse_name_to_arg(optionkey.name) + longarg = mesonbuild.options.argparse_name_to_arg(optionkey.name) shortarg = f'-D{optionkey.name}' if has_startswith(args, longarg) and has_startswith(args, shortarg): sys.exit( diff --git a/mesonbuild/options.py b/mesonbuild/options.py index 78d2bef53..c4c445af1 100644 --- a/mesonbuild/options.py +++ b/mesonbuild/options.py @@ -655,56 +655,50 @@ class BuiltinOption(T.Generic[_T]): def init_option(self, name: 'OptionKey', value: T.Optional[T.Any], prefix: str) -> UserOption[_T]: """Create an instance of opt_type and return it.""" if value is None: - value = self.prefixed_default(name, prefix) + value = _argparse_prefixed_default(self, name, prefix) keywords = {'yielding': self.yielding, 'value_': value} keywords.update(self.kwargs) if self.choices: keywords['choices'] = self.choices - o = self.opt_type(name.name, self.description, **keywords) + # This will be fixed when the BuiltinOption class is deleted + o = self.opt_type(name.name, self.description, **keywords) # type: ignore o.readonly = self.readonly return o - def _argparse_action(self) -> T.Optional[str]: - # If the type is a boolean, the presence of the argument in --foo form - # is to enable it. Disabling happens by using -Dfoo=false, which is - # parsed under `args.projectoptions` and does not hit this codepath. - if isinstance(self.default, bool): - return 'store_true' - return None - @staticmethod - def argparse_name_to_arg(name: str) -> str: - if name == 'warning_level': - return '--warnlevel' - else: - return '--' + name.replace('_', '-') +def argparse_name_to_arg(name: str) -> str: + if name == 'warning_level': + return '--warnlevel' + return '--' + name.replace('_', '-') - def prefixed_default(self, name: 'OptionKey', prefix: str = '') -> T.Any: - if self.opt_type in {UserComboOption, UserIntegerOption, UserUmaskOption}: - return self.default - try: - return BUILTIN_DIR_NOPREFIX_OPTIONS[name][prefix] - except KeyError: - pass - return self.default - def add_to_argparse(self, name: OptionKey, parser: argparse.ArgumentParser, help_suffix: str) -> None: - kwargs: ArgparseKWs = {} +def _argparse_prefixed_default(opt: BuiltinOption, name: OptionKey, prefix: str = '') -> ElementaryOptionValues: + if opt.opt_type in {UserComboOption, UserIntegerOption, UserUmaskOption}: + return opt.default + try: + return BUILTIN_DIR_NOPREFIX_OPTIONS[name][prefix] + except KeyError: + return T.cast('ElementaryOptionValues', opt.default) + + +def option_to_argparse(option: BuiltinOption, name: OptionKey, parser: argparse.ArgumentParser, help_suffix: str) -> None: + kwargs: ArgparseKWs = {} + + c = option.choices + b = 'store_true' if isinstance(option.default, bool) else None + h = option.description + if not b: + h = '{} (default: {}).'.format(h.rstrip('.'), _argparse_prefixed_default(option, name)) + else: + kwargs['action'] = b + if c and not b: + kwargs['choices'] = c + kwargs['default'] = argparse.SUPPRESS + kwargs['dest'] = str(name) + + cmdline_name = argparse_name_to_arg(str(name)) + parser.add_argument(cmdline_name, help=h + help_suffix, **kwargs) - c = self.choices - b = self._argparse_action() - h = self.description - if not b: - h = '{} (default: {}).'.format(h.rstrip('.'), self.prefixed_default(name)) - else: - kwargs['action'] = b - if c and not b: - kwargs['choices'] = c - kwargs['default'] = argparse.SUPPRESS - kwargs['dest'] = str(name) - - cmdline_name = self.argparse_name_to_arg(str(name)) - parser.add_argument(cmdline_name, help=h + help_suffix, **kwargs) # Update `docs/markdown/Builtin-options.md` after changing the options below # Also update mesonlib._BUILTIN_NAMES. See the comment there for why this is required. |
