summaryrefslogtreecommitdiff
path: root/src/SConscript
diff options
context:
space:
mode:
Diffstat (limited to 'src/SConscript')
-rw-r--r--src/SConscript100
1 files changed, 71 insertions, 29 deletions
diff --git a/src/SConscript b/src/SConscript
index d96922b49..d02d2a6e7 100644
--- a/src/SConscript
+++ b/src/SConscript
@@ -49,7 +49,7 @@ Import('*')
# Children need to see the environment
Export('env')
-build_env = dict([(opt, env[opt]) for opt in export_vars])
+build_env = [(opt, env[opt]) for opt in export_vars]
########################################################################
# Code for adding source files of various types
@@ -132,15 +132,15 @@ class PySource(SourceFile):
modpath = '.'.join(modpath)
arcpath = path + [ self.basename ]
- debugname = self.snode.abspath
- if not exists(debugname):
- debugname = self.tnode.abspath
+ abspath = self.snode.abspath
+ if not exists(abspath):
+ abspath = self.tnode.abspath
self.package = package
self.modname = modname
self.modpath = modpath
self.arcname = joinpath(*arcpath)
- self.debugname = debugname
+ self.abspath = abspath
self.compiled = File(self.filename + 'c')
self.assembly = File(self.filename + '.s')
self.symname = "PyEMB_" + PySource.invalid_sym_char.sub('_', modpath)
@@ -228,9 +228,6 @@ env.Append(CPPPATH=Dir('.'))
for extra_dir in extras_dir_list:
env.Append(CPPPATH=Dir(extra_dir))
-# Add a flag defining what THE_ISA should be for all compilation
-env.Append(CPPDEFINES=[('THE_ISA','%s_ISA' % env['TARGET_ISA'].upper())])
-
# Workaround for bug in SCons version > 0.97d20071212
# Scons bug id: 2006 M5 Bug id: 308
for root, dirs, files in os.walk(base_dir, topdown=True):
@@ -261,11 +258,38 @@ for extra_dir in extras_dir_list:
for opt in export_vars:
env.ConfigFile(opt)
+def makeTheISA(source, target, env):
+ f = file(str(target[0]), 'w')
+
+ isas = [ src.get_contents() for src in source ]
+ target = env['TARGET_ISA']
+ def define(isa):
+ return isa.upper() + '_ISA'
+
+ def namespace(isa):
+ return isa[0].upper() + isa[1:].lower() + 'ISA'
+
+
+ print >>f, '#ifndef __CONFIG_THE_ISA_HH__'
+ print >>f, '#define __CONFIG_THE_ISA_HH__'
+ print >>f
+ for i,isa in enumerate(isas):
+ print >>f, '#define %s %d' % (define(isa), i + 1)
+ print >>f
+ print >>f, '#define THE_ISA %s' % (define(target))
+ print >>f, '#define TheISA %s' % (namespace(target))
+ print >>f
+ print >>f, '#endif // __CONFIG_THE_ISA_HH__'
+
+env.Command('config/the_isa.hh', map(Value, all_isa_list), makeTheISA)
+
########################################################################
#
# Prevent any SimObjects from being added after this point, they
# should all have been added in the SConscripts above
#
+SimObject.fixed = True
+
class DictImporter(object):
'''This importer takes a dictionary of arbitrary module names that
map to arbitrary filenames.'''
@@ -283,7 +307,7 @@ class DictImporter(object):
self.installed = set()
def find_module(self, fullname, path):
- if fullname == 'defines':
+ if fullname == 'm5.defines':
return self
if fullname == 'm5.objects':
@@ -293,7 +317,7 @@ class DictImporter(object):
return None
source = self.modules.get(fullname, None)
- if source is not None and exists(source.snode.abspath):
+ if source is not None and fullname.startswith('m5.objects'):
return self
return None
@@ -308,28 +332,31 @@ class DictImporter(object):
mod.__path__ = fullname.split('.')
return mod
- if fullname == 'defines':
- mod.__dict__['buildEnv'] = build_env
+ if fullname == 'm5.defines':
+ mod.__dict__['buildEnv'] = m5.util.SmartDict(build_env)
return mod
source = self.modules[fullname]
if source.modname == '__init__':
mod.__path__ = source.modpath
- mod.__file__ = source.snode.abspath
+ mod.__file__ = source.abspath
- exec file(source.snode.abspath, 'r') in mod.__dict__
+ exec file(source.abspath, 'r') in mod.__dict__
return mod
+import m5.SimObject
+import m5.params
+
+m5.SimObject.clear()
+m5.params.clear()
+
# install the python importer so we can grab stuff from the source
# tree itself. We can't have SimObjects added after this point or
# else we won't know about them for the rest of the stuff.
-SimObject.fixed = True
importer = DictImporter(PySource.modules)
sys.meta_path[0:0] = [ importer ]
-import m5
-
# import all sim objects so we can populate the all_objects list
# make sure that we're working with a list, then let's sort it
for modname in SimObject.modnames:
@@ -346,6 +373,12 @@ all_enums = m5.params.allEnums
all_params = {}
for name,obj in sorted(sim_objects.iteritems()):
for param in obj._params.local.values():
+ # load the ptype attribute now because it depends on the
+ # current version of SimObject.allClasses, but when scons
+ # actually uses the value, all versions of
+ # SimObject.allClasses will have been loaded
+ param.ptype
+
if not hasattr(param, 'swig_decl'):
continue
pname = param.ptype_str
@@ -365,13 +398,27 @@ depends = [ PySource.modules[dep].tnode for dep in module_depends ]
#
# Generate Python file containing a dict specifying the current
-# build_env flags.
+# buildEnv flags.
def makeDefinesPyFile(target, source, env):
- f = file(str(target[0]), 'w')
build_env, hg_info = [ x.get_contents() for x in source ]
- print >>f, "buildEnv = %s" % build_env
- print >>f, "hgRev = '%s'" % hg_info
- f.close()
+
+ code = m5.util.code_formatter()
+ code("""
+import m5.internal
+import m5.util
+
+buildEnv = m5.util.SmartDict($build_env)
+hgRev = '$hg_info'
+
+compileDate = m5.internal.core.compileDate
+_globals = globals()
+for key,val in m5.internal.core.__dict__.iteritems():
+ if key.startswith('flag_'):
+ flag = key[5:]
+ _globals[flag] = val
+del _globals
+""")
+ code.write(str(target[0]))
defines_info = [ Value(build_env), Value(env['HG_INFO']) ]
# Generate a file with all of the compile options in it
@@ -467,12 +514,7 @@ for name,simobj in sorted(sim_objects.iteritems()):
# Generate any parameter header files needed
params_i_files = []
for name,param in all_params.iteritems():
- if isinstance(param, m5.params.VectorParamDesc):
- ext = 'vptype'
- else:
- ext = 'ptype'
-
- i_file = File('params/%s_%s.i' % (name, ext))
+ i_file = File('params/%s_%s.i' % (name, param.file_ext))
params_i_files.append(i_file)
env.Command(i_file, Value(name), createSwigParam)
env.Depends(i_file, depends)
@@ -850,7 +892,7 @@ def objectifyPyFile(target, source, env):
dst = file(str(target[0]), 'w')
pysource = PySource.tnodes[source[0]]
- compiled = compile(src, pysource.debugname, 'exec')
+ compiled = compile(src, pysource.abspath, 'exec')
marshalled = marshal.dumps(compiled)
compressed = zlib.compress(marshalled)
data = compressed