o3-mips-regress: add hello word regression.
[gem5.git] / util / make_release.py
1 #!/usr/bin/env python
2 # Copyright (c) 2006-2008 The Regents of The University of Michigan
3 # All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions are
7 # met: redistributions of source code must retain the above copyright
8 # notice, this list of conditions and the following disclaimer;
9 # redistributions in binary form must reproduce the above copyright
10 # notice, this list of conditions and the following disclaimer in the
11 # documentation and/or other materials provided with the distribution;
12 # neither the name of the copyright holders nor the names of its
13 # contributors may be used to endorse or promote products derived from
14 # this software without specific prior written permission.
15 #
16 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 #
28 # Authors: Ali Saidi
29 # Steve Reinhardt
30 # Nathan Binkert
31
32 import os
33 import re
34 import shutil
35 import sys
36 import time
37
38 from glob import glob
39 from os import system
40 from os.path import basename, dirname, exists, isdir, isfile, join as joinpath
41
42 def mkdir(*args):
43 path = joinpath(*args)
44 os.mkdir(path)
45
46 def touch(*args, **kwargs):
47 when = kwargs.get('when', None)
48 path = joinpath(*args)
49 os.utime(path, when)
50
51 def rmtree(*args):
52 path = joinpath(*args)
53 for match in glob(path):
54 if isdir(match):
55 shutil.rmtree(match)
56 else:
57 os.unlink(match)
58
59 def remove(*args):
60 path = joinpath(*args)
61 for match in glob(path):
62 if not isdir(match):
63 os.unlink(match)
64
65 def movedir(srcdir, destdir, dir):
66 src = joinpath(srcdir, dir)
67 dest = joinpath(destdir, dir)
68
69 if not isdir(src):
70 raise AttributeError
71
72 os.makedirs(dirname(dest))
73 shutil.move(src, dest)
74
75 if not isdir('.hg'):
76 sys.exit('Not in the top level of an m5 tree!')
77
78 usage = '%s <destdir> <release name>' % sys.argv[0]
79
80 if len(sys.argv) != 3:
81 sys.exit(usage)
82
83 destdir = sys.argv[1]
84 releasename = sys.argv[2]
85 release_dest = joinpath(destdir, 'release')
86 #encumbered_dest = joinpath(destdir, 'encumbered')
87 release_dir = joinpath(release_dest, releasename)
88 #encumbered_dir = joinpath(encumbered_dest, releasename)
89
90 if exists(destdir):
91 if not isdir(destdir):
92 raise AttributeError, '%s exists, but is not a directory' % destdir
93 else:
94 mkdir(destdir)
95
96 if exists(release_dest):
97 if not isdir(release_dest):
98 raise AttributeError, \
99 '%s exists, but is not a directory' % release_dest
100 rmtree(release_dest)
101
102 #if exists(encumbered_dest):
103 # if not isdir(encumbered_dest):
104 # raise AttributeError, \
105 # '%s exists, but is not a directory' % encumbered_dest
106 # rmtree(encumbered_dest)
107
108 mkdir(release_dest)
109 #mkdir(encumbered_dest)
110 mkdir(release_dir)
111 #mkdir(encumbered_dir)
112
113 system('hg update')
114 system('rsync -av --exclude ".hg*" --exclude build . %s' % release_dir)
115 # move the time forward on some files by a couple of minutes so we can
116 # avoid building things unnecessarily
117 when = int(time.time()) + 120
118
119 # make sure scons doesn't try to run flex unnecessarily
120 #touch(release_dir, 'src/encumbered/eio/exolex.cc', when=(when, when))
121
122 # get rid of non-shipping code
123 #rmtree(release_dir, 'src/encumbered/dev')
124 rmtree(release_dir, 'src/cpu/ozone')
125 rmtree(release_dir, 'src/arch/x86')
126 #rmtree(release_dir, 'src/mem/cache/tags/split*.cc')
127 #rmtree(release_dir, 'src/mem/cache/tags/split*.hh')
128 #rmtree(release_dir, 'src/mem/cache/prefetch/ghb_*.cc')
129 #rmtree(release_dir, 'src/mem/cache/prefetch/ghb_*.hh')
130 #rmtree(release_dir, 'src/mem/cache/prefetch/stride_*.cc')
131 #rmtree(release_dir, 'src/mem/cache/prefetch/stride_*.hh')
132 rmtree(release_dir, 'configs/fullsys')
133 rmtree(release_dir, 'configs/test')
134 rmtree(release_dir, 'tests/long/*/ref')
135 rmtree(release_dir, 'tests/old')
136 rmtree(release_dir, 'tests/quick/00.hello/ref/x86')
137 rmtree(release_dir, 'tests/quick/02.insttest')
138 rmtree(release_dir, 'tests/test-progs/hello/bin/x86')
139 rmtree(release_dir, 'src/dev/x86')
140
141 remove(release_dir, 'src/cpu/nativetrace.hh')
142 remove(release_dir, 'src/cpu/nativetrace.cc')
143 remove(release_dir, 'build_opts/X86_SE')
144 remove(release_dir, 'build_opts/X86_FS')
145
146 # get rid of some of private scripts
147 remove(release_dir, 'util/chgcopyright')
148 remove(release_dir, 'util/make_release.py')
149
150 #state trace
151 remove(release_dir, 'util/statetrace/x86.format')
152 remove(release_dir, 'util/statetrace/arch/tracechild_amd64.cc')
153 remove(release_dir, 'util/statetrace/arch/tracechild_amd64.hh')
154 remove(release_dir, 'util/statetrace/arch/tracechild_i386.cc')
155 remove(release_dir, 'util/statetrace/arch/tracechild_i386.hh')
156
157 def remove_sources(regex, subdir):
158 script = joinpath(release_dir, subdir, 'SConscript')
159 if isinstance(regex, str):
160 regex = re.compile(regex)
161 inscript = file(script, 'r').readlines()
162 outscript = file(script, 'w')
163 for line in inscript:
164 if regex.match(line):
165 continue
166
167 outscript.write(line)
168 outscript.close()
169
170 def remove_lines(s_regex, e_regex, f):
171 f = joinpath(release_dir, f)
172 if isinstance(s_regex, str):
173 s_regex = re.compile(s_regex)
174 if isinstance(e_regex, str):
175 e_regex = re.compile(e_regex)
176 inscript = file(f, 'r').readlines()
177 outscript = file(f, 'w')
178 skipping = False
179 for line in inscript:
180 if (not skipping and s_regex.match(line)) or \
181 (e_regex and skipping and not e_regex.match(line)):
182 if e_regex:
183 skipping = True
184 continue
185 skipping = False
186 outscript.write(line)
187 outscript.close()
188
189 def replace_line(s_regex, f, rl):
190 f = joinpath(release_dir, f)
191 if isinstance(s_regex, str):
192 s_regex = re.compile(s_regex)
193 inscript = file(f, 'r').readlines()
194 outscript = file(f, 'w')
195 for line in inscript:
196 if s_regex.match(line):
197 outscript.write(rl)
198 continue
199 outscript.write(line)
200 outscript.close()
201
202
203 # fix up the SConscript to deal with files we've removed
204 #remove_sources(r'.*split.*\.cc', 'src/mem/cache/tags')
205 #remove_sources(r'.*(ghb|stride)_prefetcher\.cc', 'src/mem/cache/prefetch')
206 remove_sources(r'.*nativetrace.*', 'src/cpu')
207
208 remove_lines(r'.*X86.*', None, 'src/arch/isa_specific.hh')
209 #remove_lines(r'.*X86.*', None, 'src/base/traceflags.py')
210 remove_lines(r'.*X86.*', None, 'AUTHORS')
211 remove_lines(r'.*X86.*', None, 'src/base/loader/object_file.hh')
212 remove_lines(r'.*_X86_.*', '.*else.*', 'src/base/loader/elf_object.cc')
213 remove_lines(r'.*X86_ISA.*', r'^.el.*','src/sim/process.cc')
214 remove_lines(r".*'x86' and build.*", None, 'src/cpu/BaseCPU.py')
215 remove_lines(r".*walker.port.*", None, 'src/cpu/BaseCPU.py')
216 remove_lines(r'.*x86.*', r'.*mips.*','src/cpu/BaseCPU.py')
217 remove_lines(r'.*X86_ISA.*', r'^.*elif.*','src/cpu/o3/dyn_inst.hh')
218 remove_lines(r'.*X86_ISA.*', r'.*stay.*','src/cpu/simple/base.cc')
219 remove_lines(r'.*x86.*', r'^if.*','src/cpu/SConscript')
220
221 remove_lines(r'.*makeX86System.*', r'.*makeDualRoot.*','configs/common/FSConfig.py')
222 remove_lines(r'.*X86.*', None, 'configs/example/fs.py')
223 remove_lines(r'.*x86.*', None, 'configs/example/fs.py')
224 remove_lines(r'.*x86.*', r'.*makeDualRoot.*', 'configs/common/FSConfig.py')
225
226 replace_line(r'.*X86_SE.*', 'util/regress', " 'SPARC_SE,SPARC_FS',")
227 benches = [ 'bzip2', 'eon', 'gzip', 'mcf', 'parser', 'perlbmk',
228 'twolf', 'vortex' ]
229 for bench in benches:
230 rmtree(release_dir, 'tests', 'test-progs', bench)
231
232 #movedir(release_dir, encumbered_dir, 'src/encumbered')
233 rmtree(release_dir, 'tests/test-progs/anagram')
234 rmtree(release_dir, 'tests/quick/20.eio-short')
235
236 f = open('src/cpu/SConsopts', 'w+')
237 f.writelines(("Import('*')\n", "all_cpu_list.append('DummyCPUMakeSconsHappy')\n"))
238 f.close()
239
240
241 def taritup(directory, destdir, filename):
242 basedir = dirname(directory)
243 tarball = joinpath(destdir, filename)
244 tardir = basename(directory)
245
246 system('cd %s; tar cfj %s %s' % (basedir, tarball, tardir))
247
248 taritup(release_dir, destdir, '%s.tar.bz2' % releasename)
249 #taritup(encumbered_dir, destdir, '%s-encumbered.tar.bz2' % releasename)
250
251 print "release created in %s" % destdir
252 print "don't forget to tag the repository!"