From 8ee95f3d1164b3320fee3595f7ec9d8c9687dcad Mon Sep 17 00:00:00 2001 From: Gabe Black Date: Mon, 1 May 2017 21:58:41 -0700 Subject: [PATCH] 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 Reviewed-by: Jason Lowe-Power Maintainer: Jason Lowe-Power --- SConstruct | 50 ++++++++++++++++++++++----------------------- src/arch/SConscript | 10 ++++----- 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/SConstruct b/SConstruct index bf6a0c624..1efd1068d 100755 --- a/SConstruct +++ b/SConstruct @@ -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')) + +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) -Export('make_switching_dir') +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 diff --git a/src/arch/SConscript b/src/arch/SConscript index 54d97a4d9..891a5a29a 100644 --- a/src/arch/SConscript +++ b/src/arch/SConscript @@ -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(''' -- 2.30.2