X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=SConstruct;h=30c1ed0a637ec7fc840ded00983a68e9a60999e8;hb=e7e2d5ce9072808d94d5fe399e6c4262d92b7923;hp=f99bc1f20ab4f044051e8d5b93c1c7d767c1e3e4;hpb=6d9d0c68b574ceba53fc36d34b83f7109e00b1d0;p=gem5.git diff --git a/SConstruct b/SConstruct index f99bc1f20..30c1ed0a6 100644 --- a/SConstruct +++ b/SConstruct @@ -63,11 +63,11 @@ # ################################################### -# Python library imports import sys import os import subprocess -from os.path import join as joinpath + +from os.path import isdir, join as joinpath # Check for recent-enough Python and SCons versions. If your system's # default installation of Python is not recent enough, you can use a @@ -86,7 +86,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 @@ -97,6 +97,34 @@ SRCDIR = joinpath(ROOT, 'src') # tell python where to find m5 python code sys.path.append(joinpath(ROOT, 'src/python')) +def check_style_hook(ui): + ui.readconfig(joinpath(ROOT, '.hg', 'hgrc')) + style_hook = ui.config('hooks', 'pretxncommit.style', None) + + if not style_hook: + print """\ +You're missing the M5 style hook. +Please install the hook so we can ensure that all code fits a common style. + +All you'd need to do is add the following lines to your repository .hg/hgrc +or your personal .hgrc +---------------- + +[extensions] +style = %s/util/style.py + +[hooks] +pretxncommit.style = python:style.check_whitespace +""" % (ROOT) + sys.exit(1) + +if ARGUMENTS.get('IGNORE_STYLE') != 'True' and isdir(joinpath(ROOT, '.hg')): + try: + from mercurial import ui + check_style_hook(ui.ui()) + except ImportError: + pass + ################################################### # # Figure out which configurations to set up based on the path(s) of @@ -183,7 +211,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') @@ -191,6 +219,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 +239,18 @@ if False: env.Append(ENV = { 'M5_PLY' : Dir('ext/ply') }) env['GCC'] = False env['SUNCC'] = False -env['GCC'] = subprocess.Popen(env['CXX'] + ' --version', shell=True, - stdout=subprocess.PIPE, stderr=subprocess.STDOUT, +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, +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 +259,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 +270,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': @@ -251,7 +287,8 @@ if not env.has_key('SWIG'): # Check for appropriate SWIG version swig_version = os.popen('swig -version').read().split() # First 3 words should be "SWIG Version x.y.z" -if swig_version[0] != 'SWIG' or swig_version[1] != 'Version': +if len(swig_version) < 3 or \ + swig_version[0] != 'SWIG' or swig_version[1] != 'Version': print 'Error determining SWIG version.' Exit(1) @@ -262,16 +299,29 @@ if compare_versions(swig_version[2], min_swig_version) < 0: Exit(1) # Set up SWIG flags & scanner -env.Append(SWIGFLAGS=Split('-c++ -python -modern $_CPPINCFLAGS')) +swig_flags=Split('-c++ -python -modern -templatereduce $_CPPINCFLAGS') +env.Append(SWIGFLAGS=swig_flags) -import SCons.Scanner +# filter out all existing swig scanners, they mess up the dependency +# stuff for some reason +scanners = [] +for scanner in env['SCANNERS']: + skeys = scanner.skeys + if skeys == '.i': + continue -swig_inc_re = '^[ \t]*[%,#][ \t]*(?:include|import)[ \t]*(<|")([^>"]+)(>|")' + if isinstance(skeys, (list, tuple)) and '.i' in skeys: + continue -swig_scanner = SCons.Scanner.ClassicCPP("SwigScan", ".i", "CPPPATH", - swig_inc_re) + scanners.append(scanner) -env.Append(SCANNERS = swig_scanner) +# add the new swig scanner that we like better +from SCons.Scanner import ClassicCPP as CPPScanner +swig_inc_re = '^[ \t]*[%,#][ \t]*(?:include|import)[ \t]*(<|")([^>"]+)(>|")' +scanners.append(CPPScanner("SwigScan", [ ".i" ], "CPPPATH", swig_inc_re)) + +# replace the scanners list that has what we want +env['SCANNERS'] = scanners # Platform-specific configuration. Note again that we assume that all # builds under a given build root run on the same host platform. @@ -357,30 +407,51 @@ 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() + +def ExtraPathValidator(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 + 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), @@ -399,11 +470,11 @@ sticky_opts.AddOptions( ('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)) + '%s:%s' % (sys.prefix, sys.exec_prefix)), + ('EXTRAS', 'Add Extra directories to the compilation', '', + ExtraPathValidator) ) -# 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) ) @@ -457,7 +528,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)]) @@ -508,27 +579,28 @@ 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 # 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 env['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 @@ -539,8 +611,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') ################################################### # @@ -553,6 +624,8 @@ base_env = env for build_path in build_paths: print "Building in", build_path + env['BUILDDIR'] = build_path + # build_dir is the tail component of build path, and is used to # determine the build parameters (e.g., 'ALPHA_SE') (build_root, build_dir) = os.path.split(build_path)