2004-08-05 11:03:47 +02:00
|
|
|
# -*- mode:python -*-
|
|
|
|
|
2005-06-05 11:16:00 +02:00
|
|
|
# Copyright (c) 2004-2005 The Regents of The University of Michigan
|
2004-08-05 11:03:47 +02:00
|
|
|
# All rights reserved.
|
|
|
|
#
|
|
|
|
# Redistribution and use in source and binary forms, with or without
|
|
|
|
# modification, are permitted provided that the following conditions are
|
|
|
|
# met: redistributions of source code must retain the above copyright
|
|
|
|
# notice, this list of conditions and the following disclaimer;
|
|
|
|
# redistributions in binary form must reproduce the above copyright
|
|
|
|
# notice, this list of conditions and the following disclaimer in the
|
|
|
|
# documentation and/or other materials provided with the distribution;
|
|
|
|
# neither the name of the copyright holders nor the names of its
|
|
|
|
# contributors may be used to endorse or promote products derived from
|
|
|
|
# this software without specific prior written permission.
|
|
|
|
#
|
|
|
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
|
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
|
|
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
|
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
|
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
|
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
|
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
|
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
2006-06-01 01:26:56 +02:00
|
|
|
#
|
|
|
|
# Authors: Steve Reinhardt
|
|
|
|
# Nathan Binkert
|
2004-08-05 11:03:47 +02:00
|
|
|
|
2007-03-11 08:00:54 +01:00
|
|
|
import os
|
|
|
|
import zipfile
|
2005-03-14 13:46:26 +01:00
|
|
|
|
2006-05-30 19:11:34 +02:00
|
|
|
# handy function for path joins
|
|
|
|
def join(*args):
|
|
|
|
return os.path.normpath(os.path.join(*args))
|
2005-03-14 13:46:26 +01:00
|
|
|
|
2007-03-11 08:00:54 +01:00
|
|
|
Import('*')
|
2005-01-15 10:12:25 +01:00
|
|
|
|
2006-06-10 05:01:31 +02:00
|
|
|
# This SConscript is in charge of collecting .py files and generating
|
|
|
|
# a zip archive that is appended to the m5 binary.
|
2006-05-30 19:11:34 +02:00
|
|
|
|
|
|
|
# List of files & directories to include in the zip file. To include
|
|
|
|
# a package, list only the root directory of the package, not any
|
|
|
|
# internal .py files (else they will get the path stripped off when
|
|
|
|
# they are imported into the zip file).
|
|
|
|
pyzip_files = []
|
|
|
|
|
|
|
|
# List of additional files on which the zip archive depends, but which
|
|
|
|
# are not included in pyzip_files... i.e. individual .py files within
|
|
|
|
# a package.
|
|
|
|
pyzip_dep_files = []
|
|
|
|
|
|
|
|
# Add the specified package to the zip archive. Adds the directory to
|
|
|
|
# pyzip_files and all included .py files to pyzip_dep_files.
|
|
|
|
def addPkg(pkgdir):
|
2006-06-10 05:01:31 +02:00
|
|
|
pyzip_files.append(pkgdir)
|
2006-05-30 19:11:34 +02:00
|
|
|
origdir = os.getcwd()
|
|
|
|
srcdir = join(Dir('.').srcnode().abspath, pkgdir)
|
|
|
|
os.chdir(srcdir)
|
|
|
|
for path, dirs, files in os.walk('.'):
|
|
|
|
for i,dir in enumerate(dirs):
|
|
|
|
if dir == 'SCCS':
|
|
|
|
del dirs[i]
|
|
|
|
break
|
|
|
|
|
|
|
|
for f in files:
|
|
|
|
if f.endswith('.py'):
|
2006-06-10 05:01:31 +02:00
|
|
|
pyzip_dep_files.append(join(pkgdir, path, f))
|
2006-05-30 19:11:34 +02:00
|
|
|
|
|
|
|
os.chdir(origdir)
|
|
|
|
|
|
|
|
# Generate Python file that contains a dict specifying the current
|
|
|
|
# build_env flags.
|
2005-03-09 05:06:54 +01:00
|
|
|
def MakeDefinesPyFile(target, source, env):
|
2005-03-14 13:46:26 +01:00
|
|
|
f = file(str(target[0]), 'w')
|
2006-07-11 05:00:13 +02:00
|
|
|
print >>f, "m5_build_env = ", source[0]
|
2005-03-14 13:46:26 +01:00
|
|
|
f.close()
|
2005-03-09 05:06:54 +01:00
|
|
|
|
2005-08-30 19:18:54 +02:00
|
|
|
optionDict = dict([(opt, env[opt]) for opt in env.ExportOptions])
|
2006-06-10 05:01:31 +02:00
|
|
|
env.Command('m5/defines.py', Value(optionDict), MakeDefinesPyFile)
|
2005-08-30 19:18:54 +02:00
|
|
|
|
2006-07-11 05:00:13 +02:00
|
|
|
def MakeInfoPyFile(target, source, env):
|
|
|
|
f = file(str(target[0]), 'w')
|
|
|
|
for src in source:
|
|
|
|
data = ''.join(file(src.srcnode().abspath, 'r').xreadlines())
|
|
|
|
print >>f, "%s = %s" % (src, repr(data))
|
|
|
|
f.close()
|
|
|
|
|
|
|
|
env.Command('m5/info.py',
|
|
|
|
[ '#/AUTHORS', '#/LICENSE', '#/README', '#/RELEASE_NOTES' ],
|
|
|
|
MakeInfoPyFile)
|
|
|
|
|
2006-05-30 19:11:34 +02:00
|
|
|
# Now specify the packages & files for the zip archive.
|
|
|
|
addPkg('m5')
|
2006-06-10 05:01:31 +02:00
|
|
|
pyzip_files.append('m5/defines.py')
|
2006-07-11 05:00:13 +02:00
|
|
|
pyzip_files.append('m5/info.py')
|
2006-05-30 19:11:34 +02:00
|
|
|
pyzip_files.append(join(env['ROOT'], 'util/pbs/jobfile.py'))
|
2007-02-13 09:16:41 +01:00
|
|
|
pyzip_files.append(join(env['ROOT'], 'src/base/traceflags.py'))
|
2006-05-30 19:11:34 +02:00
|
|
|
|
2007-02-21 19:30:51 +01:00
|
|
|
swig_modules = []
|
|
|
|
def swig_it(module):
|
2007-04-12 17:35:19 +02:00
|
|
|
cc_file = 'swig/%s_wrap.cc' % module
|
|
|
|
py_file = 'm5/internal/%s.py' % module
|
|
|
|
source = File('swig/%s.i' % module)
|
|
|
|
source.rfile() # Hack to cause the symlink to the .i file to be created
|
|
|
|
env.Command([cc_file, py_file], source,
|
2006-12-22 00:58:38 +01:00
|
|
|
'$SWIG $SWIGFLAGS -outdir ${TARGETS[1].dir} '
|
|
|
|
'-o ${TARGETS[0]} $SOURCES')
|
2007-02-21 19:30:51 +01:00
|
|
|
swig_modules.append(module)
|
2007-03-11 08:00:54 +01:00
|
|
|
Source('swig/%s_wrap.cc' % module)
|
|
|
|
|
|
|
|
Source('swig/init.cc')
|
|
|
|
Source('swig/pyevent.cc')
|
|
|
|
Source('swig/pyobject.cc')
|
2006-12-22 00:58:38 +01:00
|
|
|
|
2007-03-03 07:24:00 +01:00
|
|
|
swig_it('core')
|
2006-12-22 00:58:38 +01:00
|
|
|
swig_it('debug')
|
2006-12-22 07:38:50 +01:00
|
|
|
swig_it('event')
|
2007-02-10 01:44:02 +01:00
|
|
|
swig_it('random')
|
2007-03-03 07:24:00 +01:00
|
|
|
swig_it('sim_object')
|
2007-02-18 07:52:32 +01:00
|
|
|
swig_it('stats')
|
2007-02-09 23:39:56 +01:00
|
|
|
swig_it('trace')
|
2006-06-10 05:01:31 +02:00
|
|
|
|
2007-02-21 19:30:51 +01:00
|
|
|
# Automatically generate m5/internals/__init__.py
|
|
|
|
def MakeInternalsInit(target, source, env):
|
|
|
|
f = file(str(target[0]), 'w')
|
|
|
|
for m in swig_modules:
|
|
|
|
print >>f, 'import %s' % m
|
|
|
|
f.close()
|
|
|
|
|
|
|
|
swig_py_files = [ 'm5/internal/%s.py' % m for m in swig_modules ]
|
|
|
|
env.Command('m5/internal/__init__.py', swig_py_files, MakeInternalsInit)
|
|
|
|
pyzip_dep_files.append('m5/internal/__init__.py')
|
|
|
|
|
|
|
|
def MakeSwigInit(target, source, env):
|
|
|
|
f = file(str(target[0]), 'w')
|
|
|
|
print >>f, 'extern "C" {'
|
|
|
|
for m in swig_modules:
|
|
|
|
print >>f, ' void init_%s();' % m
|
|
|
|
print >>f, '}'
|
|
|
|
print >>f, 'void init_swig() {'
|
|
|
|
for m in swig_modules:
|
|
|
|
print >>f, ' init_%s();' % m
|
|
|
|
print >>f, '}'
|
|
|
|
f.close()
|
|
|
|
|
|
|
|
swig_cc_files = [ 'swig/%s_wrap.cc' % m for m in swig_modules ]
|
|
|
|
env.Command('swig/init.cc', swig_cc_files, MakeSwigInit)
|
|
|
|
|
2006-05-30 19:11:34 +02:00
|
|
|
# Action function to build the zip archive. Uses the PyZipFile module
|
|
|
|
# included in the standard Python library.
|
|
|
|
def buildPyZip(target, source, env):
|
2007-03-11 08:00:54 +01:00
|
|
|
pzf = zipfile.PyZipFile(str(target[0]), 'w')
|
2006-05-30 19:11:34 +02:00
|
|
|
for s in source:
|
|
|
|
pzf.writepy(str(s))
|
|
|
|
|
|
|
|
# Add the zip file target to the environment.
|
|
|
|
env.Command('m5py.zip', pyzip_files, buildPyZip)
|
|
|
|
env.Depends('m5py.zip', pyzip_dep_files)
|