From fa448129b1cb7a03ef00361d316ac2d7c38e8091 Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Thu, 3 Mar 2011 23:54:31 -0800 Subject: [PATCH] SCons: Turn some scons variables into command line options. --- SConstruct | 99 ++++++++++++++++++++++++++++++------------------ tests/SConscript | 4 +- util/regress | 2 +- 3 files changed, 66 insertions(+), 39 deletions(-) diff --git a/SConstruct b/SConstruct index d33f5082e..6ed3b5422 100755 --- a/SConstruct +++ b/SConstruct @@ -121,10 +121,43 @@ sys.path[1:1] = extra_python_paths from m5.util import compareVersions, readCommand -AddOption('--colors', dest='use_colors', action='store_true') -AddOption('--no-colors', dest='use_colors', action='store_false') -use_colors = GetOption('use_colors') +help_texts = { + "options" : "", + "global_vars" : "", + "local_vars" : "" +} + +Export("help_texts") +def AddM5Option(*args, **kwargs): + col_width = 30 + + help = " " + ", ".join(args) + if "help" in kwargs: + length = len(help) + if length >= col_width: + help += "\n" + " " * col_width + else: + help += " " * (col_width - length) + help += kwargs["help"] + help_texts["options"] += help + "\n" + + AddOption(*args, **kwargs) + +AddM5Option('--colors', dest='use_colors', action='store_true', + help="Add color to abbreviated scons output") +AddM5Option('--no-colors', dest='use_colors', action='store_false', + help="Don't add color to abbreviated scons output") +AddM5Option('--default', dest='default', type='string', action='store', + help='Override which build_opts file to use for defaults') +AddM5Option('--ignore-style', dest='ignore_style', action='store_true', + help='Disable style checking hooks') +AddM5Option('--update-ref', dest='update_ref', action='store_true', + help='Update test reference outputs') +AddM5Option('--verbose', dest='verbose', action='store_true', + help='Print full tool command lines') + +use_colors = GetOption('use_colors') if use_colors: from m5.util.terminal import termcap elif use_colors is None: @@ -206,7 +239,7 @@ if hgdir.exists(): # 2) Ensure that the style hook is in place. try: ui = None - if ARGUMENTS.get('IGNORE_STYLE') != 'True': + if GetOption('ignore_style'): from mercurial import ui ui = ui.ui() except ImportError: @@ -318,12 +351,11 @@ def PathListAllExist(key, val, env): if not isdir(path): raise SCons.Errors.UserError("Path does not exist: '%s'" % path) -global_sticky_vars_file = joinpath(build_root, 'variables.global') +global_vars_file = joinpath(build_root, 'variables.global') -global_sticky_vars = Variables(global_sticky_vars_file, args=ARGUMENTS) -global_nonsticky_vars = Variables(args=ARGUMENTS) +global_vars = Variables(global_vars_file, args=ARGUMENTS) -global_sticky_vars.AddVariables( +global_vars.AddVariables( ('CC', 'C compiler', environ.get('CC', main['CC'])), ('CXX', 'C++ compiler', environ.get('CXX', main['CXX'])), ('BATCH', 'Use batch pool for build and tests', False), @@ -333,31 +365,12 @@ global_sticky_vars.AddVariables( PathListAllExist, PathListMakeAbsolute), ) -global_nonsticky_vars.AddVariables( - ('VERBOSE', 'Print full tool command lines', False), - ('update_ref', 'Update test reference outputs', False) - ) - -# Update main environment with values from ARGUMENTS & global_sticky_vars_file -global_sticky_vars.Update(main) -global_nonsticky_vars.Update(main) -global_help_texts = { - "global_sticky" : global_sticky_vars.GenerateHelpText(main), - "global_nonsticky" : global_nonsticky_vars.GenerateHelpText(main) -} - -# base help text -help_text = ''' -Usage: scons [scons options] [build options] [target(s)] - -Global sticky options: -%(global_sticky)s -Global nonsticky options: -%(global_nonsticky)s -''' % global_help_texts +# Update main environment with values from ARGUMENTS & global_vars_file +global_vars.Update(main) +help_texts["global_vars"] += global_vars.GenerateHelpText(main) # Save sticky variable settings back to current variables file -global_sticky_vars.Save(global_sticky_vars_file, main) +global_vars.Save(global_vars_file, main) # Parse EXTRAS variable to build list of all directories where we're # look for sources etc. This list is exported as base_dir_list. @@ -455,7 +468,7 @@ class Transform(object): Export('Transform') -if main['VERBOSE']: +if GetOption('verbose'): def MakeAction(action, string, *args, **kwargs): return Action(action, *args, **kwargs) else: @@ -965,8 +978,10 @@ for variant_path in variant_paths: # Get default build variables from source tree. Variables are # normally determined by name of $VARIANT_DIR, but can be # overriden by 'default=' arg on command line. - default_vars_file = joinpath('build_opts', - ARGUMENTS.get('default', variant_dir)) + default = GetOption('default') + if not default: + default = variant_dir + default_vars_file = joinpath('build_opts', default) if isfile(default_vars_file): sticky_vars.files.append(default_vars_file) print "Variables file %s not found,\n using defaults in %s" \ @@ -979,7 +994,8 @@ for variant_path in variant_paths: # Apply current variable settings to env sticky_vars.Update(env) - help_text += "\nSticky variables for %s:\n" % variant_dir \ + help_texts["local_vars"] += \ + "Build variables for %s:\n" % variant_dir \ + sticky_vars.GenerateHelpText(env) # Process variable settings. @@ -1024,4 +1040,15 @@ for variant_path in variant_paths: variant_dir = joinpath(variant_path, 'tests', e.Label), exports = { 'env' : e }, duplicate = False) -Help(help_text) +# base help text +Help(''' +Usage: scons [scons options] [build variables] [target(s)] + +Extra scons options: +%(options)s + +Global build variables: +%(global_vars)s + +%(local_vars)s +''' % help_texts) diff --git a/tests/SConscript b/tests/SConscript index 5d812c2eb..2e4d2d19a 100644 --- a/tests/SConscript +++ b/tests/SConscript @@ -178,7 +178,7 @@ printAction = env.Action(print_test, strfunction = None) # - long-winded message about ignored sources ignore_msg = ''' Note: The following file(s) will not be copied. New non-standard - output files must be copied manually once before update_ref will + output files must be copied manually once before --update-ref will recognize them as outputs. Otherwise they are assumed to be inputs and are ignored. ''' @@ -251,7 +251,7 @@ def test_builder(env, ref_dir): testAction) # phony target to echo status - if env['update_ref']: + if GetOption('update_ref'): p = env.Command(tgt('_update'), [ref_stats, new_stats, status_file], updateAction) diff --git a/util/regress b/util/regress index 27d09c0c3..34e58d6d7 100755 --- a/util/regress +++ b/util/regress @@ -133,7 +133,7 @@ if options.jobs != 1: if options.keep_going: scons_opts += ' -k' -cmd = 'scons IGNORE_STYLE=True %s %s' % (scons_opts, ' '.join(targets)) +cmd = 'scons --ignore-style %s %s' % (scons_opts, ' '.join(targets)) if options.no_exec: print cmd else: -- 2.30.2