remove duplicate profile event code that is already in
[gem5.git] / util / regress
1 #! /usr/bin/env python
2 # Copyright (c) 2005 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: Steve Reinhardt
29
30 import sys
31 import os
32 import optparse
33 import datetime
34
35 #
36 # Regression invocation:
37 #
38 # regress \
39 # --workdir poolfs \
40 # --scons-opts 'BATCH=yes USE_MYSQL=no -j 30 -Q' \
41 # --recurse
42
43 progname = os.path.basename(sys.argv[0])
44
45 optparser = optparse.OptionParser()
46 optparser.add_option('-v', '--verbose', dest='verbose', action='store_true',
47 default=False,
48 help='echo commands before executing')
49 optparser.add_option('--scratch', dest='scratch', action='store_true',
50 default=False,
51 help='rebuld from scratch')
52 optparser.add_option('--builds', dest='builds',
53 default='ALPHA_SE,ALPHA_FS,ALPHA_FS_TL',
54 help='comma-separated list of builds to test')
55 optparser.add_option('--variants', dest='variants',
56 default='opt',
57 help='comma-separated list of build variants to test')
58 optparser.add_option('--workdir', dest='workdir',
59 help='directory for checked-out source trees')
60 optparser.add_option('--scons-opts', dest='scons_opts', default='',
61 help='scons options')
62 optparser.add_option('--no-pull', dest='pull', action='store_false',
63 default=True,
64 help="don't pull changes from repository")
65 optparser.add_option('--recurse', dest='recurse', action='store_true',
66 default=False,
67 help='call recursively to get summary up front')
68
69 (options, tests) = optparser.parse_args()
70
71
72 # split list options on ',' to get Python lists
73 builds = options.builds.split(',')
74 variants = options.variants.split(',')
75
76 # Repositories to clone/update
77 repos = ['m5', 'm5-test', 'ext']
78
79 # Call os.system() and raise exception if return status is non-zero
80 def system(cmd):
81 if options.verbose:
82 print cmd
83 status = os.system(cmd)
84 if status != 0:
85 upper = (status & 0xff00) >> 8
86 lower = (status & 0xff)
87 raise OSError, "shell command '%s' failed, status %d:%d" \
88 % (cmd, upper, lower)
89
90 # Quote string s so it can be passed as a shell arg
91 def shellquote(s):
92 if ' ' in s:
93 s = "'%s'" % s
94 return s
95
96 # The '--recurse' option invokes scons once to perform any necessary
97 # rebuilds/test runs with the (possibly verbose) output placed in a
98 # log file, then (if the buld was successful) returns scons to print a
99 # summary of the results.
100 if options.recurse:
101 sys.argv.remove('--recurse') # avoid infinite recursion...
102 timestr = datetime.datetime.now().isoformat('-')[:19]
103 logfile = '%s-%s' % (progname, timestr)
104 # quote args for shell
105 qargs = [shellquote(a) for a in sys.argv]
106 # always run the sub-job in verbose mode
107 qargs.append('-v')
108 cmd = '%s > %s 2>&1' % (' '.join(qargs), logfile)
109 try:
110 system(cmd)
111 except OSError, exc:
112 print "Error: recursive invocation failed, aborting."
113 print exc
114 print "======================="
115 os.system('cat %s' % logfile)
116 sys.exit(1)
117 # recursive call succeeded... re-run to generate summary
118 # don't *re*-build from scratch now
119 options.scratch = False
120 # no need to re-pull since the recursive call shoudl have done that
121 options.pull = False
122 print "Recursive invocation successful, see %s for output." % logfile
123
124 try:
125 if options.workdir:
126 if options.verbose:
127 print 'cd', options.workdir
128 os.chdir(options.workdir)
129
130 if options.scratch:
131 for dir in repos:
132 system('rm -rf %s' % dir)
133 system('bk clone /bk/%s' % dir)
134 elif options.pull:
135 for dir in repos:
136 system('cd %s; bk pull' % dir)
137
138 if not tests:
139 print "No tests specified."
140 sys.exit(1)
141
142 if options.verbose:
143 print 'cd m5/build'
144 os.chdir('m5/build')
145
146 targets = ['%s/test/%s/%s' % (build, variant, test)
147 for build in builds for variant in variants for test in tests]
148
149 system('scons %s %s' % (options.scons_opts, ' '.join(targets)))
150
151 sys.exit(0)
152
153 except OSError, exc:
154 print "%s: " % progname, exc
155 sys.exit(1)