X86: Move startup code to the system object to initialize a Linux system.
[gem5.git] / SConstruct
index a2760c4a407bbe2ae16f655a3f6833f6f1961cd5..062df47d6db3d4b59728545cd2dcbdc4733539d6 100644 (file)
 
 import sys
 import os
-import subprocess
 
 from os.path import isdir, join as joinpath
 
+import SCons
+
 # Check for recent-enough Python and SCons versions.  If your system's
 # default installation of Python is not recent enough, you can use a
 # non-default installation of the Python interpreter by either (1)
@@ -77,6 +78,10 @@ from os.path import isdir, join as joinpath
 # scons script, e.g., "/usr/local/bin/python2.4 `which scons` [args]".
 EnsurePythonVersion(2,4)
 
+# Import subprocess after we check the version since it doesn't exist in
+# 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)
@@ -86,7 +91,7 @@ except:
     print "Error checking current SCons version."
     print "SCons", ".".join(map(str,min_scons_version)), "or greater required."
     Exit(2)
-    
+
 
 # The absolute path to the current directory (where this file lives).
 ROOT = Dir('.').abspath
@@ -118,7 +123,7 @@ pretxncommit.style = python:style.check_whitespace
 """ % (ROOT)
         sys.exit(1)
 
-if isdir(joinpath(ROOT, '.hg')):
+if ARGUMENTS.get('IGNORE_STYLE') != 'True' and isdir(joinpath(ROOT, '.hg')):
     try:
         from mercurial import ui
         check_style_hook(ui.ui())
@@ -211,7 +216,7 @@ env = Environment(ENV = os.environ,  # inherit user's environment vars
                   ROOT = ROOT,
                   SRCDIR = SRCDIR)
 
-#Parse CC/CXX early so that we use the correct compiler for 
+#Parse CC/CXX early so that we use the correct compiler for
 # to test for dependencies/versions/libraries/includes
 if ARGUMENTS.get('CC', None):
     env['CC'] = ARGUMENTS.get('CC')
@@ -236,18 +241,18 @@ if False:
     env.TargetSignatures('content')
 
 # M5_PLY is used by isa_parser.py to find the PLY package.
-env.Append(ENV = { 'M5_PLY' : Dir('ext/ply') })
+env.Append(ENV = { 'M5_PLY' : str(Dir('ext/ply')) })
 env['GCC'] = False
 env['SUNCC'] = False
 env['ICC'] = False
-env['GCC'] = subprocess.Popen(env['CXX'] + ' --version', shell=True, 
-        stdout=subprocess.PIPE, stderr=subprocess.STDOUT, 
+env['GCC'] = subprocess.Popen(env['CXX'] + ' --version', shell=True,
+        stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
         close_fds=True).communicate()[0].find('GCC') >= 0
-env['SUNCC'] = subprocess.Popen(env['CXX'] + ' -V', shell=True, 
-        stdout=subprocess.PIPE, stderr=subprocess.STDOUT, 
+env['SUNCC'] = subprocess.Popen(env['CXX'] + ' -V', shell=True,
+        stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
         close_fds=True).communicate()[0].find('Sun C++') >= 0
-env['ICC'] = subprocess.Popen(env['CXX'] + ' -V', shell=True, 
-        stdout=subprocess.PIPE, stderr=subprocess.STDOUT, 
+env['ICC'] = subprocess.Popen(env['CXX'] + ' -V', shell=True,
+        stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
         close_fds=True).communicate()[0].find('Intel') >= 0
 if env['GCC'] + env['SUNCC'] + env['ICC'] > 1:
     print 'Error: How can we have two at the same time?'
@@ -309,7 +314,7 @@ for scanner in env['SCANNERS']:
     skeys = scanner.skeys
     if skeys == '.i':
         continue
-    
+
     if isinstance(skeys, (list, tuple)) and '.i' in skeys:
         continue
 
@@ -329,6 +334,41 @@ conf = Configure(env,
                  conf_dir = joinpath(build_root, '.scons_config'),
                  log_file = joinpath(build_root, 'scons_config.log'))
 
+# Check if we should compile a 64 bit binary on Mac OS X/Darwin
+try:
+    import platform
+    uname = platform.uname()
+    if uname[0] == 'Darwin' and compare_versions(uname[2], '9.0.0') >= 0:
+        if int(subprocess.Popen('sysctl -n hw.cpu64bit_capable', shell=True,
+               stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
+               close_fds=True).communicate()[0][0]):
+            env.Append(CCFLAGS='-arch x86_64')
+            env.Append(CFLAGS='-arch x86_64')
+            env.Append(LINKFLAGS='-arch x86_64')
+            env.Append(ASFLAGS='-arch x86_64')
+            env['OSX64bit'] = True
+except:
+    pass
+
+# Recent versions of scons substitute a "Null" object for Configure()
+# when configuration isn't necessary, e.g., if the "--help" option is
+# present.  Unfortuantely this Null object always returns false,
+# breaking all our configuration checks.  We replace it with our own
+# more optimistic null object that returns True instead.
+if not conf:
+    def NullCheck(*args, **kwargs):
+        return True
+
+    class NullConf:
+        def __init__(self, env):
+            self.env = env
+        def Finish(self):
+            return self.env
+        def __getattr__(self, mname):
+            return NullCheck
+
+    conf = NullConf(env)
+
 # Find Python include and library directories for embedding the
 # interpreter.  For consistency, we will use the same Python
 # installation used to run scons (and thus this script).  If you want
@@ -435,14 +475,19 @@ all_isa_list.sort()
 all_cpu_list.sort()
 default_cpus.sort()
 
-def ExtraPathValidator(key, val, env):
+def PathListMakeAbsolute(val):
+    if not val:
+        return val
+    f = lambda p: os.path.abspath(os.path.expanduser(p))
+    return ':'.join(map(f, val.split(':')))
+
+def PathListAllExist(key, val, env):
     if not val:
         return
     paths = val.split(':')
     for path in paths:
-        path = os.path.expanduser(path)
         if not isdir(path):
-            raise AttributeError, "Invalid path: '%s'" % path
+            raise SCons.Errors.UserError("Path does not exist: '%s'" % path)
 
 sticky_opts.AddOptions(
     EnumOption('TARGET_ISA', 'Target ISA', 'alpha', all_isa_list),
@@ -472,7 +517,7 @@ sticky_opts.AddOptions(
      'Override the default PYTHONHOME for this system (use with caution)',
      '%s:%s' % (sys.prefix, sys.exec_prefix)),
     ('EXTRAS', 'Add Extra directories to the compilation', '',
-     ExtraPathValidator)
+     PathListAllExist, PathListMakeAbsolute)
     )
 
 nonsticky_opts.AddOptions(
@@ -528,7 +573,7 @@ def config_emitter(target, source, env):
         val = int(val)
     elif isinstance(val, str):
         val = '"' + val + '"'
-        
+
     # Sources are option name & value (packaged in SCons Value nodes)
     return ([target], [Value(option), Value(val)])
 
@@ -585,22 +630,22 @@ def make_switching_dir(dirname, switch_headers, env):
     # header to generate.  'source' is a dummy variable, since we get the
     # list of ISAs from env['ALL_ISA_LIST'].
     def gen_switch_hdr(target, source, env):
-       fname = str(target[0])
-       basename = os.path.basename(fname)
-       f = open(fname, 'w')
-       f.write('#include "arch/isa_specific.hh"\n')
-       cond = '#if'
-       for isa in all_isa_list:
-           f.write('%s THE_ISA == %s_ISA\n#include "%s/%s/%s"\n'
-                   % (cond, isa.upper(), dirname, isa, basename))
-           cond = '#elif'
-       f.write('#else\n#error "THE_ISA not set"\n#endif\n')
-       f.close()
-       return 0
+        fname = str(target[0])
+        basename = os.path.basename(fname)
+        f = open(fname, 'w')
+        f.write('#include "arch/isa_specific.hh"\n')
+        cond = '#if'
+        for isa in all_isa_list:
+            f.write('%s THE_ISA == %s_ISA\n#include "%s/%s/%s"\n'
+                    % (cond, isa.upper(), dirname, isa, basename))
+            cond = '#elif'
+        f.write('#else\n#error "THE_ISA not set"\n#endif\n')
+        f.close()
+        return 0
 
     # String to print when generating header
     def gen_switch_hdr_string(target, source, env):
-       return "Generating switch header " + str(target[0])
+        return "Generating switch header " + str(target[0])
 
     # Build SCons Action object. 'varlist' specifies env vars that this
     # action depends on; when env['ALL_ISA_LIST'] changes these actions