Gabe Black has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/40969 )

Change subject: scons: Pull builder definitions out of SConstruct.
......................................................................

scons: Pull builder definitions out of SConstruct.

Put them in site_scons/gem5_scons/builders.py. This decreases the bulk
of SConstruct and keeps related functionality together.

Change-Id: I9e1f2d606c3801131badad15f8f4419186bb7e1d
---
M SConstruct
A site_scons/gem5_scons/builders.py
2 files changed, 154 insertions(+), 97 deletions(-)



diff --git a/SConstruct b/SConstruct
index 20252e8..c1801f6 100755
--- a/SConstruct
+++ b/SConstruct
@@ -122,6 +122,7 @@
 from gem5_scons import Transform, error, warning, summarize_warnings
 from gem5_scons import EnvDefaults, MakeAction, MakeActionTool
 import gem5_scons
+from gem5_scons.builders import ConfigFile, AddLocalRPATH, SwitchingHeaders

 Export('MakeAction')

@@ -132,7 +133,8 @@
 ########################################################################

 main = Environment(tools=[
-        'default', 'git', EnvDefaults, MakeActionTool
+        'default', 'git', EnvDefaults, MakeActionTool,
+        ConfigFile, AddLocalRPATH, SwitchingHeaders,
     ])

 from gem5_scons.util import get_termcap
@@ -590,69 +592,6 @@
 sticky_vars.Add(BoolVariable('USE_EFENCE',
     'Link with Electric Fence malloc debugger', False))

-###################################################
-#
-# Define a SCons builder for configuration flag headers.
-#
-###################################################
-
-# This function generates a config header file that #defines the
-# variable symbol to the current variable setting (0 or 1).  The source
-# operands are the name of the variable and a Value node containing the
-# value of the variable.
-def build_config_file(target, source, env):
-    (variable, value) = [s.get_contents().decode('utf-8') for s in source]
-    with open(str(target[0].abspath), 'w') as f:
-        print('#define', variable, value, file=f)
-    return None
-
-# Combine the two functions into a scons Action object.
-config_action = MakeAction(build_config_file, Transform("CONFIG H", 2))
-
-# The emitter munges the source & target node lists to reflect what
-# we're really doing.
-def config_emitter(target, source, env):
-    # extract variable name from Builder arg
-    variable = str(target[0])
-    # True target is config header file
-    target = Dir('config').File(variable.lower() + '.hh')
-    val = env[variable]
-    if isinstance(val, bool):
-        # Force value to 0/1
-        val = int(val)
-    elif isinstance(val, str):
-        val = '"' + val + '"'
-
-    # Sources are variable name & value (packaged in SCons Value nodes)
-    return [target], [Value(variable), Value(val)]
-
-config_builder = Builder(emitter=config_emitter, action=config_action)
-
-main.Append(BUILDERS = { 'ConfigFile' : config_builder })
-
-def add_local_rpath(env, *targets):
-    '''Set up an RPATH for a library which lives in the build directory.
-
-    The construction environment variable BIN_RPATH_PREFIX should be set to
- the relative path of the build directory starting from the location of the
-    binary.'''
-    for target in targets:
-        target = env.Entry(target)
-        if not isinstance(target, SCons.Node.FS.Dir):
-            target = target.dir
-        relpath = os.path.relpath(target.abspath, env['BUILDDIR'])
-        components = [
-            '\\$$ORIGIN',
-            '${BIN_RPATH_PREFIX}',
-            relpath
-        ]
-        env.Append(RPATH=[env.Literal(os.path.join(*components))])
-
-if sys.platform != "darwin":
-    main.Append(LINKFLAGS=Split('-z origin'))
-
-main.AddMethod(add_local_rpath, 'AddLocalRPATH')
-
 # builds in ext are shared across all configs in the build root.
 ext_dir = Dir('#ext').abspath
 ext_build_dirs = []
@@ -668,39 +607,6 @@

 ###################################################
 #
-# 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.
-#
-###################################################
-
-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('#include "%s/%s/%s"' % (dp, subdir, fp), file=hdr)
-
-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)
-
-main.AddMethod(switching_headers, 'SwitchingHeaders')
-
-###################################################
-#
 # Define build environments for selected configurations.
 #
 ###################################################
