Auto-generate arch/foo.hh "switch headers" in scons.
authorSteve Reinhardt <stever@eecs.umich.edu>
Thu, 23 Feb 2006 03:22:06 +0000 (22:22 -0500)
committerSteve Reinhardt <stever@eecs.umich.edu>
Thu, 23 Feb 2006 03:22:06 +0000 (22:22 -0500)
SConscript:
    Include new arch/SConscript file.
arch/isa_specific.hh:
    Get rid of unnecessary ISA_INCLUDE() macro and other
    things that were used only for that purpose.
build/SConstruct:
    Move list of ISAs to env var ALL_ISA_LIST.

--HG--
extra : convert_revision : 612c7ee4279d57209662be88dc577d80fdbd692c

SConscript
arch/SConscript [new file with mode: 0644]
arch/isa_specific.hh
build/SConstruct

index d2f6b0497394e7d90bc2e126ca8effada634453a..49f06af7d5a970b7e048f74904eb5ca3711752f7 100644 (file)
@@ -346,6 +346,8 @@ arch_source = SConscript('arch/%s/SConscript' % env['TARGET_ISA'],
 # 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)
+
 # Set up complete list of sources based on configuration.
 sources = base_sources + arch_source
 
diff --git a/arch/SConscript b/arch/SConscript
new file mode 100644 (file)
index 0000000..2d8e34b
--- /dev/null
@@ -0,0 +1,74 @@
+# -*- mode:python -*-
+
+# Copyright (c) 2006 The Regents of The University of Michigan
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met: redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer;
+# redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution;
+# neither the name of the copyright holders nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import os.path
+
+# Import build environment variable from SConstruct.
+Import('env')
+
+#
+# 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('''
+       isa_traits.hh
+        ''')
+
+# 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])
+    basename = os.path.basename(fname)
+    f = open(fname, 'w')
+    f.write('#include "arch/isa_specific.hh"\n')
+    cond = '#if'
+    for isa in env['ALL_ISA_LIST']:
+        f.write('%s THE_ISA == %s_ISA\n#include "arch/%s/%s"\n'
+                % (cond, isa.upper(), isa, basename))
+        cond = '#elif'
+    f.write('#else\n#error "THE_ISA not set"\n#endif\n')
+    f.close()
+    return 0
+
+# String to print when generating header
+def gen_switch_hdr_string(target, source, env):
+    return "Generating ISA switch header " + str(target[0])
+
+# Build SCons Action object. 'varlist' specifies env vars that this
+# action depdnds on; when env['ALL_ISA_LIST'] changes these actions
+# should get re-executed.
+switch_hdr_action = Action(gen_switch_hdr, gen_switch_hdr_string,
+                           varlist=['ALL_ISA_LIST'])
+
+# Instantiate actions for each header
+for hdr in isa_switch_hdrs:
+    env.Command(hdr, [], switch_hdr_action)
index e11e6c292a41448817b052bd5edf93321504cc26..44f8e9d649f933db89ce42aa9b5ba6464dd5d863 100644 (file)
 //These tell the preprocessor where to find the files of a particular
 //ISA, and set the "TheISA" macro for use elsewhere.
 #if THE_ISA == ALPHA_ISA
-    #define ISA_PATH arch/alpha/
     #define TheISA AlphaISA
 #elif THE_ISA == SPARC_ISA
-    #define ISA_PATH arch/sparc/
     #define TheISA SparcISA
 #elif THE_ISA == MIPS_ISA
-    #define ISA_PATH arch/mips/
     #define TheISA MipsISA
 #else
     #error "THE_ISA not set"
 #endif
-//The following is some preprocessor voodoo to allow redirectable includes
-//The end result is the ISA_INCLUDE() macro which is used inside stub
-//include files in arch and which redirect to the isa in use.
-#define STRINGIFY(token) #token
-#define EXPAND(token) token
-#define STICK_TOGETHER(firstpart, secondpart) \
-    EXPAND(firstpart)EXPAND(secondpart)
-#define EXPAND_AND_STRINGIFY(pathAndFile) \
-    STRINGIFY(pathAndFile)
-#define ISA_INCLUDE(filename) \
-    EXPAND_AND_STRINGIFY(STICK_TOGETHER(ISA_PATH, filename))
 
 #endif
index c552e5639bc29925b7d160d72e6a8d29f3e3c2cb..38d404846650a61e5df942b84c942ec4841d8ff6 100644 (file)
@@ -218,12 +218,15 @@ if have_mysql:
 
 env = conf.Finish()
 
+# Define the universe of supported ISAs
+env['ALL_ISA_LIST'] = ['alpha', 'sparc', 'mips']
+
 # Sticky options get saved in the options file so they persist from
 # one invocation to the next (unless overridden, in which case the new
 # value becomes sticky).
 sticky_opts = Options(args=ARGUMENTS)
 sticky_opts.AddOptions(
-    EnumOption('TARGET_ISA', 'Target ISA', 'alpha', ('alpha', 'sparc', 'mips')),
+    EnumOption('TARGET_ISA', 'Target ISA', 'alpha', env['ALL_ISA_LIST']),
     BoolOption('FULL_SYSTEM', 'Full-system support', False),
     BoolOption('ALPHA_TLASER',
                'Model Alpha TurboLaser platform (vs. Tsunami)', False),