aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2018-04-17 23:29:15 +0300
committerGitHub <noreply@github.com>2018-04-17 23:29:15 +0300
commit1952ef5ae13376084dc277de38ff3a6dafb8e595 (patch)
treeb0ac33ea58e6ef4d92aca54f21d4c924fd43d821
parent8ee1e49ae683cbd7eb10da37327062a490cbee70 (diff)
parent1c48cc08e09b1ea860a4972b752d4f053433fa6f (diff)
downloadmeson-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.md6
-rw-r--r--mesonbuild/coredata.py38
-rw-r--r--mesonbuild/interpreter.py6
-rw-r--r--mesonbuild/mconf.py15
-rw-r--r--mesonbuild/mesonmain.py60
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