Create a Builder object for .isa files in arch/SConscript.
authorSteve Reinhardt <stever@eecs.umich.edu>
Thu, 23 Feb 2006 19:31:15 +0000 (14:31 -0500)
committerSteve Reinhardt <stever@eecs.umich.edu>
Thu, 23 Feb 2006 19:31:15 +0000 (14:31 -0500)
Start using SCons File objects to avoid fixed paths in
subordinate SConscripts.

SConscript:
    Push isa_parser stuff (including .isa scanner) down into
    arch/SConscript.
arch/SConscript:
    Create a Builder object for .isa files, including existing scanner.
    Return file objects generated by isa-specific SConscript
    back up to parent.
arch/alpha/SConscript:
arch/mips/SConscript:
arch/sparc/SConscript:
    Convert sources to scons File objects, so file names can be specified
    relative to the current directory.
    Invoke new builder for isa description, and get generated sources from
    there (instead of listing them explicitly).
arch/isa_parser.py:
    Get rid of third argument ("include_path").
    It was a pain to generate this from scons, and it turned out
    it's not needed anyway, since the only included file
    (decoder.hh) will be in the same directory as the sources.

--HG--
extra : convert_revision : 36861bcef36763f229704d8cb7a642b4486a3581

SConscript
arch/SConscript
arch/alpha/SConscript
arch/isa_parser.py
arch/mips/SConscript
arch/sparc/SConscript

index 49f06af7d5a970b7e048f74904eb5ca3711752f7..3e607caa417c86f88278e4c4ea9b96cf78ad3e34 100644 (file)
@@ -320,6 +320,11 @@ syscall_emulation_sources = Split('''
        sim/syscall_emul.cc
         ''')
 
