|
Igor Gnatenko |
ef6081 |
From ed831fc8624d33252771c49f4369e7262d4685ff Mon Sep 17 00:00:00 2001
|
|
Igor Gnatenko |
ef6081 |
From: Xavier Claessens <xavier.claessens@collabora.com>
|
|
Igor Gnatenko |
ef6081 |
Date: Thu, 26 Apr 2018 22:18:46 -0400
|
|
Igor Gnatenko |
ef6081 |
Subject: [PATCH 12/16] Fix --warnlevel being renamed to --warning-level in
|
|
Igor Gnatenko |
ef6081 |
latest release
|
|
Igor Gnatenko |
ef6081 |
|
|
Igor Gnatenko |
ef6081 |
---
|
|
Igor Gnatenko |
ef6081 |
mesonbuild/coredata.py | 54 ++++++++++++++++-----
|
|
Igor Gnatenko |
ef6081 |
mesonbuild/mconf.py | 15 +-----
|
|
Igor Gnatenko |
ef6081 |
mesonbuild/mesonmain.py | 9 ++--
|
|
Igor Gnatenko |
ef6081 |
run_unittests.py | 39 +++++++++++++++
|
|
Igor Gnatenko |
ef6081 |
test cases/unit/30 command line/meson.build | 1 +
|
|
Igor Gnatenko |
ef6081 |
5 files changed, 87 insertions(+), 31 deletions(-)
|
|
Igor Gnatenko |
ef6081 |
create mode 100644 test cases/unit/30 command line/meson.build
|
|
Igor Gnatenko |
ef6081 |
|
|
Igor Gnatenko |
ef6081 |
diff --git a/mesonbuild/coredata.py b/mesonbuild/coredata.py
|
|
Igor Gnatenko |
ef6081 |
index 93a9e718..52d3c7d1 100644
|
|
Igor Gnatenko |
ef6081 |
--- a/mesonbuild/coredata.py
|
|
Igor Gnatenko |
ef6081 |
+++ b/mesonbuild/coredata.py
|
|
Igor Gnatenko |
ef6081 |
@@ -368,12 +368,6 @@ def get_builtin_option_action(optname):
|
|
Igor Gnatenko |
ef6081 |
return 'store_true'
|
|
Igor Gnatenko |
ef6081 |
return None
|
|
Igor Gnatenko |
ef6081 |
|
|
Igor Gnatenko |
ef6081 |
-def get_builtin_option_destination(optname):
|
|
Igor Gnatenko |
ef6081 |
- optname = optname.replace('-', '_')
|
|
Igor Gnatenko |
ef6081 |
- if optname == 'warnlevel':
|
|
Igor Gnatenko |
ef6081 |
- return 'warning_level'
|
|
Igor Gnatenko |
ef6081 |
- return optname
|
|
Igor Gnatenko |
ef6081 |
-
|
|
Igor Gnatenko |
ef6081 |
def get_builtin_option_default(optname, prefix='', noneIfSuppress=False):
|
|
Igor Gnatenko |
ef6081 |
if is_builtin_option(optname):
|
|
Igor Gnatenko |
ef6081 |
o = builtin_options[optname]
|
|
Igor Gnatenko |
ef6081 |
@@ -391,24 +385,32 @@ def get_builtin_option_default(optname, prefix='', noneIfSuppress=False):
|
|
Igor Gnatenko |
ef6081 |
else:
|
|
Igor Gnatenko |
ef6081 |
raise RuntimeError('Tried to get the default value for an unknown builtin option \'%s\'.' % optname)
|
|
Igor Gnatenko |
ef6081 |
|
|
Igor Gnatenko |
ef6081 |
+def get_builtin_option_cmdline_name(name):
|
|
Igor Gnatenko |
ef6081 |
+ if name == 'warning_level':
|
|
Igor Gnatenko |
ef6081 |
+ return '--warnlevel'
|
|
Igor Gnatenko |
ef6081 |
+ else:
|
|
Igor Gnatenko |
ef6081 |
+ return '--' + name.replace('_', '-')
|
|
Igor Gnatenko |
ef6081 |
+
|
|
Igor Gnatenko |
ef6081 |
def add_builtin_argument(p, name):
|
|
Igor Gnatenko |
ef6081 |
kwargs = {}
|
|
Igor Gnatenko |
ef6081 |
- k = get_builtin_option_destination(name)
|
|
Igor Gnatenko |
ef6081 |
- c = get_builtin_option_choices(k)
|
|
Igor Gnatenko |
ef6081 |
- b = get_builtin_option_action(k)
|
|
Igor Gnatenko |
ef6081 |
- h = get_builtin_option_description(k)
|
|
Igor Gnatenko |
ef6081 |
+ c = get_builtin_option_choices(name)
|
|
Igor Gnatenko |
ef6081 |
+ b = get_builtin_option_action(name)
|
|
Igor Gnatenko |
ef6081 |
+ h = get_builtin_option_description(name)
|
|
Igor Gnatenko |
ef6081 |
if not b:
|
|
Igor Gnatenko |
ef6081 |
- h = h.rstrip('.') + ' (default: %s).' % get_builtin_option_default(k)
|
|
Igor Gnatenko |
ef6081 |
+ h = h.rstrip('.') + ' (default: %s).' % get_builtin_option_default(name)
|
|
Igor Gnatenko |
ef6081 |
else:
|
|
Igor Gnatenko |
ef6081 |
kwargs['action'] = b
|
|
Igor Gnatenko |
ef6081 |
if c and not b:
|
|
Igor Gnatenko |
ef6081 |
kwargs['choices'] = c
|
|
Igor Gnatenko |
ef6081 |
- default = get_builtin_option_default(k, noneIfSuppress=True)
|
|
Igor Gnatenko |
ef6081 |
+ default = get_builtin_option_default(name, noneIfSuppress=True)
|
|
Igor Gnatenko |
ef6081 |
if default is not None:
|
|
Igor Gnatenko |
ef6081 |
kwargs['default'] = default
|
|
Igor Gnatenko |
ef6081 |
else:
|
|
Igor Gnatenko |
ef6081 |
kwargs['default'] = argparse.SUPPRESS
|
|
Igor Gnatenko |
ef6081 |
- p.add_argument('--' + name.replace('_', '-'), help=h, **kwargs)
|
|
Igor Gnatenko |
ef6081 |
+ kwargs['dest'] = name
|
|
Igor Gnatenko |
ef6081 |
+
|
|
Igor Gnatenko |
ef6081 |
+ cmdline_name = get_builtin_option_cmdline_name(name)
|
|
Igor Gnatenko |
ef6081 |
+ p.add_argument(cmdline_name, help=h, **kwargs)
|
|
Igor Gnatenko |
ef6081 |
|
|
Igor Gnatenko |
ef6081 |
def register_builtin_arguments(parser):
|
|
Igor Gnatenko |
ef6081 |
for n in builtin_options:
|
|
Igor Gnatenko |
ef6081 |
@@ -416,6 +418,32 @@ def register_builtin_arguments(parser):
|
|
Igor Gnatenko |
ef6081 |
parser.add_argument('-D', action='append', dest='projectoptions', default=[], metavar="option",
|
|
Igor Gnatenko |
ef6081 |
help='Set the value of an option, can be used several times to set multiple options.')
|
|
Igor Gnatenko |
ef6081 |
|
|
Igor Gnatenko |
ef6081 |
+def filter_builtin_options(args, original_args):
|
|
Igor Gnatenko |
ef6081 |
+ """Filter out any builtin arguments passed as -- instead of -D.
|
|
Igor Gnatenko |
ef6081 |
+
|
|
Igor Gnatenko |
ef6081 |
+ Error if an argument is passed with -- and -D
|
|
Igor Gnatenko |
ef6081 |
+ """
|
|
Igor Gnatenko |
ef6081 |
+ for name in builtin_options:
|
|
Igor Gnatenko |
ef6081 |
+ # Check if user passed --option. Cannot use hasattr(args, name) here
|
|
Igor Gnatenko |
ef6081 |
+ # because they are all set with default value if user didn't pass it.
|
|
Igor Gnatenko |
ef6081 |
+ cmdline_name = get_builtin_option_cmdline_name(name)
|
|
Igor Gnatenko |
ef6081 |
+ has_dashdash = any([a.startswith(cmdline_name) for a in original_args])
|
|
Igor Gnatenko |
ef6081 |
+
|
|
Igor Gnatenko |
ef6081 |
+ # Chekc if user passed -Doption=value
|
|
Igor Gnatenko |
ef6081 |
+ has_dashd = any([a.startswith('{}='.format(name)) for a in args.projectoptions])
|
|
Igor Gnatenko |
ef6081 |
+
|
|
Igor Gnatenko |
ef6081 |
+ # Passing both is ambigous, abort
|
|
Igor Gnatenko |
ef6081 |
+ if has_dashdash and has_dashd:
|
|
Igor Gnatenko |
ef6081 |
+ raise MesonException(
|
|
Igor Gnatenko |
ef6081 |
+ 'Got argument {0} as both -D{0} and {1}. Pick one.'.format(name, cmdline_name))
|
|
Igor Gnatenko |
ef6081 |
+
|
|
Igor Gnatenko |
ef6081 |
+ # Pretend --option never existed
|
|
Igor Gnatenko |
ef6081 |
+ if has_dashdash:
|
|
Igor Gnatenko |
ef6081 |
+ args.projectoptions.append('{}={}'.format(name, getattr(args, name)))
|
|
Igor Gnatenko |
ef6081 |
+ if hasattr(args, name):
|
|
Igor Gnatenko |
ef6081 |
+ delattr(args, name)
|
|
Igor Gnatenko |
ef6081 |
+
|
|
Igor Gnatenko |
ef6081 |
+
|
|
Igor Gnatenko |
ef6081 |
builtin_options = {
|
|
Igor Gnatenko |
ef6081 |
'buildtype': [UserComboOption, 'Build type to use.', ['plain', 'debug', 'debugoptimized', 'release', 'minsize'], 'debug'],
|
|
Igor Gnatenko |
ef6081 |
'strip': [UserBooleanOption, 'Strip targets on install.', False],
|
|
Igor Gnatenko |
ef6081 |
diff --git a/mesonbuild/mconf.py b/mesonbuild/mconf.py
|
|
Igor Gnatenko |
ef6081 |
index f907d752..1375b2e0 100644
|
|
Igor Gnatenko |
ef6081 |
--- a/mesonbuild/mconf.py
|
|
Igor Gnatenko |
ef6081 |
+++ b/mesonbuild/mconf.py
|
|
Igor Gnatenko |
ef6081 |
@@ -28,19 +28,6 @@ def buildparser():
|
|
Igor Gnatenko |
ef6081 |
return parser
|
|
Igor Gnatenko |
ef6081 |
|
|
Igor Gnatenko |
ef6081 |
|
|
Igor Gnatenko |
ef6081 |
-def filter_builtin_options(args, original_args):
|
|
Igor Gnatenko |
ef6081 |
- """Filter out any args passed with -- instead of -D."""
|
|
Igor Gnatenko |
ef6081 |
- for arg in original_args:
|
|
Igor Gnatenko |
ef6081 |
- if not arg.startswith('--') or arg == '--clearcache':
|
|
Igor Gnatenko |
ef6081 |
- continue
|
|
Igor Gnatenko |
ef6081 |
- name = arg.lstrip('--').split('=', 1)[0]
|
|
Igor Gnatenko |
ef6081 |
- if any([a.startswith(name + '=') for a in args.projectoptions]):
|
|
Igor Gnatenko |
ef6081 |
- raise mesonlib.MesonException(
|
|
Igor Gnatenko |
ef6081 |
- 'Got argument {0} as both -D{0} and --{0}. Pick one.'.format(name))
|
|
Igor Gnatenko |
ef6081 |
- args.projectoptions.append('{}={}'.format(name, getattr(args, name)))
|
|
Igor Gnatenko |
ef6081 |
- delattr(args, name)
|
|
Igor Gnatenko |
ef6081 |
-
|
|
Igor Gnatenko |
ef6081 |
-
|
|
Igor Gnatenko |
ef6081 |
class ConfException(mesonlib.MesonException):
|
|
Igor Gnatenko |
ef6081 |
pass
|
|
Igor Gnatenko |
ef6081 |
|
|
Igor Gnatenko |
ef6081 |
@@ -242,7 +229,7 @@ def run(args):
|
|
Igor Gnatenko |
ef6081 |
if not args:
|
|
Igor Gnatenko |
ef6081 |
args = [os.getcwd()]
|
|
Igor Gnatenko |
ef6081 |
options = buildparser().parse_args(args)
|
|
Igor Gnatenko |
ef6081 |
- filter_builtin_options(options, args)
|
|
Igor Gnatenko |
ef6081 |
+ coredata.filter_builtin_options(options, args)
|
|
Igor Gnatenko |
ef6081 |
if len(options.directory) > 1:
|
|
Igor Gnatenko |
ef6081 |
print('%s <build directory>' % args[0])
|
|
Igor Gnatenko |
ef6081 |
print('If you omit the build directory, the current directory is substituted.')
|
|
Igor Gnatenko |
ef6081 |
diff --git a/mesonbuild/mesonmain.py b/mesonbuild/mesonmain.py
|
|
Igor Gnatenko |
ef6081 |
index 9dda4af5..2b6281d7 100644
|
|
Igor Gnatenko |
ef6081 |
--- a/mesonbuild/mesonmain.py
|
|
Igor Gnatenko |
ef6081 |
+++ b/mesonbuild/mesonmain.py
|
|
Igor Gnatenko |
ef6081 |
@@ -61,11 +61,12 @@ def filter_builtin_options(args, original_args):
|
|
Igor Gnatenko |
ef6081 |
if meson_opts:
|
|
Igor Gnatenko |
ef6081 |
for arg in meson_opts:
|
|
Igor Gnatenko |
ef6081 |
value = arguments[arg]
|
|
Igor Gnatenko |
ef6081 |
- if any([a.startswith('--{}'.format(arg)) for a in original_args]):
|
|
Igor Gnatenko |
ef6081 |
+ cmdline_name = coredata.get_builtin_option_cmdline_name(arg)
|
|
Igor Gnatenko |
ef6081 |
+ if any([a.startswith(cmdline_name) for a in original_args]):
|
|
Igor Gnatenko |
ef6081 |
raise MesonException(
|
|
Igor Gnatenko |
ef6081 |
- 'Argument "{0}" passed as both --{0} and -D{0}, but only '
|
|
Igor Gnatenko |
ef6081 |
- 'one is allowed'.format(arg))
|
|
Igor Gnatenko |
ef6081 |
- setattr(args, coredata.get_builtin_option_destination(arg), value)
|
|
Igor Gnatenko |
ef6081 |
+ 'Argument "{0}" passed as both {1} and -D{0}, but only '
|
|
Igor Gnatenko |
ef6081 |
+ 'one is allowed'.format(arg, cmdline_name))
|
|
Igor Gnatenko |
ef6081 |
+ setattr(args, arg, value)
|
|
Igor Gnatenko |
ef6081 |
|
|
Igor Gnatenko |
ef6081 |
# Remove the builtin option from the project args values
|
|
Igor Gnatenko |
ef6081 |
args.projectoptions.remove('{}={}'.format(arg, value))
|
|
Igor Gnatenko |
ef6081 |
diff --git a/run_unittests.py b/run_unittests.py
|
|
Igor Gnatenko |
ef6081 |
index 3f80f74f..2a466db0 100755
|
|
Igor Gnatenko |
ef6081 |
--- a/run_unittests.py
|
|
Igor Gnatenko |
ef6081 |
+++ b/run_unittests.py
|
|
Igor Gnatenko |
ef6081 |
@@ -2020,6 +2020,45 @@ recommended as it can lead to undefined behaviour on some platforms''')
|
|
Igor Gnatenko |
ef6081 |
self.builddir = exebuilddir
|
|
Igor Gnatenko |
ef6081 |
self.assertRebuiltTarget('app')
|
|
Igor Gnatenko |
ef6081 |
|
|
Igor Gnatenko |
ef6081 |
+ def test_command_line(self):
|
|
Igor Gnatenko |
ef6081 |
+ testdir = os.path.join(self.unit_test_dir, '30 command line')
|
|
Igor Gnatenko |
ef6081 |
+
|
|
Igor Gnatenko |
ef6081 |
+ # Verify default values when passing no args
|
|
Igor Gnatenko |
ef6081 |
+ self.init(testdir)
|
|
Igor Gnatenko |
ef6081 |
+ obj = mesonbuild.coredata.load(self.builddir)
|
|
Igor Gnatenko |
ef6081 |
+ self.assertEqual(obj.builtins['warning_level'].value, '1')
|
|
Igor Gnatenko |
ef6081 |
+ self.wipe()
|
|
Igor Gnatenko |
ef6081 |
+
|
|
Igor Gnatenko |
ef6081 |
+ # warning_level is special, it's --warnlevel instead of --warning-level
|
|
Igor Gnatenko |
ef6081 |
+ # for historical reasons
|
|
Igor Gnatenko |
ef6081 |
+ self.init(testdir, extra_args=['--warnlevel=2'])
|
|
Igor Gnatenko |
ef6081 |
+ obj = mesonbuild.coredata.load(self.builddir)
|
|
Igor Gnatenko |
ef6081 |
+ self.assertEqual(obj.builtins['warning_level'].value, '2')
|
|
Igor Gnatenko |
ef6081 |
+ self.setconf('--warnlevel=3')
|
|
Igor Gnatenko |
ef6081 |
+ obj = mesonbuild.coredata.load(self.builddir)
|
|
Igor Gnatenko |
ef6081 |
+ self.assertEqual(obj.builtins['warning_level'].value, '3')
|
|
Igor Gnatenko |
ef6081 |
+ self.wipe()
|
|
Igor Gnatenko |
ef6081 |
+
|
|
Igor Gnatenko |
ef6081 |
+ # But when using -D syntax, it should be 'warning_level'
|
|
Igor Gnatenko |
ef6081 |
+ self.init(testdir, extra_args=['-Dwarning_level=2'])
|
|
Igor Gnatenko |
ef6081 |
+ obj = mesonbuild.coredata.load(self.builddir)
|
|
Igor Gnatenko |
ef6081 |
+ self.assertEqual(obj.builtins['warning_level'].value, '2')
|
|
Igor Gnatenko |
ef6081 |
+ self.setconf('-Dwarning_level=3')
|
|
Igor Gnatenko |
ef6081 |
+ obj = mesonbuild.coredata.load(self.builddir)
|
|
Igor Gnatenko |
ef6081 |
+ self.assertEqual(obj.builtins['warning_level'].value, '3')
|
|
Igor Gnatenko |
ef6081 |
+ self.wipe()
|
|
Igor Gnatenko |
ef6081 |
+
|
|
Igor Gnatenko |
ef6081 |
+ # Mixing --option and -Doption is forbidden
|
|
Igor Gnatenko |
ef6081 |
+ with self.assertRaises(subprocess.CalledProcessError) as e:
|
|
Igor Gnatenko |
ef6081 |
+ self.init(testdir, extra_args=['--warnlevel=1', '-Dwarning_level=3'])
|
|
Igor Gnatenko |
ef6081 |
+ self.assertNotEqual(0, e.returncode)
|
|
Igor Gnatenko |
ef6081 |
+ self.assertIn('passed as both', e.stderr)
|
|
Igor Gnatenko |
ef6081 |
+ with self.assertRaises(subprocess.CalledProcessError) as e:
|
|
Igor Gnatenko |
ef6081 |
+ self.setconf('--warnlevel=1', '-Dwarning_level=3')
|
|
Igor Gnatenko |
ef6081 |
+ self.assertNotEqual(0, e.returncode)
|
|
Igor Gnatenko |
ef6081 |
+ self.assertIn('passed as both', e.stderr)
|
|
Igor Gnatenko |
ef6081 |
+ self.wipe()
|
|
Igor Gnatenko |
ef6081 |
+
|
|
Igor Gnatenko |
ef6081 |
|
|
Igor Gnatenko |
ef6081 |
class FailureTests(BasePlatformTests):
|
|
Igor Gnatenko |
ef6081 |
'''
|
|
Igor Gnatenko |
ef6081 |
diff --git a/test cases/unit/30 command line/meson.build b/test cases/unit/30 command line/meson.build
|
|
Igor Gnatenko |
ef6081 |
new file mode 100644
|
|
Igor Gnatenko |
ef6081 |
index 00000000..2ab21b6e
|
|
Igor Gnatenko |
ef6081 |
--- /dev/null
|
|
Igor Gnatenko |
ef6081 |
+++ b/test cases/unit/30 command line/meson.build
|
|
Igor Gnatenko |
ef6081 |
@@ -0,0 +1 @@
|
|
Igor Gnatenko |
ef6081 |
+project('command line test', 'c')
|
|
Igor Gnatenko |
ef6081 |
--
|
|
Igor Gnatenko |
ef6081 |
2.17.0
|
|
Igor Gnatenko |
ef6081 |
|