sim, kvm: make KvmVM a System parameter
[gem5.git] / SConstruct
index 9f277d2a96f6f37a31a5a045f4273526c884a407..e728e51fda8df2e7bed3bffd2fe6453267de9f81 100755 (executable)
@@ -260,17 +260,18 @@ main.AppendENVPath('PYTHONPATH', extra_python_paths)
 ########################################################################
 
 hgdir = main.root.Dir(".hg")
-gitdir = main.root.Dir(".git")
 
 
 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 %s.
+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/hgrc file"
-git_style_message = style_message % ".git/hooks/ directory"
+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
@@ -366,11 +367,21 @@ if not ignore_style and hgdir.exists():
             print "Error updating", hgrc_path
             sys.exit(1)
 
-# Try to wire up git to the style hooks
-git_pre_commit_hook = gitdir.File("hooks/pre-commit")
-if not ignore_style and gitdir.exists() and not git_pre_commit_hook.exists():
+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()
@@ -378,15 +389,26 @@ if not ignore_style and gitdir.exists() and not git_pre_commit_hook.exists():
         print "Input exception, exiting scons.\n"
         sys.exit(1)
 
-    try:
-        rel_style_script = os.path.relpath(
+    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())
-        os.symlink(rel_style_script, git_pre_commit_hook.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
-        sys.exit(1)
+
+# Try to wire up git to the style hooks
+if not ignore_style and main.root.Entry(".git").exists():
+    install_git_style_hooks()
 
 ###################################################
 #
@@ -633,6 +655,9 @@ if main['GCC'] or main['CLANG']:
                          '-Wno-sign-compare', '-Wno-unused-parameter'])
     # We always compile using C++11
     main.Append(CXXFLAGS=['-std=c++11'])
+    if sys.platform.startswith('freebsd'):
+        main.Append(CCFLAGS=['-I/usr/local/include'])
+        main.Append(CXXFLAGS=['-I/usr/local/include'])
 else:
     print termcap.Yellow + termcap.Bold + 'Error' + termcap.Normal,
     print "Don't know what compiler options to use for your compiler."
@@ -653,12 +678,12 @@ else:
     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)
 
@@ -668,23 +693,21 @@ if main['GCC']:
     # 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
@@ -711,9 +734,13 @@ if main['GCC']:
     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)
@@ -747,6 +774,10 @@ elif main['CLANG']:
         main.Append(CXXFLAGS=['-stdlib=libc++'])
         main.Append(LIBS=['c++'])
 
+    # On FreeBSD we need libthr.
+    if sys.platform.startswith('freebsd'):
+        main.Append(LIBS=['thr'])
+
 else:
     print termcap.Yellow + termcap.Bold + 'Error' + termcap.Normal,
     print "Don't know what compiler options to use for your compiler."
@@ -860,8 +891,12 @@ main.Append(SWIGFLAGS=swig_flags)
 # Check for 'timeout' from GNU coreutils. If present, regressions will
 # be run with a time limit. We require version 8.13 since we rely on
 # support for the '--foreground' option.
-timeout_lines = readCommand(['timeout', '--version'],
-                            exception='').splitlines()
+if sys.platform.startswith('freebsd'):
+    timeout_lines = readCommand(['gtimeout', '--version'],
+                                exception='').splitlines()
+else:
+    timeout_lines = readCommand(['timeout', '--version'],
+                                exception='').splitlines()
 # Get the first line and tokenize it
 timeout_version = timeout_lines[0].split() if timeout_lines else []
 main['TIMEOUT'] =  timeout_version and \
@@ -1059,6 +1094,11 @@ backtrace_impls = [ "none" ]
 if conf.CheckLibWithHeader(None, 'execinfo.h', 'C',
                            'backtrace_symbols_fd((void*)0, 0, 0);'):
     backtrace_impls.append("glibc")
+elif conf.CheckLibWithHeader('execinfo', 'execinfo.h', 'C',
+                           'backtrace_symbols_fd((void*)0, 0, 0);'):
+    # NetBSD and FreeBSD need libexecinfo.
+    backtrace_impls.append("glibc")
+    main.Append(LIBS=['execinfo'])
 
 if backtrace_impls[-1] == "none":
     default_backtrace_impl = "none"
@@ -1478,6 +1518,9 @@ for variant_path in variant_paths:
                 "target ISA combination"
             env['USE_KVM'] = False
 
+    if env['BUILD_GPU']:
+        env.Append(CPPDEFINES=['BUILD_GPU'])
+
     # Warn about missing optional functionality
     if env['USE_KVM']:
         if not main['HAVE_PERF_ATTR_EXCLUDE_HOST']: