Change everything to use the cached virtPort rather than created their own each time.
[gem5.git] / SConstruct
index 1a54bbbf6a15e77043be5ad09bddd94bf9e13bc9..792cb7554e86db973af5074e5b4b3fdab31334a9 100644 (file)
@@ -65,6 +65,7 @@
 
 import sys
 import os
+import re
 
 from os.path import isdir, isfile, join as joinpath
 
@@ -82,15 +83,67 @@ EnsurePythonVersion(2,4)
 # Python < 2.4.
 import subprocess
 
-# Ironically, SCons 0.96 dies if you give EnsureSconsVersion a
-# 3-element version number.
-min_scons_version = (0,96,91)
-try:
-    EnsureSConsVersion(*min_scons_version)
-except:
-    print "Error checking current SCons version."
-    print "SCons", ".".join(map(str,min_scons_version)), "or greater required."
-    Exit(2)
+# helper function: compare arrays or strings of version numbers.
+# E.g., compare_version((1,3,25), (1,4,1)')
+# returns -1, 0, 1 if v1 is <, ==, > v2
+def compare_versions(v1, v2):
+    def make_version_list(v):
+        if isinstance(v, (list,tuple)):
+            return v
+        elif isinstance(v, str):
+            return map(int, v.split('.'))
+        else:
+            raise TypeError
+
+    v1 = make_version_list(v1)
+    v2 = make_version_list(v2)
+    # Compare corresponding elements of lists
+    for n1,n2 in zip(v1, v2):
+        if n1 < n2: return -1
+        if n1 > n2: return  1
+    # all corresponding values are equal... see if one has extra values
+    if len(v1) < len(v2): return -1
+    if len(v1) > len(v2): return  1
+    return 0
+
+# SCons version numbers need special processing because they can have
+# charecters and an release date embedded in them. This function does
+# the magic to extract them in a similar way to the SCons internal function
+# function does and then checks that the current version is not contained in
+# a list of version tuples (bad_ver_strs)
+def CheckSCons(bad_ver_strs):
+    def scons_ver(v):
+        num_parts = v.split(' ')[0].split('.')
+        major = int(num_parts[0])
+        minor = int(re.match('\d+', num_parts[1]).group())
+        rev = 0
+        rdate = 0
+        if len(num_parts) > 2:
+            try: rev = int(re.match('\d+', num_parts[2]).group())
+            except: pass
+            rev_parts = num_parts[2].split('d')
+            if len(rev_parts) > 1:
+                rdate = int(re.match('\d+', rev_parts[1]).group())
+
+        return (major, minor, rev, rdate)
+
+    sc_ver = scons_ver(SCons.__version__)
+    for bad_ver in bad_ver_strs:
+        bv = (scons_ver(bad_ver[0]), scons_ver(bad_ver[1]))
+        if  compare_versions(sc_ver, bv[0]) != -1 and\
+            compare_versions(sc_ver, bv[1]) != 1:
+            print "The version of SCons that you have installed: ", SCons.__version__
+            print "has a bug that prevents it from working correctly with M5."
+            print "Please install a version NOT contained within the following",
+            print "ranges (inclusive):"
+            for bad_ver in bad_ver_strs:
+                print "    %s - %s" % bad_ver
+            Exit(2)
+
+CheckSCons(( 
+    # We need a version that is 0.96.91 or newer
+    ('0.0.0', '0.96.90'), 
+    ))
 
 
 # The absolute path to the current directory (where this file lives).
@@ -147,22 +200,6 @@ def rfind(l, elt, offs = -1):
             return i
     raise ValueError, "element not found"
 
-# helper function: compare dotted version numbers.
-# E.g., compare_version('1.3.25', '1.4.1')
-# returns -1, 0, 1 if v1 is <, ==, > v2
-def compare_versions(v1, v2):
-    # Convert dotted strings to lists
-    v1 = map(int, v1.split('.'))
-    v2 = map(int, v2.split('.'))
-    # Compare corresponding elements of lists
-    for n1,n2 in zip(v1, v2):
-        if n1 < n2: return -1
-        if n1 > n2: return  1
-    # all corresponding values are equal... see if one has extra values
-    if len(v1) < len(v2): return -1
-    if len(v1) > len(v2): return  1
-    return 0
-
 # 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
