# -*- mode:python -*-
-# Copyright (c) 2013, 2015 ARM Limited
+# Copyright (c) 2013, 2015, 2016 ARM Limited
# All rights reserved.
#
# The license below extends only to copyright in the software and shall
hgdir = main.root.Dir(".hg")
-mercurial_style_message = """
+
+style_message = """
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.
+against the gem5 style rules on %s.
+This script will now install the hook in your %s.
Press enter to continue, or ctrl-c to abort: """
+mercurial_style_message = style_message % ("hg commit and qrefresh commands",
+ ".hg/hgrc file")
+git_style_message = style_message % ("'git commit'",
+ ".git/hooks/ directory")
+
mercurial_style_upgrade_message = """
Your Mercurial style hooks are not up-to-date. This script will now
try to automatically update them. A backup of your hgrc will be saved
"""
# 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():
+# Skip this if --ignore-style was specified, there's no interactive
+# terminal to prompt, or no recognized revision control system can be
+# found.
+ignore_style = GetOption('ignore_style') or not sys.stdin.isatty()
+
+# Try wire up Mercurial to the style hooks
+if not ignore_style and hgdir.exists():
style_hook = True
style_hooks = tuple()
hgrc = hgdir.File('hgrc')
shutil.copyfile(hgrc.abspath, hgrc_old.abspath)
re_style_hook = re.compile(r"^([^=#]+)\.style\s*=\s*([^#\s]+).*")
re_style_extension = re.compile("style\s*=\s*([^#\s]+).*")
- with open(hgrc_old.abspath, 'r') as old, \
- open(hgrc.abspath, 'w') as new:
-
- for l in old:
- m_hook = re_style_hook.match(l)
- m_ext = re_style_extension.match(l)
- if m_hook:
- hook, check = m_hook.groups()
- if check != "python:style.check_style":
- print "Warning: %s.style is using a non-default " \
- "checker: %s" % (hook, check)
- if hook not in ("pretxncommit", "pre-qrefresh"):
- print "Warning: Updating unknown style hook: %s" % hook
-
- l = "%s.style = python:hgstyle.check_style\n" % hook
- elif m_ext and m_ext.group(1) == style_extension:
- l = "hgstyle = %s/util/hgstyle.py\n" % main.root.abspath
-
- new.write(l)
+ old, new = open(hgrc_old.abspath, 'r'), open(hgrc.abspath, 'w')
+ for l in old:
+ m_hook = re_style_hook.match(l)
+ m_ext = re_style_extension.match(l)
+ if m_hook:
+ hook, check = m_hook.groups()
+ if check != "python:style.check_style":
+ print "Warning: %s.style is using a non-default " \
+ "checker: %s" % (hook, check)
+ if hook not in ("pretxncommit", "pre-qrefresh"):
+ print "Warning: Updating unknown style hook: %s" % hook
+
+ l = "%s.style = python:hgstyle.check_style\n" % hook
+ elif m_ext and m_ext.group(1) == style_extension:
+ l = "hgstyle = %s/util/hgstyle.py\n" % main.root.abspath
+
+ new.write(l)
elif not style_hook:
print mercurial_style_message,
# continue unless user does ctrl-c/ctrl-d etc.
print "Error updating", hgrc_path
sys.exit(1)
+def install_git_style_hooks():
+ try:
+ gitdir = Dir(readCommand(
+ ["git", "rev-parse", "--git-dir"]).strip("\n"))
+ except Exception, e:
+ print "Warning: Failed to find git repo directory: %s" % e
+ return
+
+ git_hooks = gitdir.Dir("hooks")
+ git_pre_commit_hook = git_hooks.File("pre-commit")
+ git_style_script = File("util/git-pre-commit.py")
+
+ if git_pre_commit_hook.exists():
+ return
+
+ print git_style_message,
+ try:
+ raw_input()
+ except:
+ print "Input exception, exiting scons.\n"
+ sys.exit(1)
+
+ if not git_hooks.exists():
+ mkdir(git_hooks.get_abspath())
+
+ # Use a relative symlink if the hooks live in the source directory
+ if git_pre_commit_hook.is_under(main.root):
+ script_path = os.path.relpath(
+ git_style_script.get_abspath(),
+ git_pre_commit_hook.Dir(".").get_abspath())
+ else:
+ script_path = git_style_script.get_abspath()
+
+ try:
+ os.symlink(script_path, git_pre_commit_hook.get_abspath())
+ except:
+ print "Error updating git pre-commit hook"
+ raise
+
+# Try to wire up git to the style hooks
+if not ignore_style and main.root.Entry(".git").exists():
+ install_git_style_hooks()
###################################################
#
Exit(1)
if main['GCC']:
- # Check for a supported version of gcc. >= 4.7 is chosen for its
+ # Check for a supported version of gcc. >= 4.8 is chosen for its
# level of c++11 support. See
# http://gcc.gnu.org/projects/cxx0x.html for details.
gcc_version = readCommand([main['CXX'], '-dumpversion'], exception=False)
- if compareVersions(gcc_version, "4.7") < 0:
- print 'Error: gcc version 4.7 or newer required.'
+ if compareVersions(gcc_version, "4.8") < 0:
+ print 'Error: gcc version 4.8 or newer required.'
print ' Installed version:', gcc_version
Exit(1)
# to avoid performance penalties on certain AMD chips. Older
# assemblers detect this as an error, "Error: expecting string
# instruction after `rep'"
- if compareVersions(gcc_version, "4.8") > 0:
- as_version_raw = readCommand([main['AS'], '-v', '/dev/null'],
- exception=False).split()
-
- # version strings may contain extra distro-specific
- # qualifiers, so play it safe and keep only what comes before
- # the first hyphen
- as_version = as_version_raw[-1].split('-')[0] if as_version_raw \
- else None
-
- if not as_version or compareVersions(as_version, "2.23") < 0:
- print termcap.Yellow + termcap.Bold + \
- 'Warning: This combination of gcc and binutils have' + \
- ' known incompatibilities.\n' + \
- ' If you encounter build problems, please update ' + \
- 'binutils to 2.23.' + \
- termcap.Normal
+ as_version_raw = readCommand([main['AS'], '-v', '/dev/null'],
+ exception=False).split()
+
+ # version strings may contain extra distro-specific
+ # qualifiers, so play it safe and keep only what comes before
+ # the first hyphen
+ as_version = as_version_raw[-1].split('-')[0] if as_version_raw else None
+
+ if not as_version or compareVersions(as_version, "2.23") < 0:
+ print termcap.Yellow + termcap.Bold + \
+ 'Warning: This combination of gcc and binutils have' + \
+ ' known incompatibilities.\n' + \
+ ' If you encounter build problems, please update ' + \
+ 'binutils to 2.23.' + \
+ termcap.Normal
# Make sure we warn if the user has requested to compile with the
# Undefined Benahvior Sanitizer and this version of gcc does not
main.Append(TCMALLOC_CCFLAGS=['-fno-builtin-malloc', '-fno-builtin-calloc',
'-fno-builtin-realloc', '-fno-builtin-free'])
+ # add option to check for undeclared overrides
+ if compareVersions(gcc_version, "5.0") > 0:
+ main.Append(CCFLAGS=['-Wno-error=suggest-override'])
+
elif main['CLANG']:
# Check for a supported version of clang, >= 3.1 is needed to
- # support similar features as gcc 4.7. See
+ # support similar features as gcc 4.8. See
# http://clang.llvm.org/cxx_status.html for details
clang_version_re = re.compile(".* version (\d+\.\d+)")
clang_version_match = clang_version_re.search(CXX_version)