__init__.py
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:8k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. """SCons.Platform
  2. SCons platform selection.
  3. This looks for modules that define a callable object that can modify a
  4. construction environment as appropriate for a given platform.
  5. Note that we take a more simplistic view of "platform" than Python does.
  6. We're looking for a single string that determines a set of
  7. tool-independent variables with which to initialize a construction
  8. environment.  Consequently, we'll examine both sys.platform and os.name
  9. (and anything else that might come in to play) in order to return some
  10. specification which is unique enough for our purposes.
  11. Note that because this subsysem just *selects* a callable that can
  12. modify a construction environment, it's possible for people to define
  13. their own "platform specification" in an arbitrary callable function.
  14. No one needs to use or tie in to this subsystem in order to roll
  15. their own platform definition.
  16. """
  17. #
  18. # Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 The SCons Foundation
  19. # Permission is hereby granted, free of charge, to any person obtaining
  20. # a copy of this software and associated documentation files (the
  21. # "Software"), to deal in the Software without restriction, including
  22. # without limitation the rights to use, copy, modify, merge, publish,
  23. # distribute, sublicense, and/or sell copies of the Software, and to
  24. # permit persons to whom the Software is furnished to do so, subject to
  25. # the following conditions:
  26. #
  27. # The above copyright notice and this permission notice shall be included
  28. # in all copies or substantial portions of the Software.
  29. #
  30. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
  31. # KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  32. # WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  33. # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  34. # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  35. # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  36. # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  37. #
  38. __revision__ = "src/engine/SCons/Platform/__init__.py 3057 2008/06/09 22:21:00 knight"
  39. import imp
  40. import os
  41. import string
  42. import sys
  43. import tempfile
  44. import SCons.Errors
  45. import SCons.Tool
  46. def platform_default():
  47.     """Return the platform string for our execution environment.
  48.     The returned value should map to one of the SCons/Platform/*.py
  49.     files.  Since we're architecture independent, though, we don't
  50.     care about the machine architecture.
  51.     """
  52.     osname = os.name
  53.     if osname == 'java':
  54.         osname = os._osType
  55.     if osname == 'posix':
  56.         if sys.platform == 'cygwin':
  57.             return 'cygwin'
  58.         elif string.find(sys.platform, 'irix') != -1:
  59.             return 'irix'
  60.         elif string.find(sys.platform, 'sunos') != -1:
  61.             return 'sunos'
  62.         elif string.find(sys.platform, 'hp-ux') != -1:
  63.             return 'hpux'
  64.         elif string.find(sys.platform, 'aix') != -1:
  65.             return 'aix'
  66.         elif string.find(sys.platform, 'darwin') != -1:
  67.             return 'darwin'
  68.         else:
  69.             return 'posix'
  70.     elif os.name == 'os2':
  71.         return 'os2'
  72.     else:
  73.         return sys.platform
  74. def platform_module(name = platform_default()):
  75.     """Return the imported module for the platform.
  76.     This looks for a module name that matches the specified argument.
  77.     If the name is unspecified, we fetch the appropriate default for
  78.     our execution environment.
  79.     """
  80.     full_name = 'SCons.Platform.' + name
  81.     if not sys.modules.has_key(full_name):
  82.         if os.name == 'java':
  83.             eval(full_name)
  84.         else:
  85.             try:
  86.                 file, path, desc = imp.find_module(name,
  87.                                         sys.modules['SCons.Platform'].__path__)
  88.                 try:
  89.                     mod = imp.load_module(full_name, file, path, desc)
  90.                 finally:
  91.                     if file:
  92.                         file.close()
  93.             except ImportError:
  94.                 try:
  95.                     import zipimport
  96.                     importer = zipimport.zipimporter( sys.modules['SCons.Platform'].__path__[0] )
  97.                     mod = importer.load_module(full_name)
  98.                 except ImportError:
  99.                     raise SCons.Errors.UserError, "No platform named '%s'" % name
  100.             setattr(SCons.Platform, name, mod)
  101.     return sys.modules[full_name]
  102. def DefaultToolList(platform, env):
  103.     """Select a default tool list for the specified platform.
  104.     """
  105.     return SCons.Tool.tool_list(platform, env)
  106. class PlatformSpec:
  107.     def __init__(self, name):
  108.         self.name = name
  109.     def __str__(self):
  110.         return self.name
  111.         
  112. class TempFileMunge:
  113.     """A callable class.  You can set an Environment variable to this,
  114.     then call it with a string argument, then it will perform temporary
  115.     file substitution on it.  This is used to circumvent the long command
  116.     line limitation.
  117.     Example usage:
  118.     env["TEMPFILE"] = TempFileMunge
  119.     env["LINKCOM"] = "${TEMPFILE('$LINK $TARGET $SOURCES')}"
  120.     By default, the name of the temporary file used begins with a
  121.     prefix of '@'.  This may be configred for other tool chains by
  122.     setting '$TEMPFILEPREFIX'.
  123.     env["TEMPFILEPREFIX"] = '-@'        # diab compiler
  124.     env["TEMPFILEPREFIX"] = '-via'      # arm tool chain
  125.     """
  126.     def __init__(self, cmd):
  127.         self.cmd = cmd
  128.     def __call__(self, target, source, env, for_signature):
  129.         if for_signature:
  130.             return self.cmd
  131.         cmd = env.subst_list(self.cmd, 0, target, source)[0]
  132.         try:
  133.             maxline = int(env.subst('$MAXLINELENGTH'))
  134.         except ValueError:
  135.             maxline = 2048
  136.         if (reduce(lambda x, y: x + len(y), cmd, 0) + len(cmd)) <= maxline:
  137.             return self.cmd
  138.         # We do a normpath because mktemp() has what appears to be
  139.         # a bug in Windows that will use a forward slash as a path
  140.         # delimiter.  Windows's link mistakes that for a command line
  141.         # switch and barfs.
  142.         #
  143.         # We use the .lnk suffix for the benefit of the Phar Lap
  144.         # linkloc linker, which likes to append an .lnk suffix if
  145.         # none is given.
  146.         tmp = os.path.normpath(tempfile.mktemp('.lnk'))
  147.         native_tmp = SCons.Util.get_native_path(tmp)
  148.         if env['SHELL'] and env['SHELL'] == 'sh':
  149.             # The sh shell will try to escape the backslashes in the
  150.             # path, so unescape them.
  151.             native_tmp = string.replace(native_tmp, '\', r'\\')
  152.             # In Cygwin, we want to use rm to delete the temporary
  153.             # file, because del does not exist in the sh shell.
  154.             rm = env.Detect('rm') or 'del'
  155.         else:
  156.             # Don't use 'rm' if the shell is not sh, because rm won't
  157.             # work with the Windows shells (cmd.exe or command.com) or
  158.             # Windows path names.
  159.             rm = 'del'
  160.         prefix = env.subst('$TEMPFILEPREFIX')
  161.         if not prefix:
  162.             prefix = '@'
  163.         args = map(SCons.Subst.quote_spaces, cmd[1:])
  164.         open(tmp, 'w').write(string.join(args, " ") + "n")
  165.         # XXX Using the SCons.Action.print_actions value directly
  166.         # like this is bogus, but expedient.  This class should
  167.         # really be rewritten as an Action that defines the
  168.         # __call__() and strfunction() methods and lets the
  169.         # normal action-execution logic handle whether or not to
  170.         # print/execute the action.  The problem, though, is all
  171.         # of that is decided before we execute this method as
  172.         # part of expanding the $TEMPFILE construction variable.
  173.         # Consequently, refactoring this will have to wait until
  174.         # we get more flexible with allowing Actions to exist
  175.         # independently and get strung together arbitrarily like
  176.         # Ant tasks.  In the meantime, it's going to be more
  177.         # user-friendly to not let obsession with architectural
  178.         # purity get in the way of just being helpful, so we'll
  179.         # reach into SCons.Action directly.
  180.         if SCons.Action.print_actions:
  181.             print("Using tempfile "+native_tmp+" for command line:n"+
  182.                   str(cmd[0]) + " " + string.join(args," "))
  183.         return [ cmd[0], prefix + native_tmp + 'n' + rm, native_tmp ]
  184.     
  185. def Platform(name = platform_default()):
  186.     """Select a canned Platform specification.
  187.     """
  188.     module = platform_module(name)
  189.     spec = PlatformSpec(name)
  190.     spec.__call__ = module.generate
  191.     return spec