# 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
for base in type(self).__mro__:
if issubclass(base, SourceFile):
- bisect.insort_right(base.all, self)
+ base.all.append(self)
def __lt__(self, other): return self.filename < other.filename
def __le__(self, other): return self.filename <= other.filename
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)
raise AttributeError, "Flag %s already specified" % name
compound = tuple(flags)
- for flag in compound:
- if flag not in trace_flags:
- raise AttributeError, "Trace flag %s not found" % flag
- if trace_flags[flag][1]:
- raise AttributeError, \
- "Compound flag can't point to another compound flag"
-
trace_flags[name] = (name, compound, desc)
Export('TraceFlag')
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):
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.'''
self.installed = set()
def find_module(self, fullname, path):
- if fullname == 'defines':
+ if fullname == 'm5.defines':
return self
if fullname == 'm5.objects':
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
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:
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
#
# 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
# 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)
makeSwigInit)
Source('python/swig/init.cc')
+def getFlags(source_flags):
+ flagsMap = {}
+ flagsList = []
+ for s in source_flags:
+ val = eval(s.get_contents())
+ name, compound, desc = val
+ flagsList.append(val)
+ flagsMap[name] = bool(compound)
+
+ for name, compound, desc in flagsList:
+ for flag in compound:
+ if flag not in flagsMap:
+ raise AttributeError, "Trace flag %s not found" % flag
+ if flagsMap[flag]:
+ raise AttributeError, \
+ "Compound flag can't point to another compound flag"
+
+ flagsList.sort()
+ return flagsList
+
+
# Generate traceflags.py
def traceFlagsPy(target, source, env):
assert(len(target) == 1)
f = file(str(target[0]), 'w')
-
- allFlags = []
- for s in source:
- val = eval(s.get_contents())
- allFlags.append(val)
-
- allFlags.sort()
+
+ allFlags = getFlags(source)
print >>f, 'basic = ['
for flag, compound, desc in allFlags:
f = file(str(target[0]), 'w')
- allFlags = []
- for s in source:
- val = eval(s.get_contents())
- allFlags.append(val)
+ allFlags = getFlags(source)
# file header
print >>f, '''
f = file(str(target[0]), 'w')
- allFlags = []
- for s in source:
- val = eval(s.get_contents())
- allFlags.append(val)
+ allFlags = getFlags(source)
# file header boilerplate
print >>f, '''
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
dst = file(str(target[0]), 'w')
def dump_mod(sym, endchar=','):
+ def c_str(string):
+ if string is None:
+ return "0"
+ return '"%s"' % string
pysource = PySource.symnames[sym]
- print >>dst, ' { "%s",' % pysource.arcname
- print >>dst, ' "%s",' % pysource.modpath
- print >>dst, ' %s_beg, %s_end,' % (sym, sym)
- print >>dst, ' %s_end - %s_beg,' % (sym, sym)
- print >>dst, ' *(int *)%s_end }%s' % (sym, endchar)
+ print >>dst, ' { %s,' % c_str(pysource.arcname)
+ print >>dst, ' %s,' % c_str(pysource.abspath)
+ print >>dst, ' %s,' % c_str(pysource.modpath)
+ print >>dst, ' %s_beg, %s_end,' % (sym, sym)
+ print >>dst, ' %s_end - %s_beg,' % (sym, sym)
+ print >>dst, ' *(int *)%s_end }%s' % (sym, endchar)
print >>dst, '#include "sim/init.hh"'
# Skip the importer since we've already exported it
continue
dump_mod(sym)
- print >>dst, " { 0, 0, 0, 0, 0, 0 }"
+ print >>dst, " { 0, 0, 0, 0, 0, 0, 0 }"
print >>dst, "};"
static_objs.append(static_date)
shared_date = make_obj(date_source, static=False, extra_deps=shared_objs)
- shared_objs.append(static_date)
+ shared_objs.append(shared_date)
# First make a library of everything but main() so other programs can
# link against m5.