SConscript revision 10319
19397Sandreas.hansson@arm.com# -*- mode:python -*- 29397Sandreas.hansson@arm.com 39397Sandreas.hansson@arm.com# Copyright (c) 2006 The Regents of The University of Michigan 49397Sandreas.hansson@arm.com# All rights reserved. 59397Sandreas.hansson@arm.com# 69397Sandreas.hansson@arm.com# Redistribution and use in source and binary forms, with or without 79397Sandreas.hansson@arm.com# modification, are permitted provided that the following conditions are 89397Sandreas.hansson@arm.com# met: redistributions of source code must retain the above copyright 99397Sandreas.hansson@arm.com# notice, this list of conditions and the following disclaimer; 109397Sandreas.hansson@arm.com# redistributions in binary form must reproduce the above copyright 119397Sandreas.hansson@arm.com# notice, this list of conditions and the following disclaimer in the 129397Sandreas.hansson@arm.com# documentation and/or other materials provided with the distribution; 139397Sandreas.hansson@arm.com# neither the name of the copyright holders nor the names of its 149397Sandreas.hansson@arm.com# contributors may be used to endorse or promote products derived from 159397Sandreas.hansson@arm.com# this software without specific prior written permission. 169397Sandreas.hansson@arm.com# 179397Sandreas.hansson@arm.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 189397Sandreas.hansson@arm.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 199397Sandreas.hansson@arm.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 209397Sandreas.hansson@arm.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 219397Sandreas.hansson@arm.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 229397Sandreas.hansson@arm.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 239397Sandreas.hansson@arm.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 249397Sandreas.hansson@arm.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 259397Sandreas.hansson@arm.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 269397Sandreas.hansson@arm.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 279397Sandreas.hansson@arm.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 289397Sandreas.hansson@arm.com# 299397Sandreas.hansson@arm.com# Authors: Steve Reinhardt 309397Sandreas.hansson@arm.com 319397Sandreas.hansson@arm.comimport sys 329397Sandreas.hansson@arm.comimport os 339397Sandreas.hansson@arm.comimport re 349397Sandreas.hansson@arm.com 359397Sandreas.hansson@arm.comImport('*') 369397Sandreas.hansson@arm.com 379397Sandreas.hansson@arm.com################################################################# 389397Sandreas.hansson@arm.com# 399397Sandreas.hansson@arm.com# ISA "switch header" generation. 4011793Sbrandon.potter@amd.com# 4111793Sbrandon.potter@amd.com# Auto-generate arch headers that include the right ISA-specific 429397Sandreas.hansson@arm.com# header based on the setting of THE_ISA preprocessor variable. 439397Sandreas.hansson@arm.com# 449397Sandreas.hansson@arm.com################################################################# 459397Sandreas.hansson@arm.com 469397Sandreas.hansson@arm.com# List of headers to generate 479397Sandreas.hansson@arm.comisa_switch_hdrs = Split(''' 489397Sandreas.hansson@arm.com decoder.hh 499705Sandreas.hansson@arm.com interrupts.hh 509397Sandreas.hansson@arm.com isa.hh 519397Sandreas.hansson@arm.com isa_traits.hh 529397Sandreas.hansson@arm.com kernel_stats.hh 539397Sandreas.hansson@arm.com locked_mem.hh 549397Sandreas.hansson@arm.com microcode_rom.hh 559397Sandreas.hansson@arm.com mmapped_ipr.hh 569397Sandreas.hansson@arm.com mt.hh 579705Sandreas.hansson@arm.com process.hh 589397Sandreas.hansson@arm.com registers.hh 599397Sandreas.hansson@arm.com remote_gdb.hh 609705Sandreas.hansson@arm.com stacktrace.hh 619705Sandreas.hansson@arm.com tlb.hh 629397Sandreas.hansson@arm.com types.hh 639705Sandreas.hansson@arm.com utility.hh 649397Sandreas.hansson@arm.com vtophys.hh 659397Sandreas.hansson@arm.com ''') 669399Sandreas.hansson@arm.com 679705Sandreas.hansson@arm.com# Set up this directory to support switching headers 689705Sandreas.hansson@arm.commake_switching_dir('arch', isa_switch_hdrs, env) 699397Sandreas.hansson@arm.com 709397Sandreas.hansson@arm.com################################################################# 719397Sandreas.hansson@arm.com# 729397Sandreas.hansson@arm.com# Include architecture-specific files. 739397Sandreas.hansson@arm.com# 749397Sandreas.hansson@arm.com################################################################# 759397Sandreas.hansson@arm.com 769397Sandreas.hansson@arm.com# 779397Sandreas.hansson@arm.com# Build a SCons scanner for ISA files 789397Sandreas.hansson@arm.com# 799705Sandreas.hansson@arm.comimport SCons.Scanner 809397Sandreas.hansson@arm.com 819397Sandreas.hansson@arm.comisa_scanner = SCons.Scanner.Classic("ISAScan", 829397Sandreas.hansson@arm.com [".isa", ".ISA"], 839397Sandreas.hansson@arm.com "SRCDIR", 849397Sandreas.hansson@arm.com r'^\s*##include\s+"([\w/.-]*)"') 859397Sandreas.hansson@arm.com 869705Sandreas.hansson@arm.comenv.Append(SCANNERS = isa_scanner) 879705Sandreas.hansson@arm.com 889705Sandreas.hansson@arm.com# 899705Sandreas.hansson@arm.com# Now create a Builder object that uses isa_parser.py to generate C++ 909705Sandreas.hansson@arm.com# output from the ISA description (*.isa) files. 919397Sandreas.hansson@arm.com# 929705Sandreas.hansson@arm.com 939397Sandreas.hansson@arm.comisa_parser = File('isa_parser.py') 949397Sandreas.hansson@arm.com 959705Sandreas.hansson@arm.com# The emitter patches up the sources & targets to include the 969397Sandreas.hansson@arm.com# autogenerated files as targets and isa parser itself as a source. 979399Sandreas.hansson@arm.comdef isa_desc_emitter(target, source, env): 989399Sandreas.hansson@arm.com # List the isa parser as a source. 999464Sandreas.hansson@arm.com source += [ 1009399Sandreas.hansson@arm.com isa_parser, 1019705Sandreas.hansson@arm.com Value("ExecContext"), 1029399Sandreas.hansson@arm.com ] 1039399Sandreas.hansson@arm.com 1049399Sandreas.hansson@arm.com # Specify different targets depending on if we're running the ISA 1059399Sandreas.hansson@arm.com # parser for its dependency information, or for the generated files. 1069399Sandreas.hansson@arm.com # (As an optimization, the ISA parser detects the useless second run 1079399Sandreas.hansson@arm.com # and skips doing any work, if the first run was performed, since it 1089399Sandreas.hansson@arm.com # always generates all its files). The way we track this in SCons is the 1099399Sandreas.hansson@arm.com # <arch>_isa_outputs value in the environment (env). If it's unset, we 1109399Sandreas.hansson@arm.com # don't know what the dependencies are so we ask for generated/inc.d to 1119399Sandreas.hansson@arm.com # be generated so they can be acquired. If we know what they are, then 1129399Sandreas.hansson@arm.com # it's because we've already processed inc.d and then claim that our 1139399Sandreas.hansson@arm.com # outputs (targets) will be thus. 1149399Sandreas.hansson@arm.com isa = env['TARGET_ISA'] 1159399Sandreas.hansson@arm.com key = '%s_isa_outputs' % isa 1169399Sandreas.hansson@arm.com if key in env: 1179399Sandreas.hansson@arm.com targets = [ os.path.join('generated', f) for f in env[key] ] 1189399Sandreas.hansson@arm.com else: 1199399Sandreas.hansson@arm.com targets = [ os.path.join('generated','inc.d') ] 1209399Sandreas.hansson@arm.com 1219399Sandreas.hansson@arm.com def prefix(s): 1229705Sandreas.hansson@arm.com return os.path.join(target[0].dir.up().abspath, s) 1239705Sandreas.hansson@arm.com 1249399Sandreas.hansson@arm.com return [ prefix(t) for t in targets ], source 1259399Sandreas.hansson@arm.com 1269399Sandreas.hansson@arm.comARCH_DIR = Dir('.') 1279399Sandreas.hansson@arm.com 1289705Sandreas.hansson@arm.com# import ply here because SCons screws with sys.path when performing actions. 1299399Sandreas.hansson@arm.comimport ply 1309705Sandreas.hansson@arm.com 1319705Sandreas.hansson@arm.comdef isa_desc_action_func(target, source, env): 1329399Sandreas.hansson@arm.com # Add the current directory to the system path so we can import files 1339705Sandreas.hansson@arm.com sys.path[0:0] = [ ARCH_DIR.srcnode().abspath ] 1349399Sandreas.hansson@arm.com import isa_parser 1359399Sandreas.hansson@arm.com 1369399Sandreas.hansson@arm.com # Skip over the ISA description itself and the parser to the CPU models. 1379705Sandreas.hansson@arm.com models = [ s.get_contents() for s in source[2:] ] 1389705Sandreas.hansson@arm.com parser = isa_parser.ISAParser(target[0].dir.abspath) 1399399Sandreas.hansson@arm.com parser.parse_isa_desc(source[0].abspath) 1409399Sandreas.hansson@arm.comisa_desc_action = MakeAction(isa_desc_action_func, Transform("ISA DESC", 1)) 1419399Sandreas.hansson@arm.com 1429399Sandreas.hansson@arm.com# Also include the CheckerCPU as one of the models if it is being 1439399Sandreas.hansson@arm.com# enabled via command line. 1449399Sandreas.hansson@arm.comisa_desc_builder = Builder(action=isa_desc_action, emitter=isa_desc_emitter) 1459399Sandreas.hansson@arm.com 1469399Sandreas.hansson@arm.comenv.Append(BUILDERS = { 'ISADesc' : isa_desc_builder }) 1479399Sandreas.hansson@arm.com 1489399Sandreas.hansson@arm.com# The ISA is generated twice: the first time to find out what it generates, 1499399Sandreas.hansson@arm.com# and the second time to make scons happy by telling the ISADesc builder 1509399Sandreas.hansson@arm.com# what it will make before it builds it. 1519399Sandreas.hansson@arm.comdef scan_isa_deps(target, source, env): 1529705Sandreas.hansson@arm.com # Process dependency file generated by the ISA parser -- 1539705Sandreas.hansson@arm.com # add the listed files to the dependency tree of the build. 1549705Sandreas.hansson@arm.com source = source[0] 1559399Sandreas.hansson@arm.com archbase = source.dir.up().path 1569399Sandreas.hansson@arm.com 1579399Sandreas.hansson@arm.com try: 1589399Sandreas.hansson@arm.com depfile = open(source.abspath, 'r') 1599399Sandreas.hansson@arm.com except: 1609399Sandreas.hansson@arm.com print "scan_isa_deps: Can't open ISA deps file '%s' in %s" % \ 1619399Sandreas.hansson@arm.com (source.path,os.getcwd()) 1629399Sandreas.hansson@arm.com raise 1639399Sandreas.hansson@arm.com 1649399Sandreas.hansson@arm.com # Scan through the lines 1659399Sandreas.hansson@arm.com targets = {} 1669399Sandreas.hansson@arm.com for line in depfile: 1679399Sandreas.hansson@arm.com # Read the dependency line with the format 1689399Sandreas.hansson@arm.com # <target file>: [ <dependent file>* ] 1699399Sandreas.hansson@arm.com m = re.match(r'^\s*([^:]+\.([^\.:]+))\s*:\s*(.*)', line) 1709399Sandreas.hansson@arm.com assert(m) 1719399Sandreas.hansson@arm.com targ, extn = m.group(1,2) 1729399Sandreas.hansson@arm.com deps = m.group(3).split() 1739399Sandreas.hansson@arm.com 1749399Sandreas.hansson@arm.com files = [ targ ] + deps 1759399Sandreas.hansson@arm.com for f in files: 1769399Sandreas.hansson@arm.com targets[f] = True 1779399Sandreas.hansson@arm.com # Eliminate unnecessary re-generation if we already generated it 1789399Sandreas.hansson@arm.com env.Precious(os.path.join(archbase, 'generated', f)) 1799399Sandreas.hansson@arm.com 1809399Sandreas.hansson@arm.com files = [ os.path.join(archbase, 'generated', f) for f in files ] 1819399Sandreas.hansson@arm.com 1829705Sandreas.hansson@arm.com if extn == 'cc': 1839705Sandreas.hansson@arm.com Source(os.path.join(archbase,'generated', targ)) 1849705Sandreas.hansson@arm.com depfile.close() 1859705Sandreas.hansson@arm.com env[env['TARGET_ISA'] + '_isa_outputs'] = targets.keys() 1869705Sandreas.hansson@arm.com 1879705Sandreas.hansson@arm.com isa = env.ISADesc(os.path.join(archbase,'isa','main.isa')) 1889705Sandreas.hansson@arm.com for t in targets: 1899705Sandreas.hansson@arm.com env.Depends('#all-isas', isa) 1909705Sandreas.hansson@arm.com 1919399Sandreas.hansson@arm.comenv.Append(BUILDERS = {'ScanISA' : 1929399Sandreas.hansson@arm.com Builder(action=MakeAction(scan_isa_deps, 1939399Sandreas.hansson@arm.com Transform("NEW DEPS", 1)))}) 1949399Sandreas.hansson@arm.com 1959399Sandreas.hansson@arm.comDebugFlag('IntRegs') 1969399Sandreas.hansson@arm.comDebugFlag('FloatRegs') 1979399Sandreas.hansson@arm.comDebugFlag('CCRegs') 1989399Sandreas.hansson@arm.comDebugFlag('MiscRegs') 1999399Sandreas.hansson@arm.comCompoundFlag('Registers', [ 'IntRegs', 'FloatRegs', 'CCRegs', 'MiscRegs' ]) 2009399Sandreas.hansson@arm.com