SCons: Turn some scons variables into command line options.
authorGabe Black <gblack@eecs.umich.edu>
Fri, 4 Mar 2011 07:54:31 +0000 (23:54 -0800)
committerGabe Black <gblack@eecs.umich.edu>
Fri, 4 Mar 2011 07:54:31 +0000 (23:54 -0800)
SConstruct
tests/SConscript
util/regress

index d33f5082ef0bf3fec8cffdbe3661287e6401d4de..6ed3b5422147d918c6f6a3a687670c5d797ac64c 100755 (executable)
@@ -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)
index 5d812c2ebb482ff16efdff4b71850fdd57de42bd..2e4d2d19a3ae956b8b9ea857b12fc144b197d117 100644 (file)
@@ -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)
index 27d09c0c32217f89040765ea657e2ee0c4a982bc..34e58d6d7bbe3c0b6a4c9a6907a9e7151bfd8dc8 100755 (executable)
@@ -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: