tests: Get rid of the now unused diff-out script.
[gem5.git] / util / regress
1 #! /usr/bin/env python2.7
2 # Copyright (c) 2005-2007 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 import sys
29 import os
30 import optparse
31 import datetime
32 from subprocess import call
33
34 progname = os.path.basename(sys.argv[0])
35
36 optparser = optparse.OptionParser()
37 add_option = optparser.add_option
38 add_option('-v', '--verbose', action='store_true', default=False,
39 help='echo commands before executing')
40 add_option('--builds',
41 default='ARM,' \
42 'MIPS,' \
43 'NULL,' \
44 'NULL_MOESI_hammer,' \
45 'NULL_MESI_Two_Level,' \
46 'NULL_MOESI_CMP_directory,' \
47 'NULL_MOESI_CMP_token,' \
48 'POWER,' \
49 'SPARC,' \
50 'X86,X86_MESI_Two_Level,' \
51 'RISCV,' \
52 'GCN3_X86',
53 help="comma-separated build targets to test (default: '%default')")
54 add_option('--modes',
55 default='se,fs',
56 help="comma-separated modes to test (default: '%default')")
57 add_option('--test-variants', default='opt',
58 help="comma-separated build variants to test (default: '%default')"\
59 ", set to '' for none")
60 add_option('--compile-variants', default='debug,fast',
61 help="comma-separated build variants to compile only (not test) " \
62 "(default: '%default'), set to '' for none", metavar='VARIANTS')
63 add_option('--scons-opts', default='', metavar='OPTS',
64 help='scons options')
65 add_option('-j', '--jobs', type='int', default=1, metavar='N',
66 help='number of parallel jobs to use (0 to use all cores)')
67 add_option('-k', '--keep-going', action='store_true',
68 help='keep going after errors')
69 add_option('--update-ref', action='store_true',
70 help='update reference outputs')
71 add_option('-D', '--build-dir', default='', metavar='DIR',
72 help='build directory location')
73 add_option('-n', "--no-exec", default=False, action='store_true',
74 help="don't actually invoke scons, just echo SCons command line")
75
76 (options, tests) = optparser.parse_args()
77
78
79 # split a comma-separated list, but return an empty list if given the
80 # empty string
81 def split_if_nonempty(s):
82 if not s:
83 return []
84 return s.split(',')
85
86 # split list options on ',' to get Python lists
87 builds = split_if_nonempty(options.builds)
88 modes = split_if_nonempty(options.modes)
89 test_variants = split_if_nonempty(options.test_variants)
90 compile_variants = split_if_nonempty(options.compile_variants)
91
92 options.build_dir = os.path.join(options.build_dir, 'build')
93
94 # Call os.system() and raise exception if return status is non-zero
95 def system(cmd):
96 try:
97 retcode = call(cmd, shell=True)
98 if retcode < 0:
99 print >>sys.stderr, "Child was terminated by signal", -retcode
100 print >>sys.stderr, "When attemping to execute: %s" % cmd
101 sys.exit(1)
102 elif retcode > 0:
103 print >>sys.stderr, "Child returned", retcode
104 print >>sys.stderr, "When attemping to execute: %s" % cmd
105 sys.exit(1)
106 except OSError, e:
107 print >>sys.stderr, "Execution failed:", e
108 print >>sys.stderr, "When attemping to execute: %s" % cmd
109 sys.exit(1)
110
111 targets = []
112
113 # start with compile-only targets, if any
114 if compile_variants:
115 targets += ['%s/%s/gem5.%s' % (options.build_dir, build, variant)
116 for variant in compile_variants
117 for build in builds]
118
119 # By default run the 'quick' tests, all expands to quick and long
120 if not tests:
121 tests = ['quick']
122 elif 'all' in tests:
123 tests = ['quick', 'long']
124
125 # set up test targets for scons, since we don't have any quick SPARC
126 # full-system tests exclude it
127 targets += ['%s/%s/tests/%s/%s/%s' % (options.build_dir, build, variant, test,
128 mode)
129 for build in builds
130 for variant in test_variants
131 for test in tests
132 for mode in modes
133 if not (build == 'SPARC' and test == 'quick' and mode == 'fs')]
134
135 def cpu_count():
136 if 'bsd' in sys.platform or sys.platform == 'darwin':
137 try:
138 return int(os.popen('sysctl -n hw.ncpu').read())
139 except ValueError:
140 pass
141 else:
142 try:
143 return os.sysconf('SC_NPROCESSORS_ONLN')
144 except (ValueError, OSError, AttributeError):
145 pass
146
147 raise NotImplementedError('cannot determine number of cpus')
148
149 scons_opts = options.scons_opts
150 if options.jobs != 1:
151 if options.jobs == 0:
152 options.jobs = cpu_count()
153 scons_opts += ' -j %d' % options.jobs
154 if options.keep_going:
155 scons_opts += ' -k'
156 if options.update_ref:
157 scons_opts += ' --update-ref'
158
159 # We generally compile gem5.fast only to make sure it compiles OK;
160 # it's not very useful to run as a regression test since assertions
161 # are disabled. Thus there's not much point spending time on
162 # link-time optimization.
163 scons_opts += ' --no-lto'
164
165 cmd = 'scons --ignore-style %s %s' % (scons_opts, ' '.join(targets))
166 if options.no_exec:
167 print cmd
168 else:
169 system(cmd)
170 sys.exit(0)