diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2018-04-17 23:29:15 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-17 23:29:15 +0300 |
commit | 1952ef5ae13376084dc277de38ff3a6dafb8e595 (patch) | |
tree | b0ac33ea58e6ef4d92aca54f21d4c924fd43d821 | |
parent | 8ee1e49ae683cbd7eb10da37327062a490cbee70 (diff) | |
parent | 1c48cc08e09b1ea860a4972b752d4f053433fa6f (diff) | |
download | meson-1952ef5ae13376084dc277de38ff3a6dafb8e595.zip meson-1952ef5ae13376084dc277de38ff3a6dafb8e595.tar.gz meson-1952ef5ae13376084dc277de38ff3a6dafb8e595.tar.bz2 |
Merge pull request #3243 from dcbaker/accept-d-setup
Accept -D for meson level options durring initial configuration
-rw-r--r-- | docs/markdown/snippets/d-options-for-meson-setup.md | 6 | ||||
-rw-r--r-- | mesonbuild/coredata.py | 38 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 6 | ||||
-rw-r--r-- | mesonbuild/mconf.py | 15 | ||||
-rw-r--r-- | mesonbuild/mesonmain.py | 60 |
5 files changed, 84 insertions, 41 deletions
diff --git a/docs/markdown/snippets/d-options-for-meson-setup.md b/docs/markdown/snippets/d-options-for-meson-setup.md new file mode 100644 index 0000000..37afbe0 --- /dev/null +++ b/docs/markdown/snippets/d-options-for-meson-setup.md @@ -0,0 +1,6 @@ +## Meson and meson configure now accept the same arguments + +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` has. `meson configure` also accepts the `--prefix` +form, like `meson` has. diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py index 918671a..ba4f495 100644 --- a/mesonbuild/coredata.py +++ b/mesonbuild/coredata.py @@ -20,6 +20,7 @@ from collections import OrderedDict from .mesonlib import MesonException from .mesonlib import default_libdir, default_libexecdir, default_prefix import ast +import argparse version = '0.46.0.dev1' backendlist = ['ninja', 'vs', 'vs2010', 'vs2015', 'vs2017', 'xcode'] @@ -359,6 +360,20 @@ def get_builtin_option_description(optname): else: raise RuntimeError('Tried to get the description for an unknown builtin option \'%s\'.' % optname) +def get_builtin_option_action(optname): + default = builtin_options[optname][2] + if default is True: + return 'store_false' + elif default is False: + return 'store_true' + return None + +def get_builtin_option_destination(optname): + optname = optname.replace('-', '_') + if optname == 'warnlevel': + return 'warning_level' + return optname + def get_builtin_option_default(optname, prefix='', noneIfSuppress=False): if is_builtin_option(optname): o = builtin_options[optname] @@ -376,6 +391,29 @@ def get_builtin_option_default(optname, prefix='', noneIfSuppress=False): else: raise RuntimeError('Tried to get the default value for an unknown builtin option \'%s\'.' % optname) +def add_builtin_argument(p, name): + kwargs = {} + k = get_builtin_option_destination(name) + c = get_builtin_option_choices(k) + b = get_builtin_option_action(k) + h = get_builtin_option_description(k) + if not b: + h = h.rstrip('.') + ' (default: %s).' % get_builtin_option_default(k) + else: + kwargs['action'] = b + if c and not b: + kwargs['choices'] = c + default = get_builtin_option_default(k, noneIfSuppress=True) + if default is not None: + kwargs['default'] = default + else: + kwargs['default'] = argparse.SUPPRESS + p.add_argument('--' + name.replace('_', '-'), help=h, **kwargs) + +def register_builtin_arguments(parser): + for n in builtin_options: + add_builtin_argument(parser, n) + builtin_options = { 'buildtype': [UserComboOption, 'Build type to use.', ['plain', 'debug', 'debugoptimized', 'release', 'minsize'], 'debug'], 'strip': [UserBooleanOption, 'Strip targets on install.', False], diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 4fe879a..4e4ba5c 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -2257,10 +2257,12 @@ to directly access options of other subprojects.''') self.coredata.external_args.setdefault(lang, []).append(optvalue) # Otherwise, look for definitions from environment # variables such as CFLAGS. - if not comp.get_language() in self.coredata.external_args: - (preproc_args, compile_args, link_args) = environment.get_args_from_envvars(comp) + (preproc_args, compile_args, link_args) = environment.get_args_from_envvars(comp) + if not comp.get_language() in self.coredata.external_preprocess_args: self.coredata.external_preprocess_args[comp.get_language()] = preproc_args + if not comp.get_language() in self.coredata.external_args: self.coredata.external_args[comp.get_language()] = compile_args + if not comp.get_language() in self.coredata.external_link_args: self.coredata.external_link_args[comp.get_language()] = link_args self.build.add_compiler(comp) if need_cross_compiler: diff --git a/mesonbuild/mconf.py b/mesonbuild/mconf.py index cadd306..9a11332 100644 --- a/mesonbuild/mconf.py +++ b/mesonbuild/mconf.py @@ -19,6 +19,7 @@ from . import (coredata, mesonlib, build) def buildparser(): parser = argparse.ArgumentParser(prog='meson configure') + coredata.register_builtin_arguments(parser) parser.add_argument('-D', action='append', default=[], dest='sets', help='Set an option to the given value.') @@ -28,6 +29,19 @@ def buildparser(): return parser +def filter_builtin_options(args, original_args): + """Filter out any args passed with -- instead of -D.""" + for arg in original_args: + if not arg.startswith('--') or arg == '--clearcache': + continue + name = arg.lstrip('--').split('=', 1)[0] + if any([a.startswith(name + '=') for a in args.sets]): + raise mesonlib.MesonException( + 'Got argument {0} as both -D{0} and --{0}. Pick one.'.format(name)) + args.sets.append('{}={}'.format(name, getattr(args, name))) + delattr(args, name) + + class ConfException(mesonlib.MesonException): pass @@ -229,6 +243,7 @@ def run(args): if not args: args = [os.getcwd()] options = buildparser().parse_args(args) + filter_builtin_options(options, args) if len(options.directory) > 1: print('%s <build directory>' % args[0]) print('If you omit the build directory, the current directory is substituted.') diff --git a/mesonbuild/mesonmain.py b/mesonbuild/mesonmain.py index daf5907..613e953 100644 --- a/mesonbuild/mesonmain.py +++ b/mesonbuild/mesonmain.py @@ -25,47 +25,9 @@ from .wrap import WrapMode, wraptool default_warning = '1' -def add_builtin_argument(p, name, **kwargs): - k = kwargs.get('dest', name.replace('-', '_')) - c = coredata.get_builtin_option_choices(k) - b = kwargs.get('action', None) in ['store_true', 'store_false'] - h = coredata.get_builtin_option_description(k) - if not b: - h = h.rstrip('.') + ' (default: %s).' % coredata.get_builtin_option_default(k) - if c and not b: - kwargs['choices'] = c - default = coredata.get_builtin_option_default(k, noneIfSuppress=True) - if default is not None: - kwargs['default'] = default - else: - kwargs['default'] = argparse.SUPPRESS - p.add_argument('--' + name, help=h, **kwargs) - def create_parser(): p = argparse.ArgumentParser(prog='meson') - add_builtin_argument(p, 'prefix') - add_builtin_argument(p, 'libdir') - add_builtin_argument(p, 'libexecdir') - add_builtin_argument(p, 'bindir') - add_builtin_argument(p, 'sbindir') - add_builtin_argument(p, 'includedir') - add_builtin_argument(p, 'datadir') - add_builtin_argument(p, 'mandir') - add_builtin_argument(p, 'infodir') - add_builtin_argument(p, 'localedir') - add_builtin_argument(p, 'sysconfdir') - add_builtin_argument(p, 'localstatedir') - add_builtin_argument(p, 'sharedstatedir') - add_builtin_argument(p, 'backend') - add_builtin_argument(p, 'buildtype') - add_builtin_argument(p, 'strip', action='store_true') - add_builtin_argument(p, 'unity') - add_builtin_argument(p, 'werror', action='store_true') - add_builtin_argument(p, 'layout') - add_builtin_argument(p, 'default-library') - add_builtin_argument(p, 'warnlevel', dest='warning_level') - add_builtin_argument(p, 'stdsplit', action='store_false') - add_builtin_argument(p, 'errorlogs', action='store_false') + coredata.register_builtin_arguments(p) p.add_argument('--cross-file', default=None, help='File describing cross compilation environment.') p.add_argument('-D', action='append', dest='projectoptions', default=[], metavar="option", @@ -87,6 +49,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): @@ -338,6 +319,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 |