diff options
Diffstat (limited to 'third_party/waf/waflib/Options.py')
-rw-r--r-- | third_party/waf/waflib/Options.py | 95 |
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) + |