diff --git a/site_scons/gem5_scons/builders.py b/site_scons/gem5_scons/builders.py
new file mode 100755
index 0000000..d0d86ae
--- /dev/null
+++ b/site_scons/gem5_scons/builders.py
@@ -0,0 +1,151 @@
+# Copyright (c) 2013, 2015-2020 ARM Limited
+# All rights reserved.
+#
+# The license below extends only to copyright in the software and shall
+# not be construed as granting a license to any other intellectual
+# property including but not limited to intellectual property relating
+# to a hardware implementation of the functionality of the software
+# licensed hereunder.  You may use the software subject to the license
+# terms below provided that you ensure that this notice is replicated
+# unmodified and in its entirety in all distributions of the software,
+# modified or unmodified, in source code or in binary form.
+#
+# Copyright (c) 2011 Advanced Micro Devices, Inc.
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# Copyright (c) 2004-2005 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
+import sys
+
+from os.path import join, split
+
+# SCons includes
+import SCons
+import SCons.Node
+import SCons.Node.FS
+import SCons.Script
+
+from gem5_scons import Transform, MakeAction
+
+###################################################
+#
+# Define a SCons builder for configuration flag headers.
+#
+###################################################
+
+def ConfigFile(env):
+    # This function generates a config header file that #defines the
+    # variable symbol to the current variable setting (0 or 1).  The source
+    # operands are the name of the variable and a Value node containing the
+    # value of the variable.
+    def build_config_file(target, source, env):
+ (variable, value) = [s.get_contents().decode('utf-8') for s in source]
+        with open(str(target[0].abspath), 'w') as f:
+            print('#define', variable, value, file=f)
+        return None
+
+    # Combine the two functions into a scons Action object.
+    config_action = MakeAction(build_config_file, Transform("CONFIG H", 2))
+
+    # The emitter munges the source & target node lists to reflect what
+    # we're really doing.
+    def config_emitter(target, source, env):
+        # extract variable name from Builder arg
+        variable = str(target[0])
+        # True target is config header file
+        target = env.Dir('config').File(variable.lower() + '.hh')
+        val = env[variable]
+        if isinstance(val, bool):
+            # Force value to 0/1
+            val = int(val)
+        elif isinstance(val, str):
+            val = '"' + val + '"'
+
+        # Sources are variable name & value (packaged in SCons Value nodes)
+        return [target], [env.Value(variable), env.Value(val)]
+
+ config_builder = env.Builder(emitter=config_emitter, action=config_action)
+
+    env.Append(BUILDERS = { 'ConfigFile' : config_builder })
+
+def AddLocalRPATH(env):
+    def add_local_rpath(env, *targets):
+ '''Set up an RPATH for a library which lives in the build directory.
+
+ The construction environment variable BIN_RPATH_PREFIX should be set + to the relative path of the build directory starting from the location
+        of the binary.'''
+        for target in targets:
+            target = env.Entry(target)
+            if not isinstance(target, SCons.Node.FS.Dir):
+                target = target.dir
+            relpath = os.path.relpath(target.abspath, env['BUILDDIR'])
+            components = [
+                '\\$$ORIGIN',
+                '${BIN_RPATH_PREFIX}',
+                relpath
+            ]
+            env.Append(RPATH=[env.Literal(os.path.join(*components))])
+
+    if sys.platform != "darwin":
+        env.Append(LINKFLAGS=env.Split('-z origin'))
+
+    env.AddMethod(add_local_rpath, 'AddLocalRPATH')
+
+###################################################
+#
+# 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.
+#
+###################################################
+
+def SwitchingHeaders(env):
+    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('#include "%s/%s/%s"' % (dp, subdir, fp), file=hdr)
+
+    switching_header_action = MakeAction(build_switching_header,
+                                         Transform('GENERATE'))
+
+    switching_header_builder = env.Builder(action=switching_header_action,
+                                           source_factory=env.Value,
+                                           single_source=True)
+
+    env.Append(BUILDERS = { 'SwitchingHeader': switching_header_builder })
+
+    def switching_headers(self, headers, source):
+        for header in headers:
+            self.SwitchingHeader(header, source)
+
+    env.AddMethod(switching_headers, 'SwitchingHeaders')

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/40969
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I9e1f2d606c3801131badad15f8f4419186bb7e1d
Gerrit-Change-Number: 40969
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <gabe.bl...@gmail.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to