obey the m5 style
[gem5.git] / SConstruct
index f99bc1f20ab4f044051e8d5b93c1c7d767c1e3e4..17391001097c6dbf3503364bd13278fdc0b5dcfc 100644 (file)
 #
 ###################################################
 
-# Python library imports
 import sys
 import os
 import subprocess
+
 from os.path import join as joinpath
 
 # Check for recent-enough Python and SCons versions.  If your system's
@@ -191,6 +191,8 @@ if ARGUMENTS.get('CC', None):
 if ARGUMENTS.get('CXX', None):
     env['CXX'] = ARGUMENTS.get('CXX')
 
+Export('env')
+
 env.SConsignFile(joinpath(build_root,"sconsign"))
 
 # Default duplicate option is to use hard links, but this messes up
@@ -209,14 +211,18 @@ if False:
 env.Append(ENV = { 'M5_PLY' : 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, 
         close_fds=True).communicate()[0].find('GCC') >= 0
 env['SUNCC'] = subprocess.Popen(env['CXX'] + ' -V', shell=True, 
         stdout=subprocess.PIPE, stderr=subprocess.STDOUT, 
         close_fds=True).communicate()[0].find('Sun C++') >= 0
-if (env['GCC'] and env['SUNCC']):
-    print 'Error: How can we have both g++ and Sun C++ at the same time?'
+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?'
     Exit(1)
 
 
@@ -225,6 +231,8 @@ if env['GCC']:
     env.Append(CCFLAGS='-pipe')
     env.Append(CCFLAGS='-fno-strict-aliasing')
     env.Append(CCFLAGS=Split('-Wall -Wno-sign-compare -Werror -Wundef'))
+elif env['ICC']:
+    pass #Fix me... add warning flags once we clean up icc warnings
 elif env['SUNCC']:
     env.Append(CCFLAGS='-Qoption ccfe')
     env.Append(CCFLAGS='-features=gcc')
@@ -234,7 +242,7 @@ elif env['SUNCC']:
 #    env.Append(CCFLAGS='-instances=semiexplicit')
 else:
     print 'Error: Don\'t know what compiler options to use for your compiler.'
-    print '       Please fix SConstruct and try again.'
+    print '       Please fix SConstruct and src/SConscript and try again.'
     Exit(1)
 
 if sys.platform == 'cygwin':
@@ -357,30 +365,42 @@ if have_mysql:
 env = conf.Finish()
 
 # Define the universe of supported ISAs
-env['ALL_ISA_LIST'] = ['alpha', 'sparc', 'mips']
+all_isa_list = [ ]
+Export('all_isa_list')
 
 # Define the universe of supported CPU models
-env['ALL_CPU_LIST'] = ['AtomicSimpleCPU', 'TimingSimpleCPU',
-                       'O3CPU', 'OzoneCPU']
-
-if os.path.isdir(joinpath(SRCDIR, 'encumbered/cpu/full')):
-    env['ALL_CPU_LIST'] += ['FullCPU']
+all_cpu_list = [ ]
+default_cpus = [ ]
+Export('all_cpu_list', 'default_cpus')
 
 # Sticky options get saved in the options file so they persist from
 # one invocation to the next (unless overridden, in which case the new
 # value becomes sticky).
 sticky_opts = Options(args=ARGUMENTS)
+Export('sticky_opts')
+
+# Non-sticky options only apply to the current build.
+nonsticky_opts = Options(args=ARGUMENTS)
+Export('nonsticky_opts')
+
+# Walk the tree and execute all SConsopts scripts that wil add to the
+# above options
+for root, dirs, files in os.walk('.'):
+    if 'SConsopts' in files:
+        SConscript(os.path.join(root, 'SConsopts'))
+
+all_isa_list.sort()
+all_cpu_list.sort()
+default_cpus.sort()
+
 sticky_opts.AddOptions(
-    EnumOption('TARGET_ISA', 'Target ISA', 'alpha', env['ALL_ISA_LIST']),
+    EnumOption('TARGET_ISA', 'Target ISA', 'alpha', all_isa_list),
     BoolOption('FULL_SYSTEM', 'Full-system support', False),
     # There's a bug in scons 0.96.1 that causes ListOptions with list
     # values (more than one value) not to be able to be restored from
     # a saved option file.  If this causes trouble then upgrade to
     # scons 0.96.90 or later.
-    ListOption('CPU_MODELS', 'CPU models', 'AtomicSimpleCPU,TimingSimpleCPU,O3CPU',
-               env['ALL_CPU_LIST']),
-    BoolOption('ALPHA_TLASER',
-               'Model Alpha TurboLaser platform (vs. Tsunami)', False),
+    ListOption('CPU_MODELS', 'CPU models', default_cpus, all_cpu_list),
     BoolOption('NO_FAST_ALLOC', 'Disable fast object allocator', False),
     BoolOption('EFENCE', 'Link with Electric Fence malloc debugger',
                False),
@@ -402,8 +422,6 @@ sticky_opts.AddOptions(
      '%s:%s' % (sys.prefix, sys.exec_prefix))
     )
 
-# Non-sticky options only apply to the current build.
-nonsticky_opts = Options(args=ARGUMENTS)
 nonsticky_opts.AddOptions(
     BoolOption('update_ref', 'Update test reference outputs', False)
     )
@@ -508,6 +526,7 @@ env.SConscript('ext/libelf/SConscript',
 #
 ###################################################
 
+env['ALL_ISA_LIST'] = all_isa_list
 def make_switching_dir(dirname, switch_headers, env):
     # Generate the header.  target[0] is the full path of the output
     # header to generate.  'source' is a dummy variable, since we get the
@@ -518,7 +537,7 @@ def make_switching_dir(dirname, switch_headers, env):
        f = open(fname, 'w')
        f.write('#include "arch/isa_specific.hh"\n')
        cond = '#if'
-       for isa in env['ALL_ISA_LIST']:
+       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'
@@ -539,8 +558,7 @@ def make_switching_dir(dirname, switch_headers, env):
     # Instantiate actions for each header
     for hdr in switch_headers:
         env.Command(hdr, [], switch_hdr_action)
-
-env.make_switching_dir = make_switching_dir
+Export('make_switching_dir')
 
 ###################################################
 #