summaryrefslogtreecommitdiff
path: root/third_party/waf/waflib/Options.py
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/waf/waflib/Options.py')
-rw-r--r--third_party/waf/waflib/Options.py95
1 files changed, 80 insertions, 15 deletions
diff --git a/third_party/waf/waflib/Options.py b/third_party/waf/waflib/Options.py
index 4f4f7c60e05..39873c629cc 100644
--- a/third_party/waf/waflib/Options.py
+++ b/third_party/waf/waflib/Options.py
@@ -5,7 +5,7 @@
#!/usr/bin/env python
# encoding: utf-8
# Scott Newton, 2005 (scottn)
-# Thomas Nagy, 2006-2016 (ita)
+# Thomas Nagy, 2006-2018 (ita)
"""
Support for waf command-line options
@@ -17,7 +17,7 @@ that reads the ``options`` wscript function.
import os, tempfile, optparse, sys, re
from waflib import Logs, Utils, Context, Errors
-options = {}
+options = optparse.Values()
"""
A global dictionary representing user-provided command-line options::
@@ -46,11 +46,25 @@ class opt_parser(optparse.OptionParser):
"""
Command-line options parser.
"""
- def __init__(self, ctx):
- optparse.OptionParser.__init__(self, conflict_handler="resolve",
+ def __init__(self, ctx, allow_unknown=False):
+ optparse.OptionParser.__init__(self, conflict_handler='resolve', add_help_option=False,
version='waf %s (%s)' % (Context.WAFVERSION, Context.WAFREVISION))
self.formatter.width = Logs.get_term_cols()
self.ctx = ctx
+ self.allow_unknown = allow_unknown
+
+ def _process_args(self, largs, rargs, values):
+ """
+ Custom _process_args to allow unknown options according to the allow_unknown status
+ """
+ while rargs:
+ try:
+ optparse.OptionParser._process_args(self,largs,rargs,values)
+ except (optparse.BadOptionError, optparse.AmbiguousOptionError) as e:
+ if self.allow_unknown:
+ largs.append(e.opt_str)
+ else:
+ self.error(str(e))
def print_usage(self, file=None):
return self.print_help(file)
@@ -121,7 +135,9 @@ class OptionsContext(Context.Context):
p('-k', '--keep', dest='keep', default=0, action='count', help='continue despite errors (-kk to try harder)')
p('-v', '--verbose', dest='verbose', default=0, action='count', help='verbosity level -v -vv or -vvv [default: 0]')
p('--zones', dest='zones', default='', action='store', help='debugging zones (task_gen, deps, tasks, etc)')
- p('--profile', dest='profile', default='', action='store_true', help=optparse.SUPPRESS_HELP)
+ p('--profile', dest='profile', default=0, action='store_true', help=optparse.SUPPRESS_HELP)
+ p('--pdb', dest='pdb', default=0, action='store_true', help=optparse.SUPPRESS_HELP)
+ p('-h', '--help', dest='whelp', default=0, action='store_true', help="show this help message and exit")
gr = self.add_option_group('Configuration options')
self.option_groups['configure options'] = gr
@@ -247,31 +263,79 @@ class OptionsContext(Context.Context):
return group
return None
- def parse_args(self, _args=None):
- """
- Parses arguments from a list which is not necessarily the command-line.
+ def sanitize_path(self, path, cwd=None):
+ if not cwd:
+ cwd = Context.launch_dir
+ p = os.path.expanduser(path)
+ p = os.path.join(cwd, p)
+ p = os.path.normpath(p)
+ p = os.path.abspath(p)
+ return p
- :param _args: arguments
- :type _args: list of strings
+ def parse_cmd_args(self, _args=None, cwd=None, allow_unknown=False):
+ """
+ Just parse the arguments
"""
- global options, commands, envvars
+ self.parser.allow_unknown = allow_unknown
(options, leftover_args) = self.parser.parse_args(args=_args)
-
+ envvars = []
+ commands = []
for arg in leftover_args:
if '=' in arg:
envvars.append(arg)
- else:
+ elif arg != 'options':
commands.append(arg)
- if options.destdir:
- options.destdir = Utils.sane_path(options.destdir)
+ for name in 'top out destdir prefix bindir libdir'.split():
+ # those paths are usually expanded from Context.launch_dir
+ if getattr(options, name, None):
+ path = self.sanitize_path(getattr(options, name), cwd)
+ setattr(options, name, path)
+ return options, commands, envvars
+
+ def init_module_vars(self, arg_options, arg_commands, arg_envvars):
+ options.__dict__.clear()
+ del commands[:]
+ del envvars[:]
+ options.__dict__.update(arg_options.__dict__)
+ commands.extend(arg_commands)
+ envvars.extend(arg_envvars)
+
+ for var in envvars:
+ (name, value) = var.split('=', 1)
+ os.environ[name.strip()] = value
+
+ def init_logs(self, options, commands, envvars):
+ Logs.verbose = options.verbose
if options.verbose >= 1:
self.load('errcheck')
colors = {'yes' : 2, 'auto' : 1, 'no' : 0}[options.colors]
Logs.enable_colors(colors)
+ if options.zones:
+ Logs.zones = options.zones.split(',')
+ if not Logs.verbose:
+ Logs.verbose = 1
+ elif Logs.verbose > 0:
+ Logs.zones = ['runner']
+ if Logs.verbose > 2:
+ Logs.zones = ['*']
+
+ def parse_args(self, _args=None):
+ """
+ Parses arguments from a list which is not necessarily the command-line.
+ Initializes the module variables options, commands and envvars
+ If help is requested, prints it and exit the application
+
+ :param _args: arguments
+ :type _args: list of strings
+ """
+ options, commands, envvars = self.parse_cmd_args()
+ self.init_logs(options, commands, envvars)
+ self.init_module_vars(options, commands, envvars)
+
def execute(self):
"""
See :py:func:`waflib.Context.Context.execute`
@@ -279,3 +343,4 @@ class OptionsContext(Context.Context):
super(OptionsContext, self).execute()
self.parse_args()
Utils.alloc_process_pool(options.jobs)
+