scons: arch: Generalize the switching header code.
authorGabe Black <gabeblack@google.com>
Tue, 2 May 2017 04:58:41 +0000 (21:58 -0700)
committerGabe Black <gabeblack@google.com>
Wed, 10 May 2017 16:52:24 +0000 (16:52 +0000)
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>

SConstruct
src/arch/SConscript

index bf6a0c624cc984c8f1b9f9ad014fac818a03080b..1efd1068dea25456808e150a61326e7e746653ee 100755 (executable)
@@ -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
index 54d97a4d96eafd18d120b3533f7e880d64ee0c36..891a5a29a80470a7555a0e04062131b72a6231fd 100644 (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('''