import sys
import os
+import re
from os.path import isdir, isfile, join as joinpath
# 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).
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
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)
)
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"))
env.Append(CFLAGS='-arch x86_64')
env.Append(LINKFLAGS='-arch x86_64')
env.Append(ASFLAGS='-arch x86_64')
- env['OSX64bit'] = True
except:
pass
# 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',
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)),
# 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
# 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')