#! /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
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])
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()
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):
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)