113540Sandrea.mondelli@ucf.edu#!/usr/bin/env python2.7 211482Sandreas.sandberg@arm.com# 311482Sandreas.sandberg@arm.com# Copyright (c) 2016 ARM Limited 411482Sandreas.sandberg@arm.com# All rights reserved 511482Sandreas.sandberg@arm.com# 611482Sandreas.sandberg@arm.com# The license below extends only to copyright in the software and shall 711482Sandreas.sandberg@arm.com# not be construed as granting a license to any other intellectual 811482Sandreas.sandberg@arm.com# property including but not limited to intellectual property relating 911482Sandreas.sandberg@arm.com# to a hardware implementation of the functionality of the software 1011482Sandreas.sandberg@arm.com# licensed hereunder. You may use the software subject to the license 1111482Sandreas.sandberg@arm.com# terms below provided that you ensure that this notice is replicated 1211482Sandreas.sandberg@arm.com# unmodified and in its entirety in all distributions of the software, 1311482Sandreas.sandberg@arm.com# modified or unmodified, in source code or in binary form. 1411482Sandreas.sandberg@arm.com# 1511482Sandreas.sandberg@arm.com# Redistribution and use in source and binary forms, with or without 1611482Sandreas.sandberg@arm.com# modification, are permitted provided that the following conditions are 1711482Sandreas.sandberg@arm.com# met: redistributions of source code must retain the above copyright 1811482Sandreas.sandberg@arm.com# notice, this list of conditions and the following disclaimer; 1911482Sandreas.sandberg@arm.com# redistributions in binary form must reproduce the above copyright 2011482Sandreas.sandberg@arm.com# notice, this list of conditions and the following disclaimer in the 2111482Sandreas.sandberg@arm.com# documentation and/or other materials provided with the distribution; 2211482Sandreas.sandberg@arm.com# neither the name of the copyright holders nor the names of its 2311482Sandreas.sandberg@arm.com# contributors may be used to endorse or promote products derived from 2411482Sandreas.sandberg@arm.com# this software without specific prior written permission. 2511482Sandreas.sandberg@arm.com# 2611482Sandreas.sandberg@arm.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2711482Sandreas.sandberg@arm.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2811482Sandreas.sandberg@arm.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2911482Sandreas.sandberg@arm.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 3011482Sandreas.sandberg@arm.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 3111482Sandreas.sandberg@arm.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 3211482Sandreas.sandberg@arm.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 3311482Sandreas.sandberg@arm.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 3411482Sandreas.sandberg@arm.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 3511482Sandreas.sandberg@arm.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 3611482Sandreas.sandberg@arm.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3711482Sandreas.sandberg@arm.com# 3811482Sandreas.sandberg@arm.com# Authors: Andreas Sandberg 3911482Sandreas.sandberg@arm.com 4012575Sgiacomo.travaglini@arm.comfrom __future__ import print_function 4112575Sgiacomo.travaglini@arm.com 4211482Sandreas.sandberg@arm.comimport argparse 4311482Sandreas.sandberg@arm.comimport sys 4411482Sandreas.sandberg@arm.comimport os 4511482Sandreas.sandberg@arm.comimport pickle 4611482Sandreas.sandberg@arm.com 4711482Sandreas.sandberg@arm.comfrom testing.tests import * 4811482Sandreas.sandberg@arm.comimport testing.results 4911482Sandreas.sandberg@arm.com 5011482Sandreas.sandberg@arm.comclass ParagraphHelpFormatter(argparse.HelpFormatter): 5111482Sandreas.sandberg@arm.com def _fill_text(self, text, width, indent): 5211482Sandreas.sandberg@arm.com return "\n\n".join([ 5311482Sandreas.sandberg@arm.com super(ParagraphHelpFormatter, self)._fill_text(p, width, indent) \ 5411482Sandreas.sandberg@arm.com for p in text.split("\n\n") ]) 5511482Sandreas.sandberg@arm.com 5611482Sandreas.sandberg@arm.comformatters = { 5711482Sandreas.sandberg@arm.com "junit" : testing.results.JUnit, 5811482Sandreas.sandberg@arm.com "text" : testing.results.Text, 5911482Sandreas.sandberg@arm.com "summary" : testing.results.TextSummary, 6011482Sandreas.sandberg@arm.com "pickle" : testing.results.Pickle, 6111482Sandreas.sandberg@arm.com} 6211482Sandreas.sandberg@arm.com 6311482Sandreas.sandberg@arm.com 6411482Sandreas.sandberg@arm.comdef _add_format_args(parser): 6511482Sandreas.sandberg@arm.com parser.add_argument("--format", choices=formatters, default="text", 6611482Sandreas.sandberg@arm.com help="Output format") 6711482Sandreas.sandberg@arm.com 6811482Sandreas.sandberg@arm.com parser.add_argument("--no-junit-xlate-names", action="store_true", 6911482Sandreas.sandberg@arm.com help="Don't translate test names to " \ 7011482Sandreas.sandberg@arm.com "package-like names") 7111482Sandreas.sandberg@arm.com 7211482Sandreas.sandberg@arm.com parser.add_argument("--output", "-o", 7311482Sandreas.sandberg@arm.com type=argparse.FileType('w'), default=sys.stdout, 7411482Sandreas.sandberg@arm.com help="Test result output file") 7511482Sandreas.sandberg@arm.com 7611482Sandreas.sandberg@arm.com 7711482Sandreas.sandberg@arm.comdef _create_formatter(args): 7811482Sandreas.sandberg@arm.com formatter = formatters[args.format] 7911482Sandreas.sandberg@arm.com kwargs = { 8011482Sandreas.sandberg@arm.com "fout" : args.output, 8111482Sandreas.sandberg@arm.com "verbose" : args.verbose 8211482Sandreas.sandberg@arm.com } 8311482Sandreas.sandberg@arm.com 8411482Sandreas.sandberg@arm.com if issubclass(formatter, testing.results.JUnit): 8511482Sandreas.sandberg@arm.com kwargs.update({ 8611482Sandreas.sandberg@arm.com "translate_names" : not args.no_junit_xlate_names, 8711482Sandreas.sandberg@arm.com }) 8811482Sandreas.sandberg@arm.com 8911482Sandreas.sandberg@arm.com return formatter(**kwargs) 9011482Sandreas.sandberg@arm.com 9111482Sandreas.sandberg@arm.com 9211482Sandreas.sandberg@arm.comdef _list_tests_args(subparsers): 9311482Sandreas.sandberg@arm.com parser = subparsers.add_parser( 9411482Sandreas.sandberg@arm.com "list", 9511482Sandreas.sandberg@arm.com formatter_class=ParagraphHelpFormatter, 9611482Sandreas.sandberg@arm.com help="List available tests", 9711482Sandreas.sandberg@arm.com description="List available tests", 9811482Sandreas.sandberg@arm.com epilog=""" 9911482Sandreas.sandberg@arm.com Generate a list of available tests using a list filter. 10011482Sandreas.sandberg@arm.com 10111482Sandreas.sandberg@arm.com The filter is a string consisting of the target ISA optionally 10211482Sandreas.sandberg@arm.com followed by the test category and mode separated by 10311482Sandreas.sandberg@arm.com slashes. The test names emitted by this command can be fed 10411482Sandreas.sandberg@arm.com into the run command. 10511482Sandreas.sandberg@arm.com 10611482Sandreas.sandberg@arm.com For example, to list all quick arm tests, run the following: 10711482Sandreas.sandberg@arm.com tests.py list arm/quick 10811482Sandreas.sandberg@arm.com 10911482Sandreas.sandberg@arm.com Non-mandatory parts of the filter string (anything other than 11011482Sandreas.sandberg@arm.com the ISA) can be left out or replaced with the wildcard 11111482Sandreas.sandberg@arm.com character. For example, all full-system tests can be listed 11211482Sandreas.sandberg@arm.com with this command: tests.py list arm/*/fs""") 11311482Sandreas.sandberg@arm.com 11411482Sandreas.sandberg@arm.com parser.add_argument("--ruby-protocol", type=str, default=None, 11511482Sandreas.sandberg@arm.com help="Ruby protocol") 11611482Sandreas.sandberg@arm.com 11711482Sandreas.sandberg@arm.com parser.add_argument("--gpu-isa", type=str, default=None, 11811482Sandreas.sandberg@arm.com help="GPU ISA") 11911482Sandreas.sandberg@arm.com 12011482Sandreas.sandberg@arm.com parser.add_argument("list_filter", metavar="ISA[/category/mode]", 12111482Sandreas.sandberg@arm.com action="append", type=str, 12211482Sandreas.sandberg@arm.com help="List available test cases") 12311482Sandreas.sandberg@arm.com 12411482Sandreas.sandberg@arm.comdef _list_tests(args): 12511482Sandreas.sandberg@arm.com for isa, categories, modes in \ 12611482Sandreas.sandberg@arm.com ( parse_test_filter(f) for f in args.list_filter ): 12711482Sandreas.sandberg@arm.com 12811482Sandreas.sandberg@arm.com for test in get_tests(isa, categories=categories, modes=modes, 12911482Sandreas.sandberg@arm.com ruby_protocol=args.ruby_protocol, 13011482Sandreas.sandberg@arm.com gpu_isa=args.gpu_isa): 13112575Sgiacomo.travaglini@arm.com print("/".join(test)) 13211482Sandreas.sandberg@arm.com sys.exit(0) 13311482Sandreas.sandberg@arm.com 13411482Sandreas.sandberg@arm.comdef _run_tests_args(subparsers): 13511482Sandreas.sandberg@arm.com parser = subparsers.add_parser( 13611482Sandreas.sandberg@arm.com "run", 13711482Sandreas.sandberg@arm.com formatter_class=ParagraphHelpFormatter, 13811482Sandreas.sandberg@arm.com help='Run one or more tests', 13911482Sandreas.sandberg@arm.com description="Run one or more tests.", 14011482Sandreas.sandberg@arm.com epilog=""" 14111482Sandreas.sandberg@arm.com Run one or more tests described by a gem5 test tuple. 14211482Sandreas.sandberg@arm.com 14311482Sandreas.sandberg@arm.com The test tuple consists of a test category (quick or long), a 14411482Sandreas.sandberg@arm.com test mode (fs or se), a workload name, an isa, an operating 14511482Sandreas.sandberg@arm.com system, and a config name separate by slashes. For example: 14611482Sandreas.sandberg@arm.com quick/se/00.hello/arm/linux/simple-timing 14711482Sandreas.sandberg@arm.com 14811482Sandreas.sandberg@arm.com Available tests can be listed using the 'list' sub-command 14911482Sandreas.sandberg@arm.com (e.g., "tests.py list arm/quick" or one of the scons test list 15011482Sandreas.sandberg@arm.com targets (e.g., "scons build/ARM/tests/opt/quick.list"). 15111482Sandreas.sandberg@arm.com 15211482Sandreas.sandberg@arm.com The test results can be stored in multiple different output 15311482Sandreas.sandberg@arm.com formats. See the help for the show command for more details 15411482Sandreas.sandberg@arm.com about output formatting.""") 15511482Sandreas.sandberg@arm.com 15611482Sandreas.sandberg@arm.com parser.add_argument("gem5", type=str, 15711482Sandreas.sandberg@arm.com help="gem5 binary") 15811482Sandreas.sandberg@arm.com 15911482Sandreas.sandberg@arm.com parser.add_argument("test", type=str, nargs="*", 16011482Sandreas.sandberg@arm.com help="List of tests to execute") 16111482Sandreas.sandberg@arm.com 16211482Sandreas.sandberg@arm.com parser.add_argument("--directory", "-d", 16311482Sandreas.sandberg@arm.com type=str, default="m5tests", 16411482Sandreas.sandberg@arm.com help="Test work directory") 16511482Sandreas.sandberg@arm.com 16611482Sandreas.sandberg@arm.com parser.add_argument("--timeout", "-t", 16711482Sandreas.sandberg@arm.com type=int, default="0", metavar="MINUTES", 16811482Sandreas.sandberg@arm.com help="Timeout, 0 to disable") 16911482Sandreas.sandberg@arm.com 17011482Sandreas.sandberg@arm.com parser.add_argument("--skip-diff-out", action="store_true", 17111482Sandreas.sandberg@arm.com help="Skip output diffing stage") 17211482Sandreas.sandberg@arm.com 17311482Sandreas.sandberg@arm.com parser.add_argument("--skip-diff-stat", action="store_true", 17411482Sandreas.sandberg@arm.com help="Skip stat diffing stage") 17511482Sandreas.sandberg@arm.com 17611482Sandreas.sandberg@arm.com _add_format_args(parser) 17711482Sandreas.sandberg@arm.com 17811482Sandreas.sandberg@arm.comdef _run_tests(args): 17911836SCurtis.Dunham@arm.com if not os.path.isfile(args.gem5) or not os.access(args.gem5, os.X_OK): 18012575Sgiacomo.travaglini@arm.com print("gem5 binary '%s' not an executable file" % args.gem5, 18112575Sgiacomo.travaglini@arm.com file=sys.stderr) 18211836SCurtis.Dunham@arm.com sys.exit(2) 18311836SCurtis.Dunham@arm.com 18411482Sandreas.sandberg@arm.com formatter = _create_formatter(args) 18511482Sandreas.sandberg@arm.com 18611482Sandreas.sandberg@arm.com out_base = os.path.abspath(args.directory) 18711482Sandreas.sandberg@arm.com if not os.path.exists(out_base): 18811482Sandreas.sandberg@arm.com os.mkdir(out_base) 18911482Sandreas.sandberg@arm.com tests = [] 19011482Sandreas.sandberg@arm.com for test_name in args.test: 19111482Sandreas.sandberg@arm.com config = ClassicConfig(*test_name.split("/")) 19211482Sandreas.sandberg@arm.com out_dir = os.path.join(out_base, "/".join(config)) 19311482Sandreas.sandberg@arm.com tests.append( 19411482Sandreas.sandberg@arm.com ClassicTest(args.gem5, out_dir, config, 19511482Sandreas.sandberg@arm.com timeout=args.timeout, 19611482Sandreas.sandberg@arm.com skip_diff_stat=args.skip_diff_stat, 19711482Sandreas.sandberg@arm.com skip_diff_out=args.skip_diff_out)) 19811482Sandreas.sandberg@arm.com 19911482Sandreas.sandberg@arm.com all_results = [] 20012575Sgiacomo.travaglini@arm.com print("Running %i tests" % len(tests)) 20111482Sandreas.sandberg@arm.com for testno, test in enumerate(tests): 20212575Sgiacomo.travaglini@arm.com print("%i: Running '%s'..." % (testno, test)) 20311482Sandreas.sandberg@arm.com 20411482Sandreas.sandberg@arm.com all_results.append(test.run()) 20511482Sandreas.sandberg@arm.com 20611482Sandreas.sandberg@arm.com formatter.dump_suites(all_results) 20711482Sandreas.sandberg@arm.com 20811482Sandreas.sandberg@arm.comdef _show_args(subparsers): 20911482Sandreas.sandberg@arm.com parser = subparsers.add_parser( 21011482Sandreas.sandberg@arm.com "show", 21111482Sandreas.sandberg@arm.com formatter_class=ParagraphHelpFormatter, 21211482Sandreas.sandberg@arm.com help='Display pickled test results', 21311482Sandreas.sandberg@arm.com description='Display pickled test results', 21411482Sandreas.sandberg@arm.com epilog=""" 21511482Sandreas.sandberg@arm.com Reformat the pickled output from one or more test runs. This 21611482Sandreas.sandberg@arm.com command is typically used with the output from a single test 21711482Sandreas.sandberg@arm.com run, but it can also be used to merge the outputs from 21811482Sandreas.sandberg@arm.com multiple runs. 21911482Sandreas.sandberg@arm.com 22011482Sandreas.sandberg@arm.com The 'text' format is a verbose output format that provides 22111482Sandreas.sandberg@arm.com information about individual test units and the output from 22211482Sandreas.sandberg@arm.com failed tests. It's mainly useful for debugging test failures. 22311482Sandreas.sandberg@arm.com 22411482Sandreas.sandberg@arm.com The 'summary' format provides outputs the results of one test 22511482Sandreas.sandberg@arm.com per line with the test's overall status (OK, SKIPPED, or 22611482Sandreas.sandberg@arm.com FAILED). 22711482Sandreas.sandberg@arm.com 22811482Sandreas.sandberg@arm.com The 'junit' format is primarily intended for use with CI 22911482Sandreas.sandberg@arm.com systems. It provides an XML representation of test 23011482Sandreas.sandberg@arm.com status. Similar to the text format, it includes detailed 23111482Sandreas.sandberg@arm.com information about test failures. Since many JUnit parser make 23211482Sandreas.sandberg@arm.com assume that test names look like Java packet strings, the 23311482Sandreas.sandberg@arm.com JUnit formatter automatically to something the looks like a 23411482Sandreas.sandberg@arm.com Java class path ('.'->'-', '/'->'.'). 23511482Sandreas.sandberg@arm.com 23611482Sandreas.sandberg@arm.com The 'pickle' format stores the raw results in a format that 23711482Sandreas.sandberg@arm.com can be reformatted using this command. It's typically used 23811482Sandreas.sandberg@arm.com with the show command to merge multiple test results into one 23911482Sandreas.sandberg@arm.com pickle file.""") 24011482Sandreas.sandberg@arm.com 24111482Sandreas.sandberg@arm.com _add_format_args(parser) 24211482Sandreas.sandberg@arm.com 24311482Sandreas.sandberg@arm.com parser.add_argument("result", type=argparse.FileType("rb"), nargs="*", 24411482Sandreas.sandberg@arm.com help="Pickled test results") 24511482Sandreas.sandberg@arm.com 24611482Sandreas.sandberg@arm.comdef _show(args): 24711917Snikos.nikoleris@arm.com def _load(f): 24811917Snikos.nikoleris@arm.com # Load the pickled status file, sometimes e.g., when a 24911917Snikos.nikoleris@arm.com # regression is still running the status file might be 25011917Snikos.nikoleris@arm.com # incomplete. 25111917Snikos.nikoleris@arm.com try: 25211917Snikos.nikoleris@arm.com return pickle.load(f) 25311917Snikos.nikoleris@arm.com except EOFError: 25412575Sgiacomo.travaglini@arm.com print('Could not read file %s' % f.name, file=sys.stderr) 25511917Snikos.nikoleris@arm.com return [] 25611917Snikos.nikoleris@arm.com 25711482Sandreas.sandberg@arm.com formatter = _create_formatter(args) 25811917Snikos.nikoleris@arm.com suites = sum([ _load(f) for f in args.result ], []) 25911482Sandreas.sandberg@arm.com formatter.dump_suites(suites) 26011482Sandreas.sandberg@arm.com 26111543Sandreas.sandberg@arm.comdef _test_args(subparsers): 26211543Sandreas.sandberg@arm.com parser = subparsers.add_parser( 26311543Sandreas.sandberg@arm.com "test", 26411543Sandreas.sandberg@arm.com formatter_class=ParagraphHelpFormatter, 26511543Sandreas.sandberg@arm.com help='Probe test results and set exit code', 26611543Sandreas.sandberg@arm.com epilog=""" 26711543Sandreas.sandberg@arm.com 26811543Sandreas.sandberg@arm.com Load one or more pickled test file and return an exit code 26911543Sandreas.sandberg@arm.com corresponding to the test outcome. The following exit codes 27011543Sandreas.sandberg@arm.com can be returned: 27111543Sandreas.sandberg@arm.com 27211543Sandreas.sandberg@arm.com 0: All tests were successful or skipped. 27311543Sandreas.sandberg@arm.com 27411543Sandreas.sandberg@arm.com 1: General fault in the script such as incorrect parameters or 27511543Sandreas.sandberg@arm.com failing to parse a pickle file. 27611543Sandreas.sandberg@arm.com 27711543Sandreas.sandberg@arm.com 2: At least one test failed to run. This is what the summary 27811543Sandreas.sandberg@arm.com formatter usually shows as a 'FAILED'. 27911543Sandreas.sandberg@arm.com 28011543Sandreas.sandberg@arm.com 3: All tests ran correctly, but at least one failed to 28111543Sandreas.sandberg@arm.com verify its output. When displaying test output using the 28211543Sandreas.sandberg@arm.com summary formatter, such a test would show up as 'CHANGED'. 28311543Sandreas.sandberg@arm.com """) 28411543Sandreas.sandberg@arm.com 28511543Sandreas.sandberg@arm.com parser.add_argument("result", type=argparse.FileType("rb"), nargs="*", 28611543Sandreas.sandberg@arm.com help="Pickled test results") 28711543Sandreas.sandberg@arm.com 28811543Sandreas.sandberg@arm.comdef _test(args): 28911917Snikos.nikoleris@arm.com try: 29011917Snikos.nikoleris@arm.com suites = sum([ pickle.load(f) for f in args.result ], []) 29111917Snikos.nikoleris@arm.com except EOFError: 29212575Sgiacomo.travaglini@arm.com print('Could not read all files', file=sys.stderr) 29311917Snikos.nikoleris@arm.com sys.exit(2) 29411543Sandreas.sandberg@arm.com 29511543Sandreas.sandberg@arm.com if all(s for s in suites): 29611543Sandreas.sandberg@arm.com sys.exit(0) 29711543Sandreas.sandberg@arm.com elif any([ s.failed_run() for s in suites ]): 29811543Sandreas.sandberg@arm.com sys.exit(2) 29911543Sandreas.sandberg@arm.com elif any([ s.changed() for s in suites ]): 30011543Sandreas.sandberg@arm.com sys.exit(3) 30111543Sandreas.sandberg@arm.com else: 30211543Sandreas.sandberg@arm.com assert False, "Unexpected return status from test" 30311543Sandreas.sandberg@arm.com 30411482Sandreas.sandberg@arm.com_commands = { 30511482Sandreas.sandberg@arm.com "list" : (_list_tests, _list_tests_args), 30611482Sandreas.sandberg@arm.com "run" : (_run_tests, _run_tests_args), 30711482Sandreas.sandberg@arm.com "show" : (_show, _show_args), 30811543Sandreas.sandberg@arm.com "test" : (_test, _test_args), 30911482Sandreas.sandberg@arm.com} 31011482Sandreas.sandberg@arm.com 31111482Sandreas.sandberg@arm.comdef main(): 31211482Sandreas.sandberg@arm.com parser = argparse.ArgumentParser( 31311482Sandreas.sandberg@arm.com formatter_class=ParagraphHelpFormatter, 31411482Sandreas.sandberg@arm.com description="""gem5 testing multi tool.""", 31511482Sandreas.sandberg@arm.com epilog=""" 31611482Sandreas.sandberg@arm.com This tool provides an interface to gem5's test framework that 31711482Sandreas.sandberg@arm.com doesn't depend on gem5's build system. It supports test 31811482Sandreas.sandberg@arm.com listing, running, and output formatting. 31911482Sandreas.sandberg@arm.com 32011482Sandreas.sandberg@arm.com The list sub-command (e.g., "test.py list arm/quick") produces 32111482Sandreas.sandberg@arm.com a list of tests tuples that can be used by the run command 32211482Sandreas.sandberg@arm.com (e.g., "tests.py run gem5.opt 32311482Sandreas.sandberg@arm.com quick/se/00.hello/arm/linux/simple-timing"). 32411482Sandreas.sandberg@arm.com 32511482Sandreas.sandberg@arm.com The run command supports several output formats. One of them, 32611482Sandreas.sandberg@arm.com pickle, contains the raw output from the tests and can be 32711482Sandreas.sandberg@arm.com re-formatted using the show command (e.g., "tests.py show 32811482Sandreas.sandberg@arm.com --format summary *.pickle"). Such pickle files are also 32911482Sandreas.sandberg@arm.com generated by the build system when scons is used to run 33011482Sandreas.sandberg@arm.com regressions. 33111482Sandreas.sandberg@arm.com 33211482Sandreas.sandberg@arm.com See the usage strings for the individual sub-commands for 33311482Sandreas.sandberg@arm.com details.""") 33411482Sandreas.sandberg@arm.com 33511482Sandreas.sandberg@arm.com parser.add_argument("--verbose", action="store_true", 33611482Sandreas.sandberg@arm.com help="Produce more verbose output") 33711482Sandreas.sandberg@arm.com 33811482Sandreas.sandberg@arm.com subparsers = parser.add_subparsers(dest="command") 33911482Sandreas.sandberg@arm.com 34011482Sandreas.sandberg@arm.com for key, (impl, cmd_parser) in _commands.items(): 34111482Sandreas.sandberg@arm.com cmd_parser(subparsers) 34211482Sandreas.sandberg@arm.com 34311482Sandreas.sandberg@arm.com args = parser.parse_args() 34411482Sandreas.sandberg@arm.com impl, cmd_parser = _commands[args.command] 34511482Sandreas.sandberg@arm.com impl(args) 34611482Sandreas.sandberg@arm.com 34711482Sandreas.sandberg@arm.comif __name__ == "__main__": 34811482Sandreas.sandberg@arm.com main() 349