hgdir = main.root.Dir(".hg")
mercurial_style_message = """
-You're missing the M5 style hook.
-Please install the hook so we can ensure that all code fits a common style.
-
-All you'd need to do is add the following lines to your repository .hg/hgrc
-or your personal .hgrc
-----------------
-
+You're missing the gem5 style hook, which automatically checks your code
+against the gem5 style rules on hg commit and qrefresh commands. This
+script will now install the hook in your .hg/hgrc file.
+Press enter to continue, or ctrl-c to abort: """
+
+mercurial_style_hook = """
+# The following lines were automatically added by gem5/SConstruct
+# to provide the gem5 style-checking hooks
[extensions]
style = %s/util/style.py
[hooks]
pretxncommit.style = python:style.check_style
pre-qrefresh.style = python:style.check_style
-""" % (main.root)
+# End of SConstruct additions
-mercurial_bin_not_found = """
-Mercurial binary cannot be found, unfortunately this means that we
-cannot easily determine the version of M5 that you are running and
-this makes error messages more difficult to collect. Please consider
-installing mercurial if you choose to post an error message
-"""
+""" % (main.root.abspath)
mercurial_lib_not_found = """
-Mercurial libraries cannot be found, ignoring style hook
-If you are actually a M5 developer, please fix this and
-run the style hook. It is important.
+Mercurial libraries cannot be found, ignoring style hook. If
+you are a gem5 developer, please fix this and run the style
+hook. It is important.
"""
-if hgdir.exists():
- # Ensure that the style hook is in place.
+# Check for style hook and prompt for installation if it's not there.
+# Skip this if --ignore-style was specified, there's no .hg dir to
+# install a hook in, or there's no interactive terminal to prompt.
+if not GetOption('ignore_style') and hgdir.exists() and sys.stdin.isatty():
+ style_hook = True
try:
- ui = None
- if not GetOption('ignore_style'):
- from mercurial import ui
- ui = ui.ui()
+ from mercurial import ui
+ ui = ui.ui()
+ ui.readconfig(hgdir.File('hgrc').abspath)
+ style_hook = ui.config('hooks', 'pretxncommit.style', None) and \
+ ui.config('hooks', 'pre-qrefresh.style', None)
except ImportError:
print mercurial_lib_not_found
- if ui is not None:
- ui.readconfig(hgdir.File('hgrc').abspath)
- style_hook = ui.config('hooks', 'pretxncommit.style', None)
-
- if not style_hook:
- print mercurial_style_message
+ if not style_hook:
+ print mercurial_style_message,
+ # continue unless user does ctrl-c/ctrl-d etc.
+ try:
+ raw_input()
+ except:
+ print "Input exception, exiting scons.\n"
sys.exit(1)
-else:
- print ".hg directory not found"
+ hgrc_path = '%s/.hg/hgrc' % main.root.abspath
+ print "Adding style hook to", hgrc_path, "\n"
+ try:
+ hgrc = open(hgrc_path, 'a')
+ hgrc.write(mercurial_style_hook)
+ hgrc.close()
+ except:
+ print "Error updating", hgrc_path
+ sys.exit(1)
+
###################################################
#
return i
raise ValueError, "element not found"
+# Take a list of paths (or SCons Nodes) and return a list with all
+# paths made absolute and ~-expanded. Paths will be interpreted
+# relative to the launch directory unless a different root is provided
+def makePathListAbsolute(path_list, root=GetLaunchDir()):
+ return [abspath(joinpath(root, expanduser(str(p))))
+ for p in path_list]
+
# Each target must have 'build' in the interior of the path; the
# directory below this will determine the build parameters. For
# example, for target 'foo/bar/build/ALPHA_SE/arch/alpha/blah.do' we
# recognize that ALPHA_SE specifies the configuration because it
-# follow 'build' in the bulid path.
-
-# Generate absolute paths to targets so we can see where the build dir is
-if COMMAND_LINE_TARGETS:
- # Ask SCons which directory it was invoked from
- launch_dir = GetLaunchDir()
- # Make targets relative to invocation directory
- abs_targets = [ normpath(joinpath(launch_dir, str(x))) for x in \
- COMMAND_LINE_TARGETS]
-else:
- # Default targets are relative to root of tree
- abs_targets = [ normpath(joinpath(main.root.abspath, str(x))) for x in \
- DEFAULT_TARGETS]
+# follow 'build' in the build path.
+# The funky assignment to "[:]" is needed to replace the list contents
+# in place rather than reassign the symbol to a new list, which
+# doesn't work (obviously!).
+BUILD_TARGETS[:] = makePathListAbsolute(BUILD_TARGETS)
# Generate a list of the unique build roots and configs that the
# collected targets reference.
variant_paths = []
build_root = None
-for t in abs_targets:
+for t in BUILD_TARGETS:
path_dirs = t.split('/')
try:
build_top = rfind(path_dirs, 'build', -2)
# tree (not specific to a particular build like ALPHA_SE)
#
-# Variable validators & converters for global sticky variables
-def PathListMakeAbsolute(val):
- if not val:
- return val
- f = lambda p: abspath(expanduser(p))
- return ':'.join(map(f, val.split(':')))
-
-def PathListAllExist(key, val, env):
- if not val:
- return
- paths = val.split(':')
- for path in paths:
- if not isdir(path):
- raise SCons.Errors.UserError("Path does not exist: '%s'" % path)
-
global_vars_file = joinpath(build_root, 'variables.global')
global_vars = Variables(global_vars_file, args=ARGUMENTS)
('BATCH', 'Use batch pool for build and tests', False),
('BATCH_CMD', 'Batch pool submission command name', 'qdo'),
('M5_BUILD_CACHE', 'Cache built objects in this directory', False),
- ('EXTRAS', 'Add extra directories to the compilation', '',
- PathListAllExist, PathListMakeAbsolute),
+ ('EXTRAS', 'Add extra directories to the compilation', '')
)
# Update main environment with values from ARGUMENTS & global_vars_file
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.
+# look for sources etc. This list is exported as extras_dir_list.
base_dir = main.srcdir.abspath
if main['EXTRAS']:
- extras_dir_list = main['EXTRAS'].split(':')
+ extras_dir_list = makePathListAbsolute(main['EXTRAS'].split(':'))
else:
extras_dir_list = []
# Note CCVERSION doesn't work here because it is run with the CC
# before we override it from the command line
gcc_version = readCommand([main['CXX'], '-dumpversion'], exception=False)
+ main['GCC_VERSION'] = gcc_version
if not compareVersions(gcc_version, '4.4.1') or \
not compareVersions(gcc_version, '4.4.2'):
print 'Info: Tree vectorizer in GCC 4.4.1 & 4.4.2 is buggy, disabling.'
print "Warning: Header file <fenv.h> not found."
print " This host has no IEEE FP rounding mode control."
-######################################################################
-#
-# Check for mysql.
-#
-mysql_config = WhereIs('mysql_config')
-have_mysql = bool(mysql_config)
-
-# Check MySQL version.
-if have_mysql:
- mysql_version = readCommand(mysql_config + ' --version')
- min_mysql_version = '4.1'
- if compareVersions(mysql_version, min_mysql_version) < 0:
- print 'Warning: MySQL', min_mysql_version, 'or newer required.'
- print ' Version', mysql_version, 'detected.'
- have_mysql = False
-
-# Set up mysql_config commands.
-if have_mysql:
- mysql_config_include = mysql_config + ' --include'
- if os.system(mysql_config_include + ' > /dev/null') != 0:
- # older mysql_config versions don't support --include, use
- # --cflags instead
- mysql_config_include = mysql_config + ' --cflags | sed s/\\\'//g'
- # This seems to work in all versions
- mysql_config_libs = mysql_config + ' --libs'
-
######################################################################
#
# Finish the configuration
# Walk the tree and execute all SConsopts scripts that wil add to the
# above variables
+if not GetOption('verbose'):
+ print "Reading SConsopts"
for bdir in [ base_dir ] + extras_dir_list:
+ if not isdir(bdir):
+ print "Error: directory '%s' does not exist" % bdir
+ Exit(1)
for root, dirs, files in os.walk(bdir):
if 'SConsopts' in files:
- print "Reading", joinpath(root, 'SConsopts')
+ if GetOption('verbose'):
+ print "Reading", joinpath(root, 'SConsopts')
SConscript(joinpath(root, 'SConsopts'))
all_isa_list.sort()
BoolVariable('USE_SSE2',
'Compile for SSE2 (-msse2) to get IEEE FP on x86 hosts',
False),
- BoolVariable('USE_MYSQL', 'Use MySQL for stats output', have_mysql),
BoolVariable('USE_POSIX_CLOCK', 'Use POSIX Clocks', have_posix_clock),
BoolVariable('USE_FENV', 'Use <fenv.h> IEEE mode control', have_fenv),
BoolVariable('USE_CHECKER', 'Use checker for detailed CPU models', False),
BoolVariable('CP_ANNOTATE', 'Enable critical path annotation capability', False),
- BoolVariable('RUBY', 'Build with Ruby', False),
)
# These variables get exported to #defines in config/*.hh (see src/SConscript).
-export_vars += ['FULL_SYSTEM', 'USE_FENV', 'USE_MYSQL',
+export_vars += ['FULL_SYSTEM', 'USE_FENV',
'NO_FAST_ALLOC', 'FORCE_FAST_ALLOC', 'FAST_ALLOC_STATS',
'SS_COMPATIBLE_FP', 'USE_CHECKER', 'TARGET_ISA', 'CP_ANNOTATE',
'USE_POSIX_CLOCK' ]
f.close()
return None
-# Generate the message to be printed when building the config file.
-def build_config_file_string(target, source, env):
- (variable, value) = [s.get_contents() for s in source]
- return "Defining %s as %s in %s." % (variable, value, target[0])
-
# Combine the two functions into a scons Action object.
-config_action = Action(build_config_file, build_config_file_string)
+config_action = MakeAction(build_config_file, Transform("CONFIG H", 2))
# The emitter munges the source & target node lists to reflect what
# we're really doing.
if env['EFENCE']:
env.Append(LIBS=['efence'])
- if env['USE_MYSQL']:
- if not have_mysql:
- print "Warning: MySQL not available; " \
- "forcing USE_MYSQL to False in", variant_dir + "."
- env['USE_MYSQL'] = False
- else:
- print "Compiling in", variant_dir, "with MySQL support."
- env.ParseConfig(mysql_config_libs)
- env.ParseConfig(mysql_config_include)
-
# Save sticky variable settings back to current variables file
sticky_vars.Save(current_vars_file, env)