@@ -263,6 +300,8 @@ global_sticky_opts = Options(global_sticky_opts_file, args=ARGUMENTS)
 global_sticky_opts.AddOptions(
     ('CC', 'C compiler', os.environ.get('CC', env['CC'])),
     ('CXX', 'C++ compiler', os.environ.get('CXX', env['CXX'])),
+    ('BATCH', 'Use batch pool for build and tests', False),
+    ('BATCH_CMD', 'Batch pool submission command name', 'qdo'),
     ('EXTRAS', 'Add Extra directories to the compilation', '',
      PathListAllExist, PathListMakeAbsolute)
     )    
@@ -329,6 +368,12 @@ else:
     print '       Please fix SConstruct and src/SConscript and try again.'
     Exit(1)
 
+# Do this after we save setting back, or else we'll tack on an
+# extra 'qdo' every time we run scons.
+if env['BATCH']:
+    env['CC']  = env['BATCH_CMD'] + ' ' + env['CC']
+    env['CXX'] = env['BATCH_CMD'] + ' ' + env['CXX']
+
 if sys.platform == 'cygwin':
     # cygwin has some header file issues...
     env.Append(CCFLAGS=Split("-Wno-uninitialized"))
@@ -397,7 +442,6 @@ try:
             env.Append(CFLAGS='-arch x86_64')
             env.Append(LINKFLAGS='-arch x86_64')
             env.Append(ASFLAGS='-arch x86_64')
-            env['OSX64bit'] = True
 except:
     pass
 
@@ -537,6 +581,10 @@ sticky_opts.AddOptions(
     # scons 0.96.90 or later.
     ListOption('CPU_MODELS', 'CPU models', default_cpus, all_cpu_list),
     BoolOption('NO_FAST_ALLOC', 'Disable fast object allocator', False),
+    BoolOption('FAST_ALLOC_DEBUG', 'Enable fast object allocator debugging',
+               False),
+    BoolOption('FAST_ALLOC_STATS', 'Enable fast object allocator statistics',
+               False),
     BoolOption('EFENCE', 'Link with Electric Fence malloc debugger',
                False),
     BoolOption('SS_COMPATIBLE_FP',
@@ -548,8 +596,6 @@ sticky_opts.AddOptions(
     BoolOption('USE_MYSQL', 'Use MySQL for stats output', have_mysql),
     BoolOption('USE_FENV', 'Use <fenv.h> IEEE mode control', have_fenv),
     BoolOption('USE_CHECKER', 'Use checker for detailed CPU models', False),
-    BoolOption('BATCH', 'Use batch pool for build and tests', False),
-    ('BATCH_CMD', 'Batch pool submission command name', 'qdo'),
     ('PYTHONHOME',
      'Override the default PYTHONHOME for this system (use with caution)',
      '%s:%s' % (sys.prefix, sys.exec_prefix)),
@@ -561,7 +607,8 @@ nonsticky_opts.AddOptions(
 
 # These options get exported to #defines in config/*.hh (see src/SConscript).
 env.ExportOptions = ['FULL_SYSTEM', 'ALPHA_TLASER', 'USE_FENV', \
-                     'USE_MYSQL', 'NO_FAST_ALLOC', 'SS_COMPATIBLE_FP', \
+                     'USE_MYSQL', 'NO_FAST_ALLOC', 'FAST_ALLOC_DEBUG', \
+                     'FAST_ALLOC_STATS', 'SS_COMPATIBLE_FP', \
                      'USE_CHECKER', 'PYTHONHOME', 'TARGET_ISA']
 
 # Define a handy 'no-op' action
@@ -774,12 +821,6 @@ for build_path in build_paths:
     # Save sticky option settings back to current options file
     sticky_opts.Save(current_opts_file, env)
 
-    # Do this after we save setting back, or else we'll tack on an
-    # extra 'qdo' every time we run scons.
-    if env['BATCH']:
-        env['CC']  = env['BATCH_CMD'] + ' ' + env['CC']
-        env['CXX'] = env['BATCH_CMD'] + ' ' + env['CXX']
-
     if env['USE_SSE2']:
         env.Append(CCFLAGS='-msse2')