scons: arch: Generalize the switching header code.

Factor out the ISA ness of the switching header generating function. Also
turn it into a SCons builder which builds a single header, and a wrapping
method which uses the builder on a group of header files which all target
the same subdirectory.

Change-Id: I87705f97b6ebd9baebd4ebcfea19cc1218a64ad0
Reviewed-on: https://gem5-review.googlesource.com/2983
Reviewed-by: Curtis Dunham <curtis.dunham@arm.com>
Reviewed-by: Jason Lowe-Power <jason@lowepower.com>
Maintainer: Jason Lowe-Power <jason@lowepower.com>
This commit is contained in:
Gabe Black
2017-05-01 21:58:41 -07:00
parent 942e295799
commit 8ee95f3d11
2 changed files with 29 additions and 31 deletions

View File

@@ -1324,38 +1324,38 @@ main.Prepend(CPPPATH=Dir('ext/pybind11/include/'))
###################################################
#
# This function is used to set up a directory with switching headers
# This builder and wrapper method are used to set up a directory with
# switching headers. Those are headers which are in a generic location and
# that include more specific headers from a directory chosen at build time
# based on the current build settings.
#
###################################################
main['ALL_ISA_LIST'] = all_isa_list
main['ALL_GPU_ISA_LIST'] = all_gpu_isa_list
def make_switching_dir(dname, switch_headers, env):
# Generate the header. target[0] is the full path of the output
# header to generate. 'source' is a dummy variable, since we get the
# list of ISAs from env['ALL_ISA_LIST'].
def gen_switch_hdr(target, source, env):
fname = str(target[0])
isa = env['TARGET_ISA'].lower()
try:
f = open(fname, 'w')
print >>f, '#include "%s/%s/%s"' % (dname, isa, basename(fname))
f.close()
except IOError:
print "Failed to create %s" % fname
raise
# Build SCons Action object. 'varlist' specifies env vars that this
# action depends on; when env['ALL_ISA_LIST'] changes these actions
# should get re-executed.
switch_hdr_action = MakeAction(gen_switch_hdr,
Transform("GENERATE"), varlist=['ALL_ISA_LIST'])
def build_switching_header(target, source, env):
path = str(target[0])
subdir = str(source[0])
dp, fp = os.path.split(path)
dp = os.path.relpath(os.path.realpath(dp),
os.path.realpath(env['BUILDDIR']))
with open(path, 'w') as hdr:
print >>hdr, '#include "%s/%s/%s"' % (dp, subdir, fp)
# Instantiate actions for each header
for hdr in switch_headers:
env.Command(hdr, [], switch_hdr_action)
switching_header_action = MakeAction(build_switching_header,
Transform('GENERATE'))
Export('make_switching_dir')
switching_header_builder = Builder(action=switching_header_action,
source_factory=Value,
single_source=True)
main.Append(BUILDERS = { 'SwitchingHeader': switching_header_builder })
def switching_headers(self, headers, source):
for header in headers:
self.SwitchingHeader(header, source)
main.AddMethod(switching_headers, 'SwitchingHeaders')
def make_gpu_switching_dir(dname, switch_headers, env):
# Generate the header. target[0] is the full path of the output

View File

@@ -43,8 +43,8 @@ Import('*')
#
#################################################################
# List of headers to generate
isa_switch_hdrs = Split('''
env.SwitchingHeaders(
Split('''
decoder.hh
interrupts.hh
isa.hh
@@ -63,10 +63,8 @@ isa_switch_hdrs = Split('''
types.hh
utility.hh
vtophys.hh
''')
# Set up this directory to support switching headers
make_switching_dir('arch', isa_switch_hdrs, env)
'''),
env.subst('${TARGET_ISA}'))
if env['BUILD_GPU']:
gpu_isa_switch_hdrs = Split('''