diff options
Diffstat (limited to 'engine/SCons/Platform/__init__.py')
| -rw-r--r-- | engine/SCons/Platform/__init__.py | 79 | 
1 files changed, 54 insertions, 25 deletions
diff --git a/engine/SCons/Platform/__init__.py b/engine/SCons/Platform/__init__.py index 83c68ee..66bff49 100644 --- a/engine/SCons/Platform/__init__.py +++ b/engine/SCons/Platform/__init__.py @@ -20,7 +20,7 @@ their own platform definition.  """  # -# Copyright (c) 2001 - 2017 The SCons Foundation +# Copyright (c) 2001 - 2019 The SCons Foundation  #  # Permission is hereby granted, free of charge, to any person obtaining  # a copy of this software and associated documentation files (the @@ -43,11 +43,11 @@ their own platform definition.  #  from __future__ import print_function -__revision__ = "src/engine/SCons/Platform/__init__.py 74b2c53bc42290e911b334a6b44f187da698a668 2017/11/14 13:16:53 bdbaddog" +__revision__ = "src/engine/SCons/Platform/__init__.py 72ae09dc35ac2626f8ff711d8c4b30b6138e08e3 2019-08-08 14:50:06 bdeegan"  import SCons.compat -import imp +import importlib  import os  import sys  import tempfile @@ -87,6 +87,7 @@ def platform_default():      else:          return sys.platform +  def platform_module(name = platform_default()):      """Return the imported module for the platform. @@ -100,13 +101,8 @@ def platform_module(name = platform_default()):              eval(full_name)          else:              try: -                file, path, desc = imp.find_module(name, -                                        sys.modules['SCons.Platform'].__path__) -                try: -                    mod = imp.load_module(full_name, file, path, desc) -                finally: -                    if file: -                        file.close() +                # the specific platform module is a relative import +                mod = importlib.import_module("." + name, __name__)              except ImportError:                  try:                      import zipimport @@ -117,11 +113,13 @@ def platform_module(name = platform_default()):              setattr(SCons.Platform, name, mod)      return sys.modules[full_name] +  def DefaultToolList(platform, env):      """Select a default tool list for the specified platform.      """      return SCons.Tool.tool_list(platform, env) +  class PlatformSpec(object):      def __init__(self, name, generate):          self.name = name @@ -133,6 +131,7 @@ class PlatformSpec(object):      def __str__(self):          return self.name +  class TempFileMunge(object):      """A callable class.  You can set an Environment variable to this,      then call it with a string argument, then it will perform temporary @@ -140,15 +139,20 @@ class TempFileMunge(object):      line limitation.      Example usage: -    env["TEMPFILE"] = TempFileMunge -    env["LINKCOM"] = "${TEMPFILE('$LINK $TARGET $SOURCES','$LINKCOMSTR')}" +        env["TEMPFILE"] = TempFileMunge +        env["LINKCOM"] = "${TEMPFILE('$LINK $TARGET $SOURCES','$LINKCOMSTR')}"      By default, the name of the temporary file used begins with a -    prefix of '@'.  This may be configred for other tool chains by -    setting '$TEMPFILEPREFIX'. - -    env["TEMPFILEPREFIX"] = '-@'        # diab compiler -    env["TEMPFILEPREFIX"] = '-via'      # arm tool chain +    prefix of '@'.  This may be configured for other tool chains by +    setting '$TEMPFILEPREFIX': +        env["TEMPFILEPREFIX"] = '-@'        # diab compiler +        env["TEMPFILEPREFIX"] = '-via'      # arm tool chain +        env["TEMPFILEPREFIX"] = ''          # (the empty string) PC Lint + +    You can configure the extension of the temporary file through the +    TEMPFILESUFFIX variable, which defaults to '.lnk' (see comments +    in the code below): +        env["TEMPFILESUFFIX"] = '.lnt'   # PC Lint      """      def __init__(self, cmd, cmdstr = None):          self.cmd = cmd @@ -185,21 +189,26 @@ class TempFileMunge(object):          node = target[0] if SCons.Util.is_List(target) else target          cmdlist = getattr(node.attributes, 'tempfile_cmdlist', None) \                      if node is not None else None -        if cmdlist is not None : +        if cmdlist is not None:              return cmdlist          # We do a normpath because mktemp() has what appears to be          # a bug in Windows that will use a forward slash as a path -        # delimiter.  Windows's link mistakes that for a command line +        # delimiter.  Windows' link mistakes that for a command line          # switch and barfs.          # -        # We use the .lnk suffix for the benefit of the Phar Lap +        # Default to the .lnk suffix for the benefit of the Phar Lap          # linkloc linker, which likes to append an .lnk suffix if          # none is given. -        (fd, tmp) = tempfile.mkstemp('.lnk', text=True) +        if env.has_key('TEMPFILESUFFIX'): +            suffix = env.subst('$TEMPFILESUFFIX') +        else: +            suffix = '.lnk' + +        fd, tmp = tempfile.mkstemp(suffix, text=True)          native_tmp = SCons.Util.get_native_path(os.path.normpath(tmp)) -        if env.get('SHELL',None) == 'sh': +        if env.get('SHELL', None) == 'sh':              # The sh shell will try to escape the backslashes in the              # path, so unescape them.              native_tmp = native_tmp.replace('\\', r'\\\\') @@ -217,8 +226,10 @@ class TempFileMunge(object):              prefix = '@'          args = list(map(SCons.Subst.quote_spaces, cmd[1:])) -        os.write(fd, bytearray(" ".join(args) + "\n",'utf-8')) +        join_char = env.get('TEMPFILEARGJOIN',' ') +        os.write(fd, bytearray(join_char.join(args) + "\n",'utf-8'))          os.close(fd) +          # XXX Using the SCons.Action.print_actions value directly          # like this is bogus, but expedient.  This class should          # really be rewritten as an Action that defines the @@ -239,8 +250,9 @@ class TempFileMunge(object):                                 source) if self.cmdstr is not None else ''              # Print our message only if XXXCOMSTR returns an empty string              if len(cmdstr) == 0 : -                print("Using tempfile "+native_tmp+" for command line:\n"+ -                      str(cmd[0]) + " " + " ".join(args)) +                cmdstr = ("Using tempfile "+native_tmp+" for command line:\n"+ +                    str(cmd[0]) + " " + " ".join(args)) +                self._print_cmd_str(target, source, env, cmdstr)          # Store the temporary file command list into the target Node.attributes          # to avoid creating two temporary files one for print and one for execute. @@ -252,6 +264,23 @@ class TempFileMunge(object):                  pass          return cmdlist +    def _print_cmd_str(self, target, source, env, cmdstr): +        # check if the user has specified a cmd line print function +        print_func = None +        try: +            get = env.get +        except AttributeError: +            pass +        else: +            print_func = get('PRINT_CMD_LINE_FUNC') + +        # use the default action cmd line print if user did not supply one +        if not print_func: +            action = SCons.Action._ActionAction() +            action.print_cmd_line(cmdstr, target, source, env) +        else: +            print_func(cmdstr, target, source, env) +  def Platform(name = platform_default()):      """Select a canned Platform specification.  | 
