Merge ktlim@zamp:/z/ktlim2/clean/m5-o3
[gem5.git] / src / python / SConscript
1 # -*- mode:python -*-
2
3 # Copyright (c) 2004-2005 The Regents of The University of Michigan
4 # All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions are
8 # met: redistributions of source code must retain the above copyright
9 # notice, this list of conditions and the following disclaimer;
10 # redistributions in binary form must reproduce the above copyright
11 # notice, this list of conditions and the following disclaimer in the
12 # documentation and/or other materials provided with the distribution;
13 # neither the name of the copyright holders nor the names of its
14 # contributors may be used to endorse or promote products derived from
15 # this software without specific prior written permission.
16 #
17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 #
29 # Authors: Steve Reinhardt
30 # Nathan Binkert
31
32 import os, os.path, re, sys
33 from zipfile import PyZipFile
34
35 # handy function for path joins
36 def join(*args):
37 return os.path.normpath(os.path.join(*args))
38
39 Import('env')
40
41 # This SConscript is in charge of collecting .py files and generating a zip archive that is appended to the m5 binary.
42
43 # Copy .py source files here (relative to src/python in the build
44 # directory).
45 pyzip_root = 'zip'
46
47 # List of files & directories to include in the zip file. To include
48 # a package, list only the root directory of the package, not any
49 # internal .py files (else they will get the path stripped off when
50 # they are imported into the zip file).
51 pyzip_files = []
52
53 # List of additional files on which the zip archive depends, but which
54 # are not included in pyzip_files... i.e. individual .py files within
55 # a package.
56 pyzip_dep_files = []
57
58 # Add the specified package to the zip archive. Adds the directory to
59 # pyzip_files and all included .py files to pyzip_dep_files.
60 def addPkg(pkgdir):
61 pyzip_files.append(join(pyzip_root, pkgdir))
62 origdir = os.getcwd()
63 srcdir = join(Dir('.').srcnode().abspath, pkgdir)
64 os.chdir(srcdir)
65 for path, dirs, files in os.walk('.'):
66 for i,dir in enumerate(dirs):
67 if dir == 'SCCS':
68 del dirs[i]
69 break
70
71 for f in files:
72 if f.endswith('.py'):
73 source = join(pkgdir, path, f)
74 target = join(pyzip_root, source)
75 pyzip_dep_files.append(target)
76 env.CopyFile(target, source)
77
78 os.chdir(origdir)
79
80 # Generate Python file that contains a dict specifying the current
81 # build_env flags.
82 def MakeDefinesPyFile(target, source, env):
83 f = file(str(target[0]), 'w')
84 print >>f, "import __main__"
85 print >>f, "__main__.m5_build_env = ",
86 print >>f, source[0]
87 f.close()
88
89 optionDict = dict([(opt, env[opt]) for opt in env.ExportOptions])
90 env.Command('defines.py', Value(optionDict), MakeDefinesPyFile)
91
92 # Now specify the packages & files for the zip archive.
93 addPkg('m5')
94 pyzip_files.append('defines.py')
95 pyzip_files.append(join(env['ROOT'], 'util/pbs/jobfile.py'))
96
97 # Action function to build the zip archive. Uses the PyZipFile module
98 # included in the standard Python library.
99 def buildPyZip(target, source, env):
100 pzf = PyZipFile(str(target[0]), 'w')
101 for s in source:
102 pzf.writepy(str(s))
103
104 # Add the zip file target to the environment.
105 env.Command('m5py.zip', pyzip_files, buildPyZip)
106 env.Depends('m5py.zip', pyzip_dep_files)