+# The following stuff (targetarch code and global define of THE_ISA)
+# are legacy things that assume we're only compiling one ISA at a
+# time.  These will have to go away if we want to build a binary that
+# supports multiple ISAs.
+
 targetarch_files = Split('''
         alpha_linux_process.hh
         alpha_memory.hh
@@ -338,18 +343,14 @@ for f in targetarch_files:
     env.Command('targetarch/' + f, 'arch/%s/%s' % (env['TARGET_ISA'], f),
                 '''echo '#include "arch/%s/%s"' > $TARGET''' % (env['TARGET_ISA'], f))
 
-# Let the target architecture define what sources it needs
-arch_source = SConscript('arch/%s/SConscript' % env['TARGET_ISA'],
-       build_dir = 'build/%s/' % env['BUILD_DIR'],
-       exports = 'env', duplicate = False)
-
 # Add a flag defining what THE_ISA should be for all compilation
 env.Append(CPPDEFINES=[('THE_ISA','%s_ISA' % env['TARGET_ISA'].upper())])
 
-SConscript('arch/SConscript', exports = 'env', duplicate = False)
+arch_sources = SConscript('arch/SConscript',
+                          exports = 'env', duplicate = False)
 
 # Set up complete list of sources based on configuration.
-sources = base_sources + arch_source
+sources = base_sources + arch_sources
 
 if env['FULL_SYSTEM']:
     sources += full_system_sources
@@ -364,27 +365,6 @@ if env['USE_MYSQL']:
 for opt in env.ExportOptions:
     env.ConfigFile(opt)
 
-###################################################
-#
-# Add an 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)
-
 ###################################################
 #
 # Special build rules.
@@ -397,27 +377,6 @@ env.Command(Split('base/traceflags.hh base/traceflags.cc'),
             'base/traceflags.py',
             'python $SOURCE $TARGET.base')
 
-# several files are generated from arch/$TARGET_ISA/isa_desc.
-env.Command(Split('''
-       arch/%s/decoder.cc
-       arch/%s/decoder.hh
-        arch/%s/alpha_o3_exec.cc
-       arch/%s/fast_cpu_exec.cc
-        arch/%s/simple_cpu_exec.cc
-        arch/%s/full_cpu_exec.cc''' %
-       (env['TARGET_ISA'],
-       env['TARGET_ISA'],
-       env['TARGET_ISA'],
-       env['TARGET_ISA'],
-       env['TARGET_ISA'],
-       env['TARGET_ISA'])),
-       Split('''
-       arch/%s/isa/main.isa
-       arch/isa_parser.py''' %
-       env['TARGET_ISA']),
-       '$SRCDIR/arch/isa_parser.py $SOURCE $TARGET.dir arch/%s' % env['TARGET_ISA'])
-
-
 # libelf build is described in its own SConscript file.
 # SConscript-local is the per-config build, which just copies some
 # header files into a place where they can be found.
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')
index a5ae77dac7b5dd2be5e2ce7e01de9bdc76333675..050dfb9cf1d9dc2737ee017b463f58e2e7e35792 100644 (file)
@@ -43,40 +43,45 @@ Import('env')
 ###################################################
 
 # Base sources used by all configurations.
-arch_base_sources = Split('''
-       arch/alpha/decoder.cc
-        arch/alpha/alpha_o3_exec.cc
-       arch/alpha/fast_cpu_exec.cc
-       arch/alpha/simple_cpu_exec.cc
-       arch/alpha/full_cpu_exec.cc
-       arch/alpha/faults.cc
-       arch/alpha/isa_traits.cc
+base_sources = Split('''
+       faults.cc
+       isa_traits.cc
        ''')
 
 # Full-system sources
-arch_full_system_sources = Split('''
-       arch/alpha/alpha_memory.cc
-       arch/alpha/arguments.cc
-       arch/alpha/ev5.cc
-       arch/alpha/osfpal.cc
-       arch/alpha/stacktrace.cc
-       arch/alpha/vtophys.cc
+full_system_sources = Split('''
+       alpha_memory.cc
+       arguments.cc
+       ev5.cc
+       osfpal.cc
+       stacktrace.cc
+       vtophys.cc
        ''')
 
 
 # Syscall emulation (non-full-system) sources
-arch_syscall_emulation_sources = Split('''
-       arch/alpha/alpha_common_syscall_emul.cc
-       arch/alpha/alpha_linux_process.cc
-       arch/alpha/alpha_tru64_process.cc
+syscall_emulation_sources = Split('''
+       alpha_common_syscall_emul.cc
+       alpha_linux_process.cc
+       alpha_tru64_process.cc
        ''')
 
 # Set up complete list of sources based on configuration.
-sources = arch_base_sources
+sources = base_sources
 
 if env['FULL_SYSTEM']:
-    sources += arch_full_system_sources
+    sources += full_system_sources
 else:
-    sources += arch_syscall_emulation_sources
+    sources += syscall_emulation_sources
+
+# Convert file names to SCons File objects.  This takes care of the
+# path relative to the top of the directory tree.
+sources = [File(s) for s in sources]
+
+# Add in files generated by the ISA description.
+isa_desc_files = env.ISADesc('isa/main.isa')
+# Only non-header files need to be compiled.
+isa_desc_sources = [f for f in isa_desc_files if not f.path.endswith('.hh')]
+sources += isa_desc_sources
 
 Return('sources')
index b92d267c9ea96329bbd86ff52fcefb2a8673932f..a2bf31a0c9ee25bc70db8dc394c3897a28ab6b87 100755 (executable)
@@ -1751,7 +1751,7 @@ def preprocess_isa_desc(isa_desc):
 #
 # Read in and parse the ISA description.
 #
-def parse_isa_desc(isa_desc_file, output_dir, include_path):
+def parse_isa_desc(isa_desc_file, output_dir):
     # set a global var for the input filename... used in error messages
     global input_filename
     input_filename = isa_desc_file
@@ -1781,7 +1781,7 @@ def parse_isa_desc(isa_desc_file, output_dir, include_path):
     update_if_needed(output_dir + '/decoder.hh', file_template % vars())
 
     # generate decoder.cc
-    includes = '#include "%s/decoder.hh"' % include_path
+    includes = '#include "decoder.hh"'
     global_output = global_code.decoder_output
     namespace_output = namespace_code.decoder_output
     # namespace_output += namespace_code.decode_block
@@ -1790,7 +1790,7 @@ def parse_isa_desc(isa_desc_file, output_dir, include_path):
 
     # generate per-cpu exec files
     for cpu in CpuModel.list:
-        includes = '#include "%s/decoder.hh"\n' % include_path
+        includes = '#include "decoder.hh"\n'
         includes += cpu.includes
         global_output = global_code.exec_output[cpu.name]
         namespace_output = namespace_code.exec_output[cpu.name]
@@ -1800,4 +1800,4 @@ def parse_isa_desc(isa_desc_file, output_dir, include_path):
 
 # Called as script: get args from command line.
 if __name__ == '__main__':
-    parse_isa_desc(sys.argv[1], sys.argv[2], sys.argv[3])
+    parse_isa_desc(sys.argv[1], sys.argv[2])
index a6af916698ba2f14021721a7e2d7b3f447e2568a..b8efa7ef9839803b6ab899a43ff87d3270fadd1c 100644 (file)
@@ -40,42 +40,44 @@ Import('env')
 ###################################################
 
 # Base sources used by all configurations.
-arch_base_sources = Split('''
-       arch/mips/decoder.cc
-        arch/mips/mips_o3_exec.cc
-       arch/mips/fast_cpu_exec.cc
-       arch/mips/simple_cpu_exec.cc
-       arch/mips/full_cpu_exec.cc
-       arch/mips/faults.cc
-       arch/mips/isa_traits.cc
+base_sources = Split('''
+       faults.cc
+       isa_traits.cc
        ''')
 
 # Full-system sources
-arch_full_system_sources = Split('''
-       arch/mips/memory.cc
-       arch/mips/arguments.cc
-       arch/mips/mips34k.cc
-       arch/mips/osfpal.cc
-       arch/mips/stacktrace.cc
-       arch/mips/vtophys.cc
+full_system_sources = Split('''
+       memory.cc
+       arguments.cc
+       mips34k.cc
+       osfpal.cc
+       stacktrace.cc
+       vtophys.cc
        ''')
 
 # Syscall emulation (non-full-system) sources
-arch_syscall_emulation_sources = Split('''
-       arch/mips/common_syscall_emul.cc
-       arch/mips/linux_process.cc
-       arch/mips/tru64_process.cc
+syscall_emulation_sources = Split('''
+       common_syscall_emul.cc
+       linux_process.cc
+       tru64_process.cc
        ''')
 
 # Set up complete list of sources based on configuration.
-sources = arch_base_sources
+sources = base_sources
 
 if env['FULL_SYSTEM']:
-    sources += arch_full_system_sources
+    sources += full_system_sources
 else:
-    sources += arch_syscall_emulation_sources
+    sources += syscall_emulation_sources
 
-for opt in env.ExportOptions:
-    env.ConfigFile(opt)
+# Convert file names to SCons File objects.  This takes care of the
+# path relative to the top of the directory tree.
+sources = [File(s) for s in sources]
+
+# Add in files generated by the ISA description.
+isa_desc_files = env.ISADesc('isa/main.isa')
+# Only non-header files need to be compiled.
+isa_desc_sources = [f for f in isa_desc_files if not f.path.endswith('.hh')]
+sources += isa_desc_sources
 
 Return('sources')
index d8a3749a149888ef9002069d87246b77cb71a9fa..fea31fd5d20a21102aa293d208947e506e2a6f03 100644 (file)
@@ -40,43 +40,43 @@ Import('env')
 ###################################################
 
 # Base sources used by all configurations.
-arch_base_sources = Split('''
-       arch/sparc/decoder.cc
-        arch/sparc/alpha_o3_exec.cc
-       arch/sparc/fast_cpu_exec.cc
-       arch/sparc/simple_cpu_exec.cc
-       arch/sparc/full_cpu_exec.cc
-       arch/sparc/faults.cc
-       arch/sparc/isa_traits.cc
+base_sources = Split('''
+       faults.cc
+       isa_traits.cc
        ''')
 
 # Full-system sources
-arch_full_system_sources = Split('''
-       arch/sparc/alpha_memory.cc
-       arch/sparc/arguments.cc
-       arch/sparc/ev5.cc
-       arch/sparc/osfpal.cc
-       arch/sparc/stacktrace.cc
-       arch/sparc/vtophys.cc
+full_system_sources = Split('''
+       alpha_memory.cc
+       arguments.cc
+       ev5.cc
+       osfpal.cc
+       stacktrace.cc
+       vtophys.cc
        ''')
 
 # Syscall emulation (non-full-system) sources
-arch_syscall_emulation_sources = Split('''
-       arch/sparc/alpha_common_syscall_emul.cc
-       arch/sparc/alpha_linux_process.cc
-       arch/sparc/alpha_tru64_process.cc
+syscall_emulation_sources = Split('''
+       alpha_common_syscall_emul.cc
+       alpha_linux_process.cc
+       alpha_tru64_process.cc
        ''')
 
-sources = arch_base_sources
+sources = base_sources
 
 if env['FULL_SYSTEM']:
-    sources += arch_full_system_sources
-    if env['ALPHA_TLASER']:
-        sources += arch_turbolaser_sources
+    sources += full_system_sources
 else:
-    sources += arch_syscall_emulation_sources
+    sources += syscall_emulation_sources
 
-for opt in env.ExportOptions:
-    env.ConfigFile(opt)
+# Convert file names to SCons File objects.  This takes care of the
+# path relative to the top of the directory tree.
+sources = [File(s) for s in sources]
+
+# Add in files generated by the ISA description.
+isa_desc_files = env.ISADesc('isa/main.isa')
+# Only non-header files need to be compiled.
+isa_desc_sources = [f for f in isa_desc_files if not f.path.endswith('.hh')]
+sources += isa_desc_sources
 
 Return('sources')