SConscript revision 3534
1892SN/A# -*- mode:python -*-
21762SN/A
3892SN/A# Copyright (c) 2006 The Regents of The University of Michigan
4892SN/A# All rights reserved.
5892SN/A#
6892SN/A# Redistribution and use in source and binary forms, with or without
7892SN/A# modification, are permitted provided that the following conditions are
8892SN/A# met: redistributions of source code must retain the above copyright
9892SN/A# notice, this list of conditions and the following disclaimer;
10892SN/A# redistributions in binary form must reproduce the above copyright
11892SN/A# notice, this list of conditions and the following disclaimer in the
12892SN/A# documentation and/or other materials provided with the distribution;
13892SN/A# neither the name of the copyright holders nor the names of its
14892SN/A# contributors may be used to endorse or promote products derived from
15892SN/A# this software without specific prior written permission.
16892SN/A#
17892SN/A# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18892SN/A# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19892SN/A# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20892SN/A# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21892SN/A# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22892SN/A# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23892SN/A# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24892SN/A# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25892SN/A# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26892SN/A# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
272665Ssaidi@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
282665Ssaidi@eecs.umich.edu#
29892SN/A# Authors: Steve Reinhardt
30802SN/A
311722SN/Aimport os.path, sys
32802SN/A
33802SN/A# Import build environment variable from SConstruct.
34802SN/AImport('env')
35802SN/A
36802SN/A# Right now there are no source files immediately in this directory
37802SN/Asources = []
38802SN/A
39802SN/A#################################################################
40802SN/A#
411310SN/A# ISA "switch header" generation.
422542SN/A#
43802SN/A# Auto-generate arch headers that include the right ISA-specific
44802SN/A# header based on the setting of THE_ISA preprocessor variable.
45802SN/A#
46802SN/A#################################################################
472107SN/A
48802SN/A# List of headers to generate
492539SN/Aisa_switch_hdrs = Split('''
502542SN/A	arguments.hh
51802SN/A	faults.hh
522539SN/A	interrupts.hh
53802SN/A	isa_traits.hh
54802SN/A        locked_mem.hh
55909SN/A	process.hh
563349Sbinkertn@umich.edu	regfile.hh
57909SN/A	stacktrace.hh
582539SN/A	syscallreturn.hh
592539SN/A	tlb.hh
602539SN/A	types.hh
612539SN/A	utility.hh
623349Sbinkertn@umich.edu	vtophys.hh
632539SN/A        ''')
642539SN/A
65909SN/A# Generate the header.  target[0] is the full path of the output
66802SN/A# header to generate.  'source' is a dummy variable, since we get the
67802SN/A# list of ISAs from env['ALL_ISA_LIST'].
68802SN/Adef gen_switch_hdr(target, source, env):
692539SN/A    fname = str(target[0])
702539SN/A    basename = os.path.basename(fname)
712542SN/A    f = open(fname, 'w')
721310SN/A    f.write('#include "arch/isa_specific.hh"\n')
731310SN/A    cond = '#if'
74802SN/A    for isa in env['ALL_ISA_LIST']:
75802SN/A        f.write('%s THE_ISA == %s_ISA\n#include "arch/%s/%s"\n'
76802SN/A                % (cond, isa.upper(), isa, basename))
77802SN/A        cond = '#elif'
78802SN/A    f.write('#else\n#error "THE_ISA not set"\n#endif\n')
792539SN/A    f.close()
802539SN/A    return 0
812539SN/A
822539SN/A# String to print when generating header
832539SN/Adef gen_switch_hdr_string(target, source, env):
84802SN/A    return "Generating ISA switch header " + str(target[0])
85802SN/A
86802SN/A# Build SCons Action object. 'varlist' specifies env vars that this
87802SN/A# action depends on; when env['ALL_ISA_LIST'] changes these actions
88802SN/A# should get re-executed.
892539SN/Aswitch_hdr_action = Action(gen_switch_hdr, gen_switch_hdr_string,
902539SN/A                           varlist=['ALL_ISA_LIST'])
912539SN/A
922539SN/A# Instantiate actions for each header
932539SN/Afor hdr in isa_switch_hdrs:
942539SN/A    env.Command(hdr, [], switch_hdr_action)
952542SN/A
962539SN/A#################################################################
97802SN/A#
98802SN/A# Include architecture-specific files.
99802SN/A#
100#################################################################
101
102#
103# Build a SCons scanner for ISA files
104#
105import SCons.Scanner
106
107isa_scanner = SCons.Scanner.Classic("ISAScan",
108                                    [".isa", ".ISA"],
109                                    "SRCDIR",
110                                    r'^\s*##include\s+"([\w/.-]*)"')
111
112env.Append(SCANNERS = isa_scanner)
113
114#
115# Now create a Builder object that uses isa_parser.py to generate C++
116# output from the ISA description (*.isa) files.
117#
118
119# Convert to File node to fix path
120isa_parser = File('isa_parser.py')
121cpu_models_file = File('../cpu/cpu_models.py')
122
123# This sucks in the defintions of the CpuModel objects.
124execfile(cpu_models_file.srcnode().abspath)
125
126# Several files are generated from the ISA description.
127# We always get the basic decoder and header file.
128isa_desc_gen_files = Split('decoder.cc decoder.hh')
129# We also get an execute file for each selected CPU model.
130isa_desc_gen_files += [CpuModel.dict[cpu].filename
131                       for cpu in env['CPU_MODELS']]
132
133# Also include the CheckerCPU as one of the models if it is being
134# enabled via command line.
135if env['USE_CHECKER']:
136    isa_desc_gen_files += [CpuModel.dict['CheckerCPU'].filename]
137
138# The emitter patches up the sources & targets to include the
139# autogenerated files as targets and isa parser itself as a source.
140def isa_desc_emitter(target, source, env):
141    return (isa_desc_gen_files, [isa_parser, cpu_models_file] + source)
142
143# Pieces are in place, so create the builder.
144python = sys.executable  # use same Python binary used to run scons
145
146# Also include the CheckerCPU as one of the models if it is being
147# enabled via command line.
148if env['USE_CHECKER']:
149    isa_desc_builder = Builder(action=python + ' $SOURCES $TARGET.dir $CPU_MODELS CheckerCPU',
150                               emitter = isa_desc_emitter)
151else:
152    isa_desc_builder = Builder(action=python + ' $SOURCES $TARGET.dir $CPU_MODELS',
153                               emitter = isa_desc_emitter)
154
155env.Append(BUILDERS = { 'ISADesc' : isa_desc_builder })
156
157#
158# Now include other ISA-specific sources from the ISA subdirectories.
159#
160
161isa = env['TARGET_ISA'] # someday this may be a list of ISAs
162
163# Let the target architecture define what additional sources it needs
164sources += SConscript(os.path.join(isa, 'SConscript'), exports = 'env')
165
166Return('sources')
167