Simple CPU: Added code that will split requests that cross block boundaries into...
[gem5.git] / util / regress
index 067f9f0922fb4efb5e46f69abc6a7ebd6fbb298c..8ff07c4533dcdc77dca195d3afa5c72710d9b2a5 100755 (executable)
@@ -1,5 +1,5 @@
 #! /usr/bin/env python
-# Copyright (c) 2005 The Regents of The University of Michigan
+# Copyright (c) 2005-2007 The Regents of The University of Michigan
 # All rights reserved.
 #
 # Redistribution and use in source and binary forms, with or without
@@ -31,14 +31,7 @@ import sys
 import os
 import optparse
 import datetime
-
-#
-# Regression invocation:
-#
-# regress \
-#      --workdir poolfs \
-#      --scons-opts 'BATCH=yes USE_MYSQL=no -j 30 -Q' \
-#      --recurse
+from subprocess import call
 
 progname = os.path.basename(sys.argv[0])
 
@@ -46,25 +39,18 @@ optparser = optparse.OptionParser()
 optparser.add_option('-v', '--verbose', dest='verbose', action='store_true',
                      default=False,
                      help='echo commands before executing')
-optparser.add_option('--scratch', dest='scratch', action='store_true',
-                     default=False,
-                     help='rebuld from scratch')
 optparser.add_option('--builds', dest='builds',
-                     default='ALPHA_SE,ALPHA_FS,ALPHA_FS_TL',
-                     help='comma-separated list of builds to test')
+                     default='ALPHA_SE,ALPHA_FS,MIPS_SE,SPARC_SE,SPARC_FS',
+                     help='comma-separated list of build targets to test  '
+                     " (default: '%default')" )
 optparser.add_option('--variants', dest='variants',
-                     default='opt',
-                     help='comma-separated list of build variants to test')
-optparser.add_option('--workdir', dest='workdir',
-                     help='directory for checked-out source trees')
+                     default='fast',
+                     help='comma-separated list of build variants to test '
+                     " (default: '%default')" )
 optparser.add_option('--scons-opts', dest='scons_opts', default='',
-                     help='scons options')
-optparser.add_option('--no-pull', dest='pull', action='store_false',
-                     default=True,
-                     help="don't pull changes from repository")
-optparser.add_option('--recurse', dest='recurse', action='store_true',
-                     default=False,
-                     help='call recursively to get summary up front')
+                     help='scons options', metavar='OPTS')
+optparser.add_option('-j', '--jobs', type='int', default=1,
+                     help='number of parallel jobs to use')
 
 (options, tests) = optparser.parse_args()
 
@@ -73,19 +59,22 @@ optparser.add_option('--recurse', dest='recurse', action='store_true',
 builds = options.builds.split(',')
 variants = options.variants.split(',')
 
-# Repositories to clone/update
-repos = ['m5', 'm5-test', 'ext']
-
 # Call os.system() and raise exception if return status is non-zero
 def system(cmd):
-    if options.verbose:
-        print cmd
-    status = os.system(cmd)
-    if status != 0:
-        upper = (status & 0xff00) >> 8
-        lower = (status & 0xff)
-        raise OSError, "shell command '%s' failed, status %d:%d" \
-              % (cmd, upper, lower)
+    try:
+        retcode = call(cmd, shell=True)
+        if retcode < 0:
+            print >>sys.stderr, "Child was terminated by signal", -retcode
+            print >>sys.stderr, "When attemping to execute: %s" % cmd
+            sys.exit(1)
+        elif retcode > 0:
+            print >>sys.stderr, "Child returned", retcode
+            print >>sys.stderr, "When attemping to execute: %s" % cmd
+            sys.exit(1)
+    except OSError, e:
+        print >>sys.stderr, "Execution failed:", e
+        print >>sys.stderr, "When attemping to execute: %s" % cmd
+        sys.exit(1)
 
 # Quote string s so it can be passed as a shell arg
 def shellquote(s):
@@ -93,63 +82,29 @@ def shellquote(s):
         s = "'%s'" % s
     return s
 
-# The '--recurse' option invokes scons once to perform any necessary
-# rebuilds/test runs with the (possibly verbose) output placed in a
-# log file, then (if the buld was successful) returns scons to print a
-# summary of the results.
-if options.recurse:
-    sys.argv.remove('--recurse')  # avoid infinite recursion...
-    timestr = datetime.datetime.now().isoformat('-')[:19]
-    logfile = '%s-%s' % (progname, timestr)
-    # quote args for shell
-    qargs = [shellquote(a) for a in sys.argv]
-    # always run the sub-job in verbose mode
-    qargs.append('-v')
-    cmd = '%s > %s 2>&1' % (' '.join(qargs), logfile)
-    try:
-        system(cmd)
-    except OSError, exc:
-        print "Error: recursive invocation failed, aborting."
-        print exc
-        print "======================="
-        os.system('cat %s' % logfile)
-        sys.exit(1)
-    # recursive call succeeded... re-run to generate summary
-    # don't *re*-build from scratch now
-    options.scratch = False
-    # no need to re-pull since the recursive call shoudl have done that
-    options.pull = False
-    print "Recursive invocation successful, see %s for output." % logfile
-
-try:
-    if options.workdir:
-        if options.verbose:
-            print 'cd', options.workdir
-        os.chdir(options.workdir)
-
-    if options.scratch:
-        for dir in repos:
-            system('rm -rf %s' % dir)
-            system('bk clone /bk/%s' % dir)
-    elif options.pull:
-        for dir in repos:
-            system('cd %s; bk pull' % dir)
-
-    if not tests:
-        print "No tests specified."
-        sys.exit(1)
-
-    if options.verbose:
-        print 'cd m5/build'
-    os.chdir('m5/build')
-
-    targets = ['%s/test/%s/%s' % (build, variant, test)
-               for build in builds for variant in variants for test in tests]
-
-    system('scons %s %s' % (options.scons_opts, ' '.join(targets)))
-
-    sys.exit(0)
-
-except OSError, exc:
-    print "%s: " % progname, exc
-    sys.exit(1)
+if not tests:
+    print "No tests specified, just building binaries."
+    targets = ['build/%s/m5.%s' % (build, variant)
+               for build in builds
+               for variant in variants]
+elif 'all' in tests:
+    targets = ['build/%s/tests/%s' % (build, variant)
+               for build in builds
+               for variant in variants]
+else:
+    # Ugly! Since we don't have any quick SPARC_FS tests remove the SPARC_FS target
+    # If we ever get a quick SPARC_FS test, this code should be removed
+    if 'quick' in tests and 'SPARC_FS' in builds:
+        builds.remove('SPARC_FS')
+    targets = ['build/%s/tests/%s/%s' % (build, variant, test)
+               for build in builds
+               for variant in variants
+               for test in tests]
+
+scons_opts = options.scons_opts
+if options.jobs != 1:
+    scons_opts += ' -j %d' % options.jobs
+
+system('scons IGNORE_STYLE=True %s %s' % (scons_opts, ' '.join(targets)))
+
+sys.exit(0)