Create a Builder object for .isa files in arch/SConscript.
[gem5.git] / arch / SConscript
index 2d8e34b7b2c9ad97a52a7689399244c624c25a44..51f6cc0231d5b0eca44c5e34cff27be283d7a3c8 100644 (file)
@@ -31,11 +31,17 @@ import os.path
 # Import build environment variable from SConstruct.
 Import('env')
 
+# Right now there are no source files immediately in this directory
+sources = []
+
+#################################################################
 #
 # ISA "switch header" generation.
 #
 # Auto-generate arch headers that include the right ISA-specific
 # header based on the setting of THE_ISA preprocessor variable.
+#
+#################################################################
 
 # List of headers to generate
 isa_switch_hdrs = Split('''
@@ -72,3 +78,69 @@ switch_hdr_action = Action(gen_switch_hdr, gen_switch_hdr_string,
 # Instantiate actions for each header
 for hdr in isa_switch_hdrs:
     env.Command(hdr, [], switch_hdr_action)
+
+#################################################################
+#
+# Include architecture-specific files.
+#
+#################################################################
+
+#
+# Build a SCons scanner for ISA files
+#
+import SCons.Scanner
+
+def ISAScan():
+   return SCons.Scanner.Classic("ISAScan",
+                                "$ISASUFFIXES",
+                                "SRCDIR",
+                                '^[ \t]*##[ \t]*include[ \t]*"([^>"]+)"')
+
+def ISAPath(env, dir, target=None, source=None, a=None):
+   return (Dir(env['SRCDIR']), Dir('.'))   
+
+iscan = Scanner(function = ISAScan().scan, skeys = [".isa", ".ISA"],
+                path_function = ISAPath)
+env.Append(SCANNERS = iscan)
+
+#
+# Now create a Builder object that uses isa_parser.py to generate C++
+# output from the ISA description (*.isa) files.
+#
+
+# several files are generated from the ISA description
+isa_desc_gen_files = Split('''
+       decoder.cc
+        alpha_o3_exec.cc
+       fast_cpu_exec.cc
+        simple_cpu_exec.cc
+        full_cpu_exec.cc
+       decoder.hh
+        ''')
+
+# Convert to File node to fix path
+isa_parser = File('isa_parser.py')
+
+# The emitter patches up the sources & targets to include the
+# autogenerated files as targets and isa parser itself as a source.
+def isa_desc_emitter(target, source, env):
+    return (isa_desc_gen_files, [isa_parser] + source)
+
+# Pieces are in place, so create the builder.
+isa_desc_builder = Builder(action='${SOURCES[0]} ${SOURCES[1]} $TARGET.dir',
+                           source_scanner = iscan,
+                           emitter = isa_desc_emitter)
+
+env.Append(BUILDERS = { 'ISADesc' : isa_desc_builder })
+
+#
+# Now include other ISA-specific sources from the ISA subdirectories.
+#
+
+isa = env['TARGET_ISA'] # someday this may be a list of ISAs
+
+# Let the target architecture define what additional sources it needs
+sources += SConscript(os.path.join(isa, 'SConscript'),
+                      exports = 'env', duplicate = False)
+
+Return('sources')