Index: scons-2.0.1/engine/SCons/compat/__init__.py |
=================================================================== |
--- scons-2.0.1/engine/SCons/compat/__init__.py (revision 0) |
+++ scons-2.0.1/engine/SCons/compat/__init__.py (revision 0) |
@@ -0,0 +1,237 @@ |
+# |
+# Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 The SCons Foundation |
+# |
+# Permission is hereby granted, free of charge, to any person obtaining |
+# a copy of this software and associated documentation files (the |
+# "Software"), to deal in the Software without restriction, including |
+# without limitation the rights to use, copy, modify, merge, publish, |
+# distribute, sublicense, and/or sell copies of the Software, and to |
+# permit persons to whom the Software is furnished to do so, subject to |
+# the following conditions: |
+# |
+# The above copyright notice and this permission notice shall be included |
+# in all copies or substantial portions of the Software. |
+# |
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY |
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE |
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
+# |
+ |
+__doc__ = """ |
+SCons compatibility package for old Python versions |
+ |
+This subpackage holds modules that provide backwards-compatible |
+implementations of various things that we'd like to use in SCons but which |
+only show up in later versions of Python than the early, old version(s) |
+we still support. |
+ |
+Other code will not generally reference things in this package through |
+the SCons.compat namespace. The modules included here add things to |
+the builtins namespace or the global module list so that the rest |
+of our code can use the objects and names imported here regardless of |
+Python version. |
+ |
+Simply enough, things that go in the builtins name space come from |
+our _scons_builtins module. |
+ |
+The rest of the things here will be in individual compatibility modules |
+that are either: 1) suitably modified copies of the future modules that |
+we want to use; or 2) backwards compatible re-implementations of the |
+specific portions of a future module's API that we want to use. |
+ |
+GENERAL WARNINGS: Implementations of functions in the SCons.compat |
+modules are *NOT* guaranteed to be fully compliant with these functions in |
+later versions of Python. We are only concerned with adding functionality |
+that we actually use in SCons, so be wary if you lift this code for |
+other uses. (That said, making these more nearly the same as later, |
+official versions is still a desirable goal, we just don't need to be |
+obsessive about it.) |
+ |
+We name the compatibility modules with an initial '_scons_' (for example, |
+_scons_subprocess.py is our compatibility module for subprocess) so |
+that we can still try to import the real module name and fall back to |
+our compatibility module if we get an ImportError. The import_as() |
+function defined below loads the module as the "real" name (without the |
+'_scons'), after which all of the "import {module}" statements in the |
+rest of our code will find our pre-loaded compatibility module. |
+""" |
+ |
+__revision__ = "src/engine/SCons/compat/__init__.py 5134 2010/08/16 23:02:40 bdeegan" |
+ |
+import os |
+import sys |
+import imp # Use the "imp" module to protect imports from fixers. |
+ |
+def import_as(module, name): |
+ """ |
+ Imports the specified module (from our local directory) as the |
+ specified name, returning the loaded module object. |
+ """ |
+ dir = os.path.split(__file__)[0] |
+ return imp.load_module(name, *imp.find_module(module, [dir])) |
+ |
+def rename_module(new, old): |
+ """ |
+ Attempts to import the old module and load it under the new name. |
+ Used for purely cosmetic name changes in Python 3.x. |
+ """ |
+ try: |
+ sys.modules[new] = imp.load_module(old, *imp.find_module(old)) |
+ return True |
+ except ImportError: |
+ return False |
+ |
+ |
+rename_module('builtins', '__builtin__') |
+import _scons_builtins |
+ |
+ |
+try: |
+ import hashlib |
+except ImportError: |
+ # Pre-2.5 Python has no hashlib module. |
+ try: |
+ import_as('_scons_hashlib', 'hashlib') |
+ except ImportError: |
+ # If we failed importing our compatibility module, it probably |
+ # means this version of Python has no md5 module. Don't do |
+ # anything and let the higher layer discover this fact, so it |
+ # can fall back to using timestamp. |
+ pass |
+ |
+try: |
+ set |
+except NameError: |
+ # Pre-2.4 Python has no native set type |
+ import_as('_scons_sets', 'sets') |
+ import builtins, sets |
+ builtins.set = sets.Set |
+ |
+ |
+try: |
+ import collections |
+except ImportError: |
+ # Pre-2.4 Python has no collections module. |
+ import_as('_scons_collections', 'collections') |
+else: |
+ try: |
+ collections.UserDict |
+ except AttributeError: |
+ exec('from UserDict import UserDict as _UserDict') |
+ collections.UserDict = _UserDict |
+ del _UserDict |
+ try: |
+ collections.UserList |
+ except AttributeError: |
+ exec('from UserList import UserList as _UserList') |
+ collections.UserList = _UserList |
+ del _UserList |
+ try: |
+ collections.UserString |
+ except AttributeError: |
+ exec('from UserString import UserString as _UserString') |
+ collections.UserString = _UserString |
+ del _UserString |
+ |
+ |
+try: |
+ import io |
+except ImportError: |
+ # Pre-2.6 Python has no io module. |
+ import_as('_scons_io', 'io') |
+ |
+ |
+try: |
+ os.devnull |
+except AttributeError: |
+ # Pre-2.4 Python has no os.devnull attribute |
+ _names = sys.builtin_module_names |
+ if 'posix' in _names: |
+ os.devnull = '/dev/null' |
+ elif 'nt' in _names: |
+ os.devnull = 'nul' |
+ os.path.devnull = os.devnull |
+try: |
+ os.path.lexists |
+except AttributeError: |
+ # Pre-2.4 Python has no os.path.lexists function |
+ def lexists(path): |
+ return os.path.exists(path) or os.path.islink(path) |
+ os.path.lexists = lexists |
+ |
+ |
+# When we're using the '-3' option during regression tests, importing |
+# cPickle gives a warning no matter how it's done, so always use the |
+# real profile module, whether it's fast or not. |
+if os.environ.get('SCONS_HORRIBLE_REGRESSION_TEST_HACK') is None: |
+ # Not a regression test with '-3', so try to use faster version. |
+ # In 3.x, 'pickle' automatically loads the fast version if available. |
+ rename_module('pickle', 'cPickle') |
+ |
+ |
+# In 3.x, 'profile' automatically loads the fast version if available. |
+rename_module('profile', 'cProfile') |
+ |
+ |
+# Before Python 3.0, the 'queue' module was named 'Queue'. |
+rename_module('queue', 'Queue') |
+ |
+ |
+# Before Python 3.0, the 'winreg' module was named '_winreg' |
+rename_module('winreg', '_winreg') |
+ |
+ |
+try: |
+ import subprocess |
+except ImportError: |
+ # Pre-2.4 Python has no subprocess module. |
+ import_as('_scons_subprocess', 'subprocess') |
+ |
+try: |
+ sys.intern |
+except AttributeError: |
+ # Pre-2.6 Python has no sys.intern() function. |
+ import builtins |
+ try: |
+ sys.intern = builtins.intern |
+ except AttributeError: |
+ # Pre-2.x Python has no builtin intern() function. |
+ def intern(x): |
+ return x |
+ sys.intern = intern |
+ del intern |
+try: |
+ sys.maxsize |
+except AttributeError: |
+ # Pre-2.6 Python has no sys.maxsize attribute |
+ # Wrapping sys in () is silly, but protects it from 2to3 renames fixer |
+ sys.maxsize = (sys).maxint |
+ |
+ |
+if os.environ.get('SCONS_HORRIBLE_REGRESSION_TEST_HACK') is not None: |
+ # We can't apply the 'callable' fixer until the floor is 2.6, but the |
+ # '-3' option to Python 2.6 and 2.7 generates almost ten thousand |
+ # warnings. This hack allows us to run regression tests with the '-3' |
+ # option by replacing the callable() built-in function with a hack |
+ # that performs the same function but doesn't generate the warning. |
+ # Note that this hack is ONLY intended to be used for regression |
+ # testing, and should NEVER be used for real runs. |
+ from types import ClassType |
+ def callable(obj): |
+ if hasattr(obj, '__call__'): return True |
+ if isinstance(obj, (ClassType, type)): return True |
+ return False |
+ import builtins |
+ builtins.callable = callable |
+ del callable |
+ |
+ |
+# Local Variables: |
+# tab-width:4 |
+# indent-tabs-mode:nil |
+# End: |
+# vim: set expandtab tabstop=4 shiftwidth=4: |
Property changes on: scons-2.0.1/engine/SCons/compat/__init__.py |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |