ARM: Define the setend instruction.
[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/mem/cache/tags/split*.cc')
126 #rmtree(release_dir, 'src/mem/cache/tags/split*.hh')
127 #rmtree(release_dir, 'src/mem/cache/prefetch/ghb_*.cc')
128 #rmtree(release_dir, 'src/mem/cache/prefetch/ghb_*.hh')
129 #rmtree(release_dir, 'src/mem/cache/prefetch/stride_*.cc')
130 #rmtree(release_dir, 'src/mem/cache/prefetch/stride_*.hh')
131 rmtree(release_dir, 'configs/fullsys')
132 rmtree(release_dir, 'configs/test')
133 rmtree(release_dir, 'tests/long/*/ref')
134 rmtree(release_dir, 'tests/old')
135 rmtree(release_dir, 'tests/quick/00.hello/ref/x86')
136 rmtree(release_dir, 'tests/quick/02.insttest')
137 rmtree(release_dir, 'tests/test-progs/hello/bin/x86')
138
139 remove(release_dir, 'src/cpu/nativetrace.hh')
140 remove(release_dir, 'src/cpu/nativetrace.cc')
141
142 # get rid of some of private scripts
143 remove(release_dir, 'util/chgcopyright')
144 remove(release_dir, 'util/make_release.py')
145
146 def remove_sources(regex, subdir):
147 script = joinpath(release_dir, subdir, 'SConscript')
148 if isinstance(regex, str):
149 regex = re.compile(regex)
150 inscript = file(script, 'r').readlines()
151 outscript = file(script, 'w')
152 for line in inscript:
153 if regex.match(line):
154 continue
155
156 outscript.write(line)
157 outscript.close()
158
159 def remove_lines(s_regex, e_regex, f):
160 f = joinpath(release_dir, f)
161 if isinstance(s_regex, str):
162 s_regex = re.compile(s_regex)
163 if isinstance(e_regex, str):
164 e_regex = re.compile(e_regex)
165 inscript = file(f, 'r').readlines()
166 outscript = file(f, 'w')
167 skipping = False
168 for line in inscript:
169 if (not skipping and s_regex.match(line)) or \
170 (e_regex and skipping and not e_regex.match(line)):
171 if e_regex:
172 skipping = True
173 continue
174 skipping = False
175 outscript.write(line)
176 outscript.close()
177
178 def replace_line(s_regex, f, rl):
179 f = joinpath(release_dir, f)
180 if isinstance(s_regex, str):
181 s_regex = re.compile(s_regex)
182 inscript = file(f, 'r').readlines()
183 outscript = file(f, 'w')
184 for line in inscript:
185 if s_regex.match(line):
186 outscript.write(rl)
187 continue
188 outscript.write(line)
189 outscript.close()
190
191
192 # fix up the SConscript to deal with files we've removed
193 #remove_sources(r'.*split.*\.cc', 'src/mem/cache/tags')
194 #remove_sources(r'.*(ghb|stride)_prefetcher\.cc', 'src/mem/cache/prefetch')
195 remove_sources(r'.*nativetrace.*', 'src/cpu')
196
197 benches = [ 'bzip2', 'eon', 'gzip', 'mcf', 'parser', 'perlbmk',
198 'twolf', 'vortex' ]
199 for bench in benches:
200 rmtree(release_dir, 'tests', 'test-progs', bench)
201
202 #movedir(release_dir, encumbered_dir, 'src/encumbered')
203 rmtree(release_dir, 'tests/test-progs/anagram')
204 rmtree(release_dir, 'tests/quick/20.eio-short')
205
206 f = open('src/cpu/SConsopts', 'w+')
207 f.writelines(("Import('*')\n", "all_cpu_list.append('DummyCPUMakeSconsHappy')\n"))
208 f.close()
209
210
211 def taritup(directory, destdir, filename):
212 basedir = dirname(directory)
213 tarball = joinpath(destdir, filename)
214 tardir = basename(directory)
215
216 system('cd %s; tar cfj %s %s' % (basedir, tarball, tardir))
217
218 taritup(release_dir, destdir, '%s.tar.bz2' % releasename)
219 #taritup(encumbered_dir, destdir, '%s-encumbered.tar.bz2' % releasename)
220
221 print "release created in %s" % destdir
222 print "don't forget to tag the repository!"