summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2025-03-03 10:52:11 -0800
committerJussi Pakkanen <jpakkane@gmail.com>2025-03-05 18:06:11 +0200
commitf2ead0092f699356809732968a6d3d082b4989ae (patch)
tree04a6e31e917af15ebaf2f51ab50f031eba32517e
parentc227f38560dba23b606ff3336def167c1506283d (diff)
downloadmeson-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.py8
-rw-r--r--mesonbuild/mesonmain.py2
-rw-r--r--mesonbuild/options.py72
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.