Accept builtin options with -D when making initial meson call

Currently meson only accepts `-Dopt=value` for builtin options when
calling `meson configure` and `--opt=value` for builtin options when
calling `meson` initially. This is a confusing behavior, and users only
get a small warning at the top of a potentially long configuration
summary to catch this.

This has confused end users and developers alike, there are at least 5
duplicates of the bug this fixes, and I have personally been asked about
this more times than I can count. The help documentation doesn't make
it clear that -D cannot be used to set options like prefix and bindir.

This adds support for -D options to the initial meson call, but not --
options to the meson configure call. I think it's better to have one way
to do things, and -- options are kinda one off while -D is used
everywhere else, so lets stick with that.

Related #969
pull/3243/head
Dylan Baker 7 years ago
parent cdefc15285
commit 78e37c4953
  1. 6
      docs/markdown/snippets/d-options-for-meson-setup.md
  2. 20
      mesonbuild/mesonmain.py

@ -0,0 +1,6 @@
## Meson now accepts -D for builtin arguments at setup time like configure time
Previously meson required that builtin arguments (like prefix) be passed as
`--prefix` to `meson` and `-Dprefix` to `meson configure`. Meson now accepts -D
form like meson configure does. `meson configure` still does not accept the
`--prefix` form.

@ -69,6 +69,25 @@ def wrapmodetype(string):
msg = 'invalid argument {!r}, use one of {}'.format(string, msg)
raise argparse.ArgumentTypeError(msg)
def filter_builtin_options(args, original_args):
"""Filter out any builtin arguments passed as -D options.
Error if an argument is passed with -- and -D
"""
arguments = dict(p.split('=', 1) for p in args.projectoptions)
meson_opts = set(arguments).intersection(set(coredata.builtin_options))
if meson_opts:
for arg in meson_opts:
value = arguments[arg]
if any([a.startswith('--{}'.format(arg)) for a in original_args]):
raise MesonException(
'Argument "{0}" passed as both --{0} and -D{0}, but only '
'one is allowed'.format(arg))
setattr(args, coredata.get_builtin_option_destination(arg), value)
# Remove the builtin option from the project args values
args.projectoptions.remove('{}={}'.format(arg, value))
class MesonApp:
def __init__(self, dir1, dir2, script_launcher, handshake, options, original_cmd_line_args):
@ -320,6 +339,7 @@ def run(original_args, mainfile=None):
args = mesonlib.expand_arguments(args)
options = parser.parse_args(args)
filter_builtin_options(options, args)
args = options.directories
if not args or len(args) > 2:
# if there's a meson.build in the dir above, and not in the current

Loading…
Cancel
Save