SConscript revision 11765
14120Sgblack@eecs.umich.edu# -*- mode:python -*- 24120Sgblack@eecs.umich.edu# 37087Snate@binkert.org# Copyright (c) 2016 ARM Limited 47087Snate@binkert.org# All rights reserved 57087Snate@binkert.org# 67087Snate@binkert.org# The license below extends only to copyright in the software and shall 77087Snate@binkert.org# not be construed as granting a license to any other intellectual 87087Snate@binkert.org# property including but not limited to intellectual property relating 97087Snate@binkert.org# to a hardware implementation of the functionality of the software 107087Snate@binkert.org# licensed hereunder. You may use the software subject to the license 117087Snate@binkert.org# terms below provided that you ensure that this notice is replicated 127087Snate@binkert.org# unmodified and in its entirety in all distributions of the software, 137087Snate@binkert.org# modified or unmodified, in source code or in binary form. 147087Snate@binkert.org# 154120Sgblack@eecs.umich.edu# Copyright (c) 2004-2006 The Regents of The University of Michigan 164120Sgblack@eecs.umich.edu# All rights reserved. 174120Sgblack@eecs.umich.edu# 184120Sgblack@eecs.umich.edu# Redistribution and use in source and binary forms, with or without 194120Sgblack@eecs.umich.edu# modification, are permitted provided that the following conditions are 204120Sgblack@eecs.umich.edu# met: redistributions of source code must retain the above copyright 214120Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer; 224120Sgblack@eecs.umich.edu# redistributions in binary form must reproduce the above copyright 234120Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer in the 244120Sgblack@eecs.umich.edu# documentation and/or other materials provided with the distribution; 254120Sgblack@eecs.umich.edu# neither the name of the copyright holders nor the names of its 264120Sgblack@eecs.umich.edu# contributors may be used to endorse or promote products derived from 274120Sgblack@eecs.umich.edu# this software without specific prior written permission. 284120Sgblack@eecs.umich.edu# 294120Sgblack@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 304120Sgblack@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 314120Sgblack@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 324120Sgblack@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 334120Sgblack@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 344120Sgblack@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 354120Sgblack@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 364120Sgblack@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 374120Sgblack@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 384120Sgblack@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 394120Sgblack@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 404120Sgblack@eecs.umich.edu# 414120Sgblack@eecs.umich.edu# Authors: Steve Reinhardt 424120Sgblack@eecs.umich.edu# Kevin Lim 434202Sbinkertn@umich.edu# Andreas Sandberg 445069Sgblack@eecs.umich.edu 454202Sbinkertn@umich.edufrom SCons.Script.SConscript import SConsEnvironment 465659Sgblack@eecs.umich.eduimport os 479022Sgblack@eecs.umich.eduimport pickle 489023Sgblack@eecs.umich.eduimport sys 494601Sgblack@eecs.umich.edu 505124Sgblack@eecs.umich.edusys.path.insert(0, Dir(".").srcnode().abspath) 517966Sgblack@eecs.umich.eduimport testing.tests as tests 525083Sgblack@eecs.umich.eduimport testing.results as results 534679Sgblack@eecs.umich.edu 546515Sgblack@eecs.umich.eduImport('env') 555083Sgblack@eecs.umich.edu 564679Sgblack@eecs.umich.edu# get the termcap from the environment 574679Sgblack@eecs.umich.edutermcap = env['TERMCAP'] 588745Sgblack@eecs.umich.edu 596313Sgblack@eecs.umich.edu# Dict that accumulates lists of tests by category (quick, medium, long) 608771Sgblack@eecs.umich.eduenv.Tests = {} 618771Sgblack@eecs.umich.edugpu_isa = env['TARGET_GPU_ISA'] if env['BUILD_GPU'] else None 628771Sgblack@eecs.umich.edufor cat in tests.all_categories: 636365Sgblack@eecs.umich.edu env.Tests[cat] = tuple( 645124Sgblack@eecs.umich.edu tests.get_tests(env["TARGET_ISA"], 658752Sgblack@eecs.umich.edu categories=(cat, ), 668771Sgblack@eecs.umich.edu ruby_protocol=env["PROTOCOL"], 6710553Salexandru.dutu@amd.com gpu_isa=gpu_isa)) 684202Sbinkertn@umich.edu 698771Sgblack@eecs.umich.edudef color_message(color, msg): 708771Sgblack@eecs.umich.edu return color + msg + termcap.Normal 714997Sgblack@eecs.umich.edu 727624Sgblack@eecs.umich.edudef run_test(target, source, env): 735135Sgblack@eecs.umich.edu """Run a test and produce results as a pickle file. 748753Sgblack@eecs.umich.edu 754997Sgblack@eecs.umich.edu Targets are as follows: 769384SAndreas.Sandberg@arm.com target[0] : Pickle file 778745Sgblack@eecs.umich.edu 786365Sgblack@eecs.umich.edu Sources are: 798771Sgblack@eecs.umich.edu source[0] : gem5 binary 808740Sgblack@eecs.umich.edu source[1] : tests/run.py script 816365Sgblack@eecs.umich.edu source[2:] : reference files 828740Sgblack@eecs.umich.edu 838745Sgblack@eecs.umich.edu """ 848752Sgblack@eecs.umich.edu tgt_dir = os.path.dirname(str(target[0])) 858752Sgblack@eecs.umich.edu config = tests.ClassicConfig(*tgt_dir.split('/')[-6:]) 869023Sgblack@eecs.umich.edu test = tests.ClassicTest(source[0].abspath, tgt_dir, config, 878335Snate@binkert.org timeout=5*60*60, 884120Sgblack@eecs.umich.edu skip_diff_out=True) 895069Sgblack@eecs.umich.edu 905081Sgblack@eecs.umich.edu for ref in test.ref_files(): 915081Sgblack@eecs.umich.edu out_file = os.path.join(tgt_dir, ref) 925081Sgblack@eecs.umich.edu if os.path.exists(out_file): 935081Sgblack@eecs.umich.edu env.Execute(Delete(out_file)) 945081Sgblack@eecs.umich.edu 955081Sgblack@eecs.umich.edu with open(target[0].abspath, "wb") as fout: 965081Sgblack@eecs.umich.edu formatter = results.Pickle(fout=fout) 975081Sgblack@eecs.umich.edu formatter.dump_suites([ test.run() ]) 985081Sgblack@eecs.umich.edu 995081Sgblack@eecs.umich.edu return 0 1005081Sgblack@eecs.umich.edu 1015081Sgblack@eecs.umich.edudef run_test_string(target, source, env): 1025081Sgblack@eecs.umich.edu return env.subst("Running test in ${TARGETS[0].dir}.", 1035081Sgblack@eecs.umich.edu target=target, source=source) 1045081Sgblack@eecs.umich.edu 1055081Sgblack@eecs.umich.edutestAction = env.Action(run_test, run_test_string) 1065081Sgblack@eecs.umich.edu 1075081Sgblack@eecs.umich.edudef print_test(target, source, env): 1085081Sgblack@eecs.umich.edu """Run a test and produce results as a pickle file. 1095081Sgblack@eecs.umich.edu 1105081Sgblack@eecs.umich.edu Targets are as follows: 1115081Sgblack@eecs.umich.edu target[*] : Dummy targets 1125081Sgblack@eecs.umich.edu 1135081Sgblack@eecs.umich.edu Sources are: 1145081Sgblack@eecs.umich.edu source[0] : Pickle file 1155081Sgblack@eecs.umich.edu 1165081Sgblack@eecs.umich.edu """ 1175081Sgblack@eecs.umich.edu with open(source[0].abspath, "rb") as fin: 1185081Sgblack@eecs.umich.edu result = pickle.load(fin) 1195081Sgblack@eecs.umich.edu 1205081Sgblack@eecs.umich.edu assert len(result) == 1 1215081Sgblack@eecs.umich.edu result = result[0] 1225081Sgblack@eecs.umich.edu 1235081Sgblack@eecs.umich.edu formatter = None 1245081Sgblack@eecs.umich.edu if result.skipped(): 1255081Sgblack@eecs.umich.edu status = color_message(termcap.Cyan, "skipped.") 1265081Sgblack@eecs.umich.edu elif result.changed(): 1275081Sgblack@eecs.umich.edu status = color_message(termcap.Yellow, "CHANGED!") 1285081Sgblack@eecs.umich.edu formatter = results.Text() 1295081Sgblack@eecs.umich.edu elif result: 1305081Sgblack@eecs.umich.edu status = color_message(termcap.Green, "passed.") 1315081Sgblack@eecs.umich.edu else: 1325081Sgblack@eecs.umich.edu status = color_message(termcap.Red, "FAILED!") 1335081Sgblack@eecs.umich.edu formatter = results.Text() 1345081Sgblack@eecs.umich.edu 1355081Sgblack@eecs.umich.edu if formatter: 1365081Sgblack@eecs.umich.edu formatter.dump_suites([result]) 1375081Sgblack@eecs.umich.edu 1385081Sgblack@eecs.umich.edu print "***** %s: %s" % (source[0].dir, status) 1395081Sgblack@eecs.umich.edu return 0 1405081Sgblack@eecs.umich.edu 1415081Sgblack@eecs.umich.eduprintAction = env.Action(print_test, strfunction=None) 1425081Sgblack@eecs.umich.edu 1435081Sgblack@eecs.umich.edudef update_test(target, source, env): 1445081Sgblack@eecs.umich.edu """Update test reference data 1455680Sgblack@eecs.umich.edu 1465081Sgblack@eecs.umich.edu Targets are as follows: 1475933Sgblack@eecs.umich.edu target[0] : Dummy file 1485173Sgblack@eecs.umich.edu 1495359Sgblack@eecs.umich.edu Sources are: 1505081Sgblack@eecs.umich.edu source[0] : Pickle file 1515149Sgblack@eecs.umich.edu """ 1525298Sgblack@eecs.umich.edu 1535081Sgblack@eecs.umich.edu src_dir = os.path.dirname(str(source[0])) 1545081Sgblack@eecs.umich.edu config = tests.ClassicConfig(*src_dir.split('/')[-6:]) 1555081Sgblack@eecs.umich.edu test = tests.ClassicTest(source[0].abspath, src_dir, config) 1565081Sgblack@eecs.umich.edu ref_dir = test.ref_dir 1575081Sgblack@eecs.umich.edu 1585081Sgblack@eecs.umich.edu with open(source[0].abspath, "rb") as fin: 1595081Sgblack@eecs.umich.edu result = pickle.load(fin) 1605081Sgblack@eecs.umich.edu 1615081Sgblack@eecs.umich.edu assert len(result) == 1 1625081Sgblack@eecs.umich.edu result = result[0] 1635081Sgblack@eecs.umich.edu 1645081Sgblack@eecs.umich.edu if result.skipped(): 1655081Sgblack@eecs.umich.edu print "*** %s: %s: Test skipped, not updating." % ( 1665081Sgblack@eecs.umich.edu source[0].dir, color_message(termcap.Yellow, "WARNING"), ) 1675081Sgblack@eecs.umich.edu return 0 1685081Sgblack@eecs.umich.edu elif result: 1695081Sgblack@eecs.umich.edu print "*** %s: %s: Test successful, not updating." % ( 1705081Sgblack@eecs.umich.edu source[0].dir, color_message(termcap.Green, "skipped"), ) 1715081Sgblack@eecs.umich.edu return 0 1725081Sgblack@eecs.umich.edu elif result.failed_run(): 1735081Sgblack@eecs.umich.edu print "*** %s: %s: Test failed, not updating." % ( 1745081Sgblack@eecs.umich.edu source[0].dir, color_message(termcap.Red, "ERROR"), ) 1755081Sgblack@eecs.umich.edu return 1 1765081Sgblack@eecs.umich.edu 1775081Sgblack@eecs.umich.edu print "** Updating %s" % (test, ) 1785081Sgblack@eecs.umich.edu test.update_ref() 1795081Sgblack@eecs.umich.edu 1805081Sgblack@eecs.umich.edu return 0 1815081Sgblack@eecs.umich.edu 1825081Sgblack@eecs.umich.edudef update_test_string(target, source, env): 1835081Sgblack@eecs.umich.edu return env.subst("Updating ${SOURCES[0].dir}", 1845081Sgblack@eecs.umich.edu target=target, source=source) 1855081Sgblack@eecs.umich.edu 1865081Sgblack@eecs.umich.eduupdateAction = env.Action(update_test, update_test_string) 1875081Sgblack@eecs.umich.edu 1885081Sgblack@eecs.umich.edudef test_builder(test_tuple): 1895081Sgblack@eecs.umich.edu """Define a test.""" 1905081Sgblack@eecs.umich.edu 1915081Sgblack@eecs.umich.edu out_dir = "/".join(test_tuple) 1925081Sgblack@eecs.umich.edu binary = env.M5Binary.abspath 1935081Sgblack@eecs.umich.edu test = tests.ClassicTest(binary, out_dir, test_tuple) 1945081Sgblack@eecs.umich.edu 1955081Sgblack@eecs.umich.edu def tgt(name): 1965081Sgblack@eecs.umich.edu return os.path.join(out_dir, name) 1975081Sgblack@eecs.umich.edu 1985081Sgblack@eecs.umich.edu def ref(name): 1995081Sgblack@eecs.umich.edu return os.path.join(test.ref_dir, name) 2005081Sgblack@eecs.umich.edu 2015081Sgblack@eecs.umich.edu pickle_file = tgt("status.pickle") 2025081Sgblack@eecs.umich.edu targets = [ 2035081Sgblack@eecs.umich.edu pickle_file, 2045081Sgblack@eecs.umich.edu ] 2055081Sgblack@eecs.umich.edu 2065081Sgblack@eecs.umich.edu sources = [ 2075081Sgblack@eecs.umich.edu env.M5Binary, 2085081Sgblack@eecs.umich.edu "run.py", 2095081Sgblack@eecs.umich.edu ] + [ ref(f) for f in test.ref_files() ] 2105081Sgblack@eecs.umich.edu 2115081Sgblack@eecs.umich.edu env.Command(targets, sources, testAction) 2125081Sgblack@eecs.umich.edu 2135081Sgblack@eecs.umich.edu # phony target to echo status 2145081Sgblack@eecs.umich.edu if GetOption('update_ref'): 2155081Sgblack@eecs.umich.edu p = env.Command(tgt("_update"), [pickle_file], updateAction) 2165081Sgblack@eecs.umich.edu else: 2175081Sgblack@eecs.umich.edu p = env.Command(tgt("_print"), [pickle_file], printAction) 2185081Sgblack@eecs.umich.edu 2195081Sgblack@eecs.umich.edu env.AlwaysBuild(p) 2205081Sgblack@eecs.umich.edu 2215081Sgblack@eecs.umich.edudef list_tests(target, source, env): 2225081Sgblack@eecs.umich.edu """Create a list of tests 2235081Sgblack@eecs.umich.edu 2245081Sgblack@eecs.umich.edu Targets are as follows: 2255081Sgblack@eecs.umich.edu target[0] : List file (e.g., tests/opt/all.list, tests/opt/quick.list) 2265081Sgblack@eecs.umich.edu 2275081Sgblack@eecs.umich.edu Sources are: - 2285081Sgblack@eecs.umich.edu 2295081Sgblack@eecs.umich.edu """ 2305081Sgblack@eecs.umich.edu 2315081Sgblack@eecs.umich.edu tgt_name = os.path.basename(str(target[0])) 2325081Sgblack@eecs.umich.edu base, ext = os.path.splitext(tgt_name) 2335081Sgblack@eecs.umich.edu categories = tests.all_categories if base == "all" else (base, ) 2345081Sgblack@eecs.umich.edu 2355081Sgblack@eecs.umich.edu with open(target[0].abspath, "w") as fout: 2365081Sgblack@eecs.umich.edu for cat in categories: 2375081Sgblack@eecs.umich.edu for test in env.Tests[cat]: 2385081Sgblack@eecs.umich.edu print >> fout,"/".join(test) 2395081Sgblack@eecs.umich.edu 2405081Sgblack@eecs.umich.edu return 0 2415081Sgblack@eecs.umich.edu 2425081Sgblack@eecs.umich.edutestListAction = env.Action(list_tests, strfunction=None) 2435081Sgblack@eecs.umich.edu 2445081Sgblack@eecs.umich.eduenv.Command("all.list", tuple(), testListAction) 2455081Sgblack@eecs.umich.edufor cat, test_list in env.Tests.items(): 2465081Sgblack@eecs.umich.edu env.Command("%s.list" % cat, tuple(), testListAction) 2475081Sgblack@eecs.umich.edu for test in test_list: 2485081Sgblack@eecs.umich.edu test_builder(test) 2495081Sgblack@eecs.umich.edu