diff options
| author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2015-09-28 18:23:34 +0200 | 
|---|---|---|
| committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2015-09-28 18:23:34 +0200 | 
| commit | 72c39ad485d174c2e8e1fef34b8e9e392a94458a (patch) | |
| tree | c61b2af2b3861f6bffb4955e0733687c337cb35a | |
| parent | daa63b77a7e2963e59a238e0dca7ceffce91ee99 (diff) | |
Imported Upstream version 2.4.0upstream/2.4.0
204 files changed, 1421 insertions, 794 deletions
diff --git a/CHANGES.txt b/CHANGES.txt index b8716f7..5f96a23 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -4,6 +4,18 @@                              Change Log +RELEASE 2.4.0 - Mon, 21 Sep 2015 09:07:51 -0700 + +  From Dirk Baechle: +    - Switched several core classes to use "slots", to +      reduce the overall memory consumption in large +      projects (fixes #2180, #2178, #2198) +    - Memoizer counting uses decorators now, instead of +      the old metaclasses approach. + +  From Andrew Featherstone +    - Fixed typo in SWIGPATH description +  RELEASE 2.3.6 - Mon, 31 Jul 2015 14:35:03 -0700    From Rob Smith: @@ -5884,4 +5896,4 @@ A brief overview of important functionality available in release 0.01:  Copyright (c) 2001 - 2015 The SCons Foundation -src/CHANGES.txt rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog +src/CHANGES.txt rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog @@ -1,6 +1,6 @@  Metadata-Version: 1.0  Name: scons -Version: 2.3.6 +Version: 2.4.0  Summary: Open Source next-generation build tool.  Home-page: http://www.scons.org/  Author: Steven Knight @@ -2,7 +2,7 @@                   SCons - a software construction tool -                         Version 2.3.6 +                         Version 2.4.0  This is SCons, a tool for building software (and other files).  SCons is @@ -28,7 +28,8 @@ the latest version by checking the SCons download page at:  EXECUTION REQUIREMENTS  ====================== -Running SCons requires Python version 2.4 or later.  There should be +Running SCons requires Python version 2.7.*.  Currently it does not  +run on the Python 3.x release.  There should be  no other dependencies or requirements to run SCons.  (There is, however,  an additional requirement to *install* SCons from this particular  package; see the next section.) @@ -56,7 +57,7 @@ provided Python-standard setup script as follows:  By default, the above command will do the following: -    --  Install the version-numbered "scons-2.3.6" and "sconsign-2.3.6" +    --  Install the version-numbered "scons-2.4.0" and "sconsign-2.4.0"          scripts in the default system script directory (/usr/bin or          C:\Python*\Scripts, for example).  This can be disabled by          specifying the "--no-version-script" option on the command @@ -70,17 +71,17 @@ By default, the above command will do the following:          making it the default on your system.          On UNIX or Linux systems, you can have the "scons" and "sconsign" -        scripts be hard links or symbolic links to the "scons-2.3.6" and -        "sconsign-2.3.6" scripts by specifying the "--hardlink-scons" +        scripts be hard links or symbolic links to the "scons-2.4.0" and +        "sconsign-2.4.0" scripts by specifying the "--hardlink-scons"          or "--symlink-scons" options on the command line. -    --  Install "scons-2.3.6.bat" and "scons.bat" wrapper scripts in the +    --  Install "scons-2.4.0.bat" and "scons.bat" wrapper scripts in the          Python prefix directory on Windows (C:\Python*, for example).          This can be disabled by specifying the "--no-install-bat" option          on the command line.          On UNIX or Linux systems, the "--install-bat" option may be -        specified to have "scons-2.3.6.bat" and "scons.bat" files +        specified to have "scons-2.4.0.bat" and "scons.bat" files          installed in the default system script directory, which is useful          if you want to install SCons in a shared file system directory          that can be used to execute SCons from both UNIX/Linux and @@ -88,7 +89,7 @@ By default, the above command will do the following:      --  Install the SCons build engine (a Python module) in an          appropriate version-numbered SCons library directory -        (/usr/lib/scons-2.3.6 or C:\Python*\scons-2.3.6, for example). +        (/usr/lib/scons-2.4.0 or C:\Python*\scons-2.4.0, for example).          See below for more options related to installing the build          engine library. @@ -224,20 +225,26 @@ Check the SCons web site at:  AUTHOR INFO  =========== - -Steven Knight -knight at baldmt dot com -http://www.baldmt.com/~knight/ - -With plenty of help from the SCons Development team: -        Chad Austin -        Charles Crain -        Steve Leblanc -        Greg Noel -        Gary Oberbrunner -        Anthony Roach -        Greg Spencer -        Christoph Wiedemann +SCons was originally written by Steven Knight, knight at baldmt dot com. +Since around 2010 it has been maintained by the SCons +development team, co-managed by Bill Deegan and Gary Oberbrunner, with +many contributors, including but not at all limited to: + +- Chad Austin +- Dirk Baechle +- Charles Crain +- William Deegan +- Steve Leblanc +- Rob Managan +- Greg Noel +- Gary Oberbrunner +- Anthony Roach +- Greg Spencer +- Tom Tanner +- Anatoly Techtonik +- Christoph Wiedemann +- Russel Winder + +\... and many others.  Copyright (c) 2001 - 2015 The SCons Foundation -src/README.txt rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog diff --git a/RELEASE.txt b/RELEASE.txt index fd60068..88d176e 100644 --- a/RELEASE.txt +++ b/RELEASE.txt @@ -1,73 +1,48 @@ -  A new SCons checkpoint release, 2.3.6, is now available +  A new SCons release, 2.4.0, is now available    on the SCons download page:            http://www.scons.org/download.php -  XXX The primary purpose of this release ... XXX - -  A SCons "checkpoint release" is intended to provide early access to -  new features so they can be tested in the field before being released -  for adoption by other software distributions. - -  Note that a checkpoint release is developed using the same test-driven -  development methodology as all SCons releases.  Existing SCons -  functionality should all work as it does in previous releases (except -  for any changes identified in the release notes) and early adopters -  should be able to use a checkpoint release safely for production work -  with existing SConscript files.  If not, it represents not only a bug -  in SCons but also a hole in the regression test suite, and we want to -  hear about it. - -  New features may be more lightly tested than in past releases, -  especially as concerns their interaction with all of the other -  functionality in SCons.  We are especially interested in hearing bug -  reports about new functionality. - -  We do not recommend that downstream distributions (Debian, Fedora, -  etc.) package a checkpoint release, mainly to avoid confusing the -  "public" release numbering with the long checkpoint release names. - -  Here is a summary of the changes since 1.3.0: +  Here is a summary of the changes since 2.3.6:    NEW FUNCTIONALITY -    - List new features (presumably why a checkpoint is being released) +    - None    DEPRECATED FUNCTIONALITY -    - List anything that's been deprecated since the last release +    - None    CHANGED/ENHANCED EXISTING FUNCTIONALITY -    - List modifications to existing features, where the previous behavior -      wouldn't actually be considered a bug +    - None    FIXES -    - List fixes of outright bugs +    - None    IMPROVEMENTS -    - List improvements that wouldn't be visible to the user in the -      documentation:  performance improvements (describe the circumstances -      under which they would be observed), or major code cleanups +    - Switched several core classes to use "slots", to +      reduce the overall memory consumption in large +      projects (fixes #2180, #2178, #2198) +    - Memoizer counting uses decorators now, instead of +      the old metaclasses approach.    PACKAGING -    - List changes in the way SCons is packaged and/or released +    - Added new amd64 windows 64 bit installer    DOCUMENTATION -    - List any significant changes to the documentation (not individual -      typo fixes, even if they're mentioned in src/CHANGES.txt to give -      the contributor credit) +    - None    DEVELOPMENT -    - List visible changes in the way SCons is developed +    - None -  Thanks to CURLY, LARRY, and MOE for their contributions to this release. +  Thanks to Dirk Baechle, Andrew Featherstone for their contributions to this release.    Contributors are listed alphabetically by their last name.  Copyright (c) 2001 - 2015 The SCons Foundation -src/RELEASE.txt rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog +src/RELEASE.txt rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog diff --git a/engine/SCons/Action.py b/engine/SCons/Action.py index 11fd5f7..7acde46 100644 --- a/engine/SCons/Action.py +++ b/engine/SCons/Action.py @@ -97,7 +97,7 @@ way for wrapping up the functions.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Action.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Action.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import dis  import os @@ -540,7 +540,7 @@ class _ActionAction(ActionBase):          if chdir:              save_cwd = os.getcwd()              try: -                chdir = str(chdir.abspath) +                chdir = str(chdir.get_abspath())              except AttributeError:                  if not is_String(chdir):                      if executor: diff --git a/engine/SCons/Builder.py b/engine/SCons/Builder.py index 9231d94..4c68d5c 100644 --- a/engine/SCons/Builder.py +++ b/engine/SCons/Builder.py @@ -97,7 +97,7 @@ There are the following methods for internal use within this module:  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Builder.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Builder.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import collections @@ -352,11 +352,6 @@ class BuilderBase(object):      nodes (files) from input nodes (files).      """ -    if SCons.Memoize.use_memoizer: -        __metaclass__ = SCons.Memoize.Memoized_Metaclass - -    memoizer_counters = [] -      def __init__(self,  action = None,                          prefix = '',                          suffix = '', @@ -758,8 +753,7 @@ class BuilderBase(object):      def _get_src_builders_key(self, env):          return id(env) -    memoizer_counters.append(SCons.Memoize.CountDict('get_src_builders', _get_src_builders_key)) - +    @SCons.Memoize.CountDictCall(_get_src_builders_key)      def get_src_builders(self, env):          """          Returns the list of source Builders for this Builder. @@ -795,8 +789,7 @@ class BuilderBase(object):      def _subst_src_suffixes_key(self, env):          return id(env) -    memoizer_counters.append(SCons.Memoize.CountDict('subst_src_suffixes', _subst_src_suffixes_key)) - +    @SCons.Memoize.CountDictCall(_subst_src_suffixes_key)      def subst_src_suffixes(self, env):          """          The suffix list may contain construction variable expansions, diff --git a/engine/SCons/CacheDir.py b/engine/SCons/CacheDir.py index 1e100c1..9e3ec6b 100644 --- a/engine/SCons/CacheDir.py +++ b/engine/SCons/CacheDir.py @@ -21,7 +21,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/CacheDir.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/CacheDir.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __doc__ = """  CacheDir support @@ -50,11 +50,11 @@ def CacheRetrieveFunc(target, source, env):      cd.CacheDebug('CacheRetrieve(%s):  retrieving from %s\n', t, cachefile)      if SCons.Action.execute_actions:          if fs.islink(cachefile): -            fs.symlink(fs.readlink(cachefile), t.path) +            fs.symlink(fs.readlink(cachefile), t.get_internal_path())          else: -            env.copy_from_cache(cachefile, t.path) +            env.copy_from_cache(cachefile, t.get_internal_path())          st = fs.stat(cachefile) -        fs.chmod(t.path, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE) +        fs.chmod(t.get_internal_path(), stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)      return 0  def CacheRetrieveString(target, source, env): @@ -63,7 +63,7 @@ def CacheRetrieveString(target, source, env):      cd = env.get_CacheDir()      cachedir, cachefile = cd.cachepath(t)      if t.fs.exists(cachefile): -        return "Retrieved `%s' from cache" % t.path +        return "Retrieved `%s' from cache" % t.get_internal_path()      return None  CacheRetrieve = SCons.Action.Action(CacheRetrieveFunc, CacheRetrieveString) @@ -106,12 +106,12 @@ def CachePushFunc(target, source, env):                  raise SCons.Errors.EnvironmentError(msg)      try: -        if fs.islink(t.path): -            fs.symlink(fs.readlink(t.path), tempfile) +        if fs.islink(t.get_internal_path()): +            fs.symlink(fs.readlink(t.get_internal_path()), tempfile)          else: -            fs.copy2(t.path, tempfile) +            fs.copy2(t.get_internal_path(), tempfile)          fs.rename(tempfile, cachefile) -        st = fs.stat(t.path) +        st = fs.stat(t.get_internal_path())          fs.chmod(cachefile, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE)      except EnvironmentError:          # It's possible someone else tried writing the file at the diff --git a/engine/SCons/Debug.py b/engine/SCons/Debug.py index 8adf7ca..0aa077d 100644 --- a/engine/SCons/Debug.py +++ b/engine/SCons/Debug.py @@ -28,12 +28,13 @@ needed by most users.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Debug.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Debug.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os  import sys  import time  import weakref +import inspect  # Global variable that gets set to 'True' by the Main script,  # when the creation of class instances should get tracked. @@ -46,7 +47,12 @@ def logInstanceCreation(instance, name=None):          name = instance.__class__.__name__      if name not in tracked_classes:          tracked_classes[name] = [] -    tracked_classes[name].append(weakref.ref(instance)) +    if hasattr(instance, '__dict__'): +        tracked_classes[name].append(weakref.ref(instance)) +    else: +        # weakref doesn't seem to work when the instance +        # contains only slots... +        tracked_classes[name].append(instance)  def string_to_classes(s):      if s == '*': @@ -66,7 +72,10 @@ def listLoggedInstances(classes, file=sys.stdout):      for classname in string_to_classes(classes):          file.write('\n%s:\n' % classname)          for ref in tracked_classes[classname]: -            obj = ref() +            if inspect.isclass(ref): +                obj = ref() +            else: +                obj = ref              if obj is not None:                  file.write('    %s\n' % repr(obj)) diff --git a/engine/SCons/Defaults.py b/engine/SCons/Defaults.py index 8a3fbb6..b4cbb9a 100644 --- a/engine/SCons/Defaults.py +++ b/engine/SCons/Defaults.py @@ -33,7 +33,7 @@ from distutils.msvccompiler.  #  from __future__ import division -__revision__ = "src/engine/SCons/Defaults.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Defaults.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os diff --git a/engine/SCons/Environment.py b/engine/SCons/Environment.py index f5f9b6a..865c821 100644 --- a/engine/SCons/Environment.py +++ b/engine/SCons/Environment.py @@ -31,7 +31,7 @@ Environment  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Environment.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Environment.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import copy @@ -365,9 +365,6 @@ class SubstitutionEnvironment(object):      class actually becomes useful.)      """ -    if SCons.Memoize.use_memoizer: -        __metaclass__ = SCons.Memoize.Memoized_Metaclass -      def __init__(self, **kw):          """Initialization of an underlying SubstitutionEnvironment class.          """ @@ -902,8 +899,6 @@ class Base(SubstitutionEnvironment):      Environment.      """ -    memoizer_counters = [] -      #######################################################################      # This is THE class for interacting with the SCons build engine,      # and it contains a lot of stuff, so we're going to try to keep this @@ -1071,8 +1066,7 @@ class Base(SubstitutionEnvironment):              factory = getattr(self.fs, name)          return factory -    memoizer_counters.append(SCons.Memoize.CountValue('_gsm')) - +    @SCons.Memoize.CountMethodCall      def _gsm(self):          try:              return self._memo['_gsm'] @@ -1802,7 +1796,7 @@ class Base(SubstitutionEnvironment):          self.Replace(**kw)      def _find_toolpath_dir(self, tp): -        return self.fs.Dir(self.subst(tp)).srcnode().abspath +        return self.fs.Dir(self.subst(tp)).srcnode().get_abspath()      def Tool(self, tool, toolpath=None, **kw):          if SCons.Util.is_String(tool): diff --git a/engine/SCons/Errors.py b/engine/SCons/Errors.py index 585c6d0..998a70d 100644 --- a/engine/SCons/Errors.py +++ b/engine/SCons/Errors.py @@ -28,7 +28,7 @@ and user errors in SCons.  """ -__revision__ = "src/engine/SCons/Errors.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Errors.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Util diff --git a/engine/SCons/Executor.py b/engine/SCons/Executor.py index 062bc8d..3211fd1 100644 --- a/engine/SCons/Executor.py +++ b/engine/SCons/Executor.py @@ -27,7 +27,7 @@ Nodes.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Executor.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Executor.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import collections @@ -40,6 +40,10 @@ import SCons.Memoize  class Batch(object):      """Remembers exact association between targets      and sources of executor.""" +     +    __slots__ = ('targets', +                 'sources') +          def __init__(self, targets=[], sources=[]):          self.targets = targets          self.sources = sources @@ -109,6 +113,48 @@ def rfile(node):          return rfile() +def execute_nothing(obj, target, kw): +    return 0 + +def execute_action_list(obj, target, kw): +    """Actually execute the action list.""" +    env = obj.get_build_env() +    kw = obj.get_kw(kw) +    status = 0 +    for act in obj.get_action_list(): +        #args = (self.get_all_targets(), self.get_all_sources(), env) +        args = ([], [], env) +        status = act(*args, **kw) +        if isinstance(status, SCons.Errors.BuildError): +            status.executor = obj +            raise status +        elif status: +            msg = "Error %s" % status +            raise SCons.Errors.BuildError( +                errstr=msg,  +                node=obj.batches[0].targets, +                executor=obj,  +                action=act) +    return status + +_do_execute_map = {0 : execute_nothing, +                   1 : execute_action_list} + + +def execute_actions_str(obj): +    env = obj.get_build_env() +    return "\n".join([action.genstring(obj.get_all_targets(), +                                       obj.get_all_sources(), +                                       env) +                      for action in obj.get_action_list()]) + +def execute_null_str(obj): +    return '' + +_execute_str_map = {0 : execute_null_str, +                    1 : execute_actions_str} + +  class Executor(object):      """A class for controlling instances of executing an action. @@ -117,10 +163,21 @@ class Executor(object):      and sources for later processing as needed.      """ -    if SCons.Memoize.use_memoizer: -        __metaclass__ = SCons.Memoize.Memoized_Metaclass - -    memoizer_counters = [] +    __slots__ = ('pre_actions', +                 'post_actions', +                 'env', +                 'overridelist', +                 'batches', +                 'builder_kw', +                 '_memo', +                 'lvars', +                 '_changed_sources_list', +                 '_changed_targets_list', +                 '_unchanged_sources_list', +                 '_unchanged_targets_list', +                 'action_list', +                 '_do_execute', +                 '_execute_str')      def __init__(self, action, env=None, overridelist=[{}],                   targets=[], sources=[], builder_kw={}): @@ -135,6 +192,8 @@ class Executor(object):          else:              self.batches = []          self.builder_kw = builder_kw +        self._do_execute = 1 +        self._execute_str = 1          self._memo = {}      def get_lvars(self): @@ -284,8 +343,7 @@ class Executor(object):              result.extend(target.side_effects)          return result -    memoizer_counters.append(SCons.Memoize.CountValue('get_build_env')) - +    @SCons.Memoize.CountMethodCall      def get_build_env(self):          """Fetch or create the appropriate build Environment          for this Executor. @@ -330,36 +388,12 @@ class Executor(object):          result['executor'] = self          return result -    def do_nothing(self, target, kw): -        return 0 - -    def do_execute(self, target, kw): -        """Actually execute the action list.""" -        env = self.get_build_env() -        kw = self.get_kw(kw) -        status = 0 -        for act in self.get_action_list(): -            #args = (self.get_all_targets(), self.get_all_sources(), env) -            args = ([], [], env) -            status = act(*args, **kw) -            if isinstance(status, SCons.Errors.BuildError): -                status.executor = self -                raise status -            elif status: -                msg = "Error %s" % status -                raise SCons.Errors.BuildError( -                    errstr=msg,  -                    node=self.batches[0].targets, -                    executor=self,  -                    action=act) -        return status -      # use extra indirection because with new-style objects (Python 2.2      # and above) we can't override special methods, and nullify() needs      # to be able to do this.      def __call__(self, target, **kw): -        return self.do_execute(target, kw) +        return _do_execute_map[self._do_execute](self, target, kw)      def cleanup(self):          self._memo = {} @@ -403,24 +437,15 @@ class Executor(object):      # another extra indirection for new-style objects and nullify... -    def my_str(self): -        env = self.get_build_env() -        return "\n".join([action.genstring(self.get_all_targets(), -                                           self.get_all_sources(), -                                           env) -                          for action in self.get_action_list()]) - -      def __str__(self): -        return self.my_str() +        return _execute_str_map[self._execute_str](self)      def nullify(self):          self.cleanup() -        self.do_execute = self.do_nothing -        self.my_str     = lambda: '' - -    memoizer_counters.append(SCons.Memoize.CountValue('get_contents')) +        self._do_execute = 0 +        self._execute_str = 0 +    @SCons.Memoize.CountMethodCall      def get_contents(self):          """Fetch the signature contents.  This is the main reason this          class exists, so we can compute this once and cache it regardless @@ -493,8 +518,7 @@ class Executor(object):      def _get_unignored_sources_key(self, node, ignore=()):          return (node,) + tuple(ignore) -    memoizer_counters.append(SCons.Memoize.CountDict('get_unignored_sources', _get_unignored_sources_key)) - +    @SCons.Memoize.CountDictCall(_get_unignored_sources_key)      def get_unignored_sources(self, node, ignore=()):          key = (node,) + tuple(ignore)          try: @@ -579,6 +603,23 @@ class Null(object):      disassociate Builders from Nodes entirely, so we're not      going to worry about unit tests for this--at least for now.      """ +     +    __slots__ = ('pre_actions', +                 'post_actions', +                 'env', +                 'overridelist', +                 'batches', +                 'builder_kw', +                 '_memo', +                 'lvars', +                 '_changed_sources_list', +                 '_changed_targets_list', +                 '_unchanged_sources_list', +                 '_unchanged_targets_list', +                 'action_list', +                 '_do_execute', +                 '_execute_str') +          def __init__(self, *args, **kw):          if SCons.Debug.track_instances: logInstanceCreation(self, 'Executor.Null')          self.batches = [Batch(kw['targets'][:], [])] diff --git a/engine/SCons/Job.py b/engine/SCons/Job.py index cdcd38e..60aa0ae 100644 --- a/engine/SCons/Job.py +++ b/engine/SCons/Job.py @@ -29,7 +29,7 @@ stop, and wait on jobs.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Job.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Job.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.compat diff --git a/engine/SCons/Memoize.py b/engine/SCons/Memoize.py index 2557faf..77a8e16 100644 --- a/engine/SCons/Memoize.py +++ b/engine/SCons/Memoize.py @@ -21,21 +21,21 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Memoize.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Memoize.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __doc__ = """Memoizer -A metaclass implementation to count hits and misses of the computed +A decorator-based implementation to count hits and misses of the computed  values that various methods cache in memory.  Use of this modules assumes that wrapped methods be coded to cache their -values in a consistent way.  Here is an example of wrapping a method -that returns a computed value, with no input parameters: +values in a consistent way. In particular, it requires that the class uses a +dictionary named "_memo" to store the cached values. -    memoizer_counters = []                                      # Memoization - -    memoizer_counters.append(SCons.Memoize.CountValue('foo'))   # Memoization +Here is an example of wrapping a method that returns a computed value, +with no input parameters: +    @SCons.Memoize.CountMethodCall      def foo(self):          try:                                                    # Memoization @@ -55,8 +55,7 @@ based on one or more input arguments:      def _bar_key(self, argument):                               # Memoization          return argument                                         # Memoization -    memoizer_counters.append(SCons.Memoize.CountDict('bar', _bar_key)) # Memoization - +    @SCons.Memoize.CountDictCall(_bar_key)      def bar(self, argument):          memo_key = argument                                     # Memoization @@ -77,10 +76,6 @@ based on one or more input arguments:          return result -At one point we avoided replicating this sort of logic in all the methods -by putting it right into this module, but we've moved away from that at -present (see the "Historical Note," below.). -  Deciding what to cache is tricky, because different configurations  can have radically different performance tradeoffs, and because the  tradeoffs involved are often so non-obvious.  Consequently, deciding @@ -102,51 +97,37 @@ cache return values from a method that's being called a lot:          input arguments, you don't need to use all of the arguments          if some of them don't affect the return values. -Historical Note:  The initial Memoizer implementation actually handled -the caching of values for the wrapped methods, based on a set of generic -algorithms for computing hashable values based on the method's arguments. -This collected caching logic nicely, but had two drawbacks: - -    Running arguments through a generic key-conversion mechanism is slower -    (and less flexible) than just coding these things directly.  Since the -    methods that need memoized values are generally performance-critical, -    slowing them down in order to collect the logic isn't the right -    tradeoff. - -    Use of the memoizer really obscured what was being called, because -    all the memoized methods were wrapped with re-used generic methods. -    This made it more difficult, for example, to use the Python profiler -    to figure out how to optimize the underlying methods.  """ -import types -  # A flag controlling whether or not we actually use memoization.  use_memoizer = None -CounterList = [] +# Global list of counter objects +CounterList = {}  class Counter(object):      """      Base class for counting memoization hits and misses. -    We expect that the metaclass initialization will have filled in -    the .name attribute that represents the name of the function -    being counted. +    We expect that the initialization in a matching decorator will +    fill in the correct class name and method name that represents +    the name of the function being counted.      """ -    def __init__(self, method_name): +    def __init__(self, cls_name, method_name):          """          """ +        self.cls_name = cls_name          self.method_name = method_name          self.hit = 0          self.miss = 0 -        CounterList.append(self) +    def key(self): +        return self.cls_name+'.'+self.method_name      def display(self):          fmt = "    %7d hits %7d misses    %s()" -        print fmt % (self.hit, self.miss, self.name) +        print fmt % (self.hit, self.miss, self.key())      def __cmp__(self, other):          try: -            return cmp(self.name, other.name) +            return cmp(self.key(), other.key())          except AttributeError:              return 0 @@ -154,45 +135,39 @@ class CountValue(Counter):      """      A counter class for simple, atomic memoized values. -    A CountValue object should be instantiated in a class for each of +    A CountValue object should be instantiated in a decorator for each of      the class's methods that memoizes its return value by simply storing      the return value in its _memo dictionary. - -    We expect that the metaclass initialization will fill in the -    .underlying_method attribute with the method that we're wrapping. -    We then call the underlying_method method after counting whether -    its memoized value has already been set (a hit) or not (a miss).      """ -    def __call__(self, *args, **kw): +    def count(self, *args, **kw): +        """ Counts whether the memoized value has already been +            set (a hit) or not (a miss). +        """          obj = args[0]          if self.method_name in obj._memo:              self.hit = self.hit + 1          else:              self.miss = self.miss + 1 -        return self.underlying_method(*args, **kw)  class CountDict(Counter):      """      A counter class for memoized values stored in a dictionary, with      keys based on the method's input arguments. -    A CountDict object is instantiated in a class for each of the +    A CountDict object is instantiated in a decorator for each of the      class's methods that memoizes its return value in a dictionary,      indexed by some key that can be computed from one or more of      its input arguments. - -    We expect that the metaclass initialization will fill in the -    .underlying_method attribute with the method that we're wrapping. -    We then call the underlying_method method after counting whether the -    computed key value is already present in the memoization dictionary -    (a hit) or not (a miss).      """ -    def __init__(self, method_name, keymaker): +    def __init__(self, cls_name, method_name, keymaker):          """          """ -        Counter.__init__(self, method_name) +        Counter.__init__(self, cls_name, method_name)          self.keymaker = keymaker -    def __call__(self, *args, **kw): +    def count(self, *args, **kw): +        """ Counts whether the computed key value is already present +           in the memoization dictionary (a hit) or not (a miss). +        """          obj = args[0]          try:              memo_dict = obj._memo[self.method_name] @@ -204,39 +179,65 @@ class CountDict(Counter):                  self.hit = self.hit + 1              else:                  self.miss = self.miss + 1 -        return self.underlying_method(*args, **kw) - -class Memoizer(object): -    """Object which performs caching of method calls for its 'primary' -    instance.""" - -    def __init__(self): -        pass  def Dump(title=None): +    """ Dump the hit/miss count for all the counters +        collected so far. +    """      if title:          print title -    CounterList.sort() -    for counter in CounterList: -        counter.display() - -class Memoized_Metaclass(type): -    def __init__(cls, name, bases, cls_dict): -        super(Memoized_Metaclass, cls).__init__(name, bases, cls_dict) - -        for counter in cls_dict.get('memoizer_counters', []): -            method_name = counter.method_name - -            counter.name = cls.__name__ + '.' + method_name -            counter.underlying_method = cls_dict[method_name] - -            replacement_method = types.MethodType(counter, None, cls) -            setattr(cls, method_name, replacement_method) +    for counter in sorted(CounterList): +        CounterList[counter].display()  def EnableMemoization():      global use_memoizer      use_memoizer = 1 +def CountMethodCall(fn): +    """ Decorator for counting memoizer hits/misses while retrieving +        a simple value in a class method. It wraps the given method +        fn and uses a CountValue object to keep track of the +        caching statistics. +        Wrapping gets enabled by calling EnableMemoization(). +    """ +    if use_memoizer: +        def wrapper(self, *args, **kwargs): +            global CounterList +            key = self.__class__.__name__+'.'+fn.__name__ +            if key not in CounterList: +                CounterList[key] = CountValue(self.__class__.__name__, fn.__name__) +            CounterList[key].count(self, *args, **kwargs) +            return fn(self, *args, **kwargs) +        wrapper.__name__= fn.__name__ +        return wrapper +    else: +        return fn + +def CountDictCall(keyfunc): +    """ Decorator for counting memoizer hits/misses while accessing +        dictionary values with a key-generating function. Like +        CountMethodCall above, it wraps the given method +        fn and uses a CountDict object to keep track of the +        caching statistics. The dict-key function keyfunc has to +        get passed in the decorator call and gets stored in the +        CountDict instance. +        Wrapping gets enabled by calling EnableMemoization(). +    """ +    def decorator(fn): +        if use_memoizer: +            def wrapper(self, *args, **kwargs): +                global CounterList +                key = self.__class__.__name__+'.'+fn.__name__ +                if key not in CounterList: +                    CounterList[key] = CountDict(self.__class__.__name__, fn.__name__, keyfunc) +                CounterList[key].count(self, *args, **kwargs) +                return fn(self, *args, **kwargs) +            wrapper.__name__= fn.__name__ +            return wrapper +        else: +            return fn +    return decorator +  # Local Variables:  # tab-width:4  # indent-tabs-mode:nil diff --git a/engine/SCons/Node/Alias.py b/engine/SCons/Node/Alias.py index 0bd6422..7e13b00 100644 --- a/engine/SCons/Node/Alias.py +++ b/engine/SCons/Node/Alias.py @@ -30,7 +30,7 @@ This creates a hash of global Aliases (dummy targets).  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Node/Alias.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Node/Alias.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import collections @@ -56,13 +56,47 @@ class AliasNameSpace(collections.UserDict):              return None  class AliasNodeInfo(SCons.Node.NodeInfoBase): -    current_version_id = 1 +    __slots__ = ('csig',) +    current_version_id = 2      field_list = ['csig']      def str_to_node(self, s):          return default_ans.Alias(s) +    def __getstate__(self): +        """ +        Return all fields that shall be pickled. Walk the slots in the class +        hierarchy and add those to the state dictionary. If a '__dict__' slot is +        available, copy all entries to the dictionary. Also include the version +        id, which is fixed for all instances of a class. +        """ +        state = getattr(self, '__dict__', {}).copy() +        for obj in type(self).mro(): +            for name in getattr(obj,'__slots__',()): +                if hasattr(self, name): +                    state[name] = getattr(self, name) + +        state['_version_id'] = self.current_version_id +        try: +            del state['__weakref__'] +        except KeyError: +            pass + +        return state + +    def __setstate__(self, state): +        """ +        Restore the attributes from a pickled state. +        """ +        # TODO check or discard version +        del state['_version_id'] +        for key, value in state.items(): +            if key not in ('__weakref__',): +                setattr(self, key, value) +           +  class AliasBuildInfo(SCons.Node.BuildInfoBase): -    current_version_id = 1 +    __slots__ = () +    current_version_id = 2  class Alias(SCons.Node.Node): @@ -72,7 +106,9 @@ class Alias(SCons.Node.Node):      def __init__(self, name):          SCons.Node.Node.__init__(self)          self.name = name - +        self.changed_since_last_build = 1 +        self.store_info = 0 +              def str_for_display(self):          return '"' + self.__str__() + '"' @@ -105,13 +141,6 @@ class Alias(SCons.Node.Node):      #      # -    def changed_since_last_build(self, target, prev_ni): -        cur_csig = self.get_csig() -        try: -            return cur_csig != prev_ni.csig -        except AttributeError: -            return 1 -      def build(self):          """A "builder" for aliases."""          pass diff --git a/engine/SCons/Node/FS.py b/engine/SCons/Node/FS.py index 8d71f7e..b6a1bb5 100644 --- a/engine/SCons/Node/FS.py +++ b/engine/SCons/Node/FS.py @@ -32,7 +32,7 @@ that can be used by scripts or modules looking for the canonical default.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Node/FS.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Node/FS.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import fnmatch  import os @@ -56,10 +56,23 @@ import SCons.Warnings  from SCons.Debug import Trace -do_store_info = True  print_duplicate = 0 +def sconsign_none(node): +    raise NotImplementedError + +def sconsign_dir(node): +    """Return the .sconsign file info for this directory, +    creating it first if necessary.""" +    if not node._sconsign: +        import SCons.SConsign +        node._sconsign = SCons.SConsign.ForDirectory(node) +    return node._sconsign + +_sconsign_map = {0 : sconsign_none, +                 1 : sconsign_dir} +  class EntryProxyAttributeError(AttributeError):      """      An AttributeError subclass for recording and displaying the name @@ -268,8 +281,8 @@ def LinkFunc(target, source, env):      # who want to move their soft-linked src-trees around. Those      # people should use the 'hard-copy' mode, softlinks cannot be      # used for that; at least I have no idea how ... -    src = source[0].abspath -    dest = target[0].abspath +    src = source[0].get_abspath() +    dest = target[0].get_abspath()      dir, file = os.path.split(dest)      if dir and not target[0].fs.isdir(dir):          os.makedirs(dir) @@ -302,7 +315,7 @@ LocalCopy = SCons.Action.Action(LinkFunc, LocalString)  def UnlinkFunc(target, source, env):      t = target[0] -    t.fs.unlink(t.abspath) +    t.fs.unlink(t.get_abspath())      return 0  Unlink = SCons.Action.Action(UnlinkFunc, None) @@ -310,7 +323,7 @@ Unlink = SCons.Action.Action(UnlinkFunc, None)  def MkdirFunc(target, source, env):      t = target[0]      if not t.exists(): -        t.fs.mkdir(t.abspath) +        t.fs.mkdir(t.get_abspath())      return 0  Mkdir = SCons.Action.Action(MkdirFunc, None, presub=None) @@ -403,7 +416,7 @@ def do_diskcheck_match(node, predicate, errorfmt):      except (AttributeError, KeyError):          pass      if result: -        raise TypeError(errorfmt % node.abspath) +        raise TypeError(errorfmt % node.get_abspath())  def ignore_diskcheck_match(node, predicate, errorfmt):      pass @@ -573,7 +586,20 @@ class Base(SCons.Node.Node):      object identity comparisons.      """ -    memoizer_counters = [] +    __slots__ = ['name', +                 'fs', +                 '_abspath', +                 '_labspath', +                 '_path', +                 '_tpath', +                 '_path_elements', +                 'dir', +                 'cwd', +                 'duplicate', +                 '_local', +                 'sbuilder', +                 '_proxy', +                 '_func_sconsign']      def __init__(self, name, directory, fs):          """Initialize a generic Node.FS.Base object. @@ -591,27 +617,26 @@ class Base(SCons.Node.Node):          #: Filename with extension as it was specified when the object was          #: created; to obtain filesystem path, use Python str() function          self.name = SCons.Util.silent_intern(name) -        #: Cached filename extension -        self.suffix = SCons.Util.silent_intern(SCons.Util.splitext(name)[1])          self.fs = fs #: Reference to parent Node.FS object          assert directory, "A directory must be provided" -        self.abspath = SCons.Util.silent_intern(directory.entry_abspath(name)) -        self.labspath = SCons.Util.silent_intern(directory.entry_labspath(name)) -        if directory.path == '.': -            self.path = SCons.Util.silent_intern(name) -        else: -            self.path = SCons.Util.silent_intern(directory.entry_path(name)) -        if directory.tpath == '.': -            self.tpath = SCons.Util.silent_intern(name) -        else: -            self.tpath = SCons.Util.silent_intern(directory.entry_tpath(name)) -        self.path_elements = directory.path_elements + [self] +        self._abspath = None +        self._labspath = None +        self._path = None +        self._tpath = None +        self._path_elements = None          self.dir = directory          self.cwd = None # will hold the SConscript directory for target nodes          self.duplicate = directory.duplicate +        self.changed_since_last_build = 2 +        self._func_sconsign = 0 +        self._func_exists = 2 +        self._func_rexists = 2 +        self._func_get_contents = 0 +        self._func_target_from_source = 1 +        self.store_info = 1      def str_for_display(self):          return '"' + self.__str__() + '"' @@ -624,17 +649,38 @@ class Base(SCons.Node.Node):          if isinstance(self, klass) or klass is Entry:              return          raise TypeError("Tried to lookup %s '%s' as a %s." %\ -              (self.__class__.__name__, self.path, klass.__name__)) +              (self.__class__.__name__, self.get_internal_path(), klass.__name__))      def get_dir(self):          return self.dir      def get_suffix(self): -        return self.suffix +        return SCons.Util.splitext(self.name)[1]      def rfile(self):          return self +    def __getattr__(self, attr): +        """ Together with the node_bwcomp dict defined below, +            this method provides a simple backward compatibility +            layer for the Node attributes 'abspath', 'labspath', +            'path', 'tpath', 'suffix' and 'path_elements'. These Node +            attributes used to be directly available in v2.3 and earlier, but +            have been replaced by getter methods that initialize the +            single variables lazily when required, in order to save memory. +            The redirection to the getters lets older Tools and +            SConstruct continue to work without any additional changes, +            fully transparent to the user.  +            Note, that __getattr__ is only called as fallback when the +            requested attribute can't be found, so there should be no +            speed performance penalty involved for standard builds. +        """ +        if attr in node_bwcomp: +            return node_bwcomp[attr](self) +         +        raise AttributeError("%r object has no attribute %r" % +                         (self.__class__, attr)) +      def __str__(self):          """A Node.FS.Base object's string representation is its path          name.""" @@ -643,8 +689,7 @@ class Base(SCons.Node.Node):              return self._save_str()          return self._get_str() -    memoizer_counters.append(SCons.Memoize.CountValue('_save_str')) - +    @SCons.Memoize.CountMethodCall      def _save_str(self):          try:              return self._memo['_save_str'] @@ -681,21 +726,20 @@ class Base(SCons.Node.Node):      rstr = __str__ -    memoizer_counters.append(SCons.Memoize.CountValue('stat')) - +    @SCons.Memoize.CountMethodCall      def stat(self):          try: return self._memo['stat']          except KeyError: pass -        try: result = self.fs.stat(self.abspath) +        try: result = self.fs.stat(self.get_abspath())          except os.error: result = None          self._memo['stat'] = result          return result      def exists(self): -        return self.stat() is not None +        return SCons.Node._exists_map[self._func_exists](self)      def rexists(self): -        return self.rfile().exists() +        return SCons.Node._rexists_map[self._func_rexists](self)      def getmtime(self):          st = self.stat() @@ -717,7 +761,7 @@ class Base(SCons.Node.Node):      if hasattr(os, 'symlink'):          def islink(self): -            try: st = self.fs.lstat(self.abspath) +            try: st = self.fs.lstat(self.get_abspath())              except os.error: return 0              return stat.S_ISLNK(st[stat.ST_MODE])      else: @@ -752,7 +796,7 @@ class Base(SCons.Node.Node):              dir = self.fs.getcwd()          if self == dir:              return '.' -        path_elems = self.path_elements +        path_elems = self.get_path_elements()          pathname = ''          try: i = path_elems.index(dir)          except ValueError:  @@ -785,7 +829,26 @@ class Base(SCons.Node.Node):      def get_abspath(self):          """Get the absolute path of the file.""" -        return self.abspath +        return self.dir.entry_abspath(self.name) + +    def get_labspath(self): +        """Get the absolute path of the file.""" +        return self.dir.entry_labspath(self.name) + +    def get_internal_path(self): +        if self.dir._path == '.': +            return self.name +        else: +            return self.dir.entry_path(self.name) +         +    def get_tpath(self): +        if self.dir._tpath == '.': +            return self.name +        else: +            return self.dir.entry_tpath(self.name) +         +    def get_path_elements(self): +        return self.dir._path_elements + [self]      def for_signature(self):          # Return just our name.  Even an absolute path would not work, @@ -811,13 +874,12 @@ class Base(SCons.Node.Node):          files that need different behavior.  See Tool/swig.py for          an example.          """ -        return self.dir.Entry(prefix + splitext(self.name)[0] + suffix) +        return SCons.Node._target_from_source_map[self._func_target_from_source](self, prefix, suffix, splitext)      def _Rfindalldirs_key(self, pathlist):          return pathlist -    memoizer_counters.append(SCons.Memoize.CountDict('Rfindalldirs', _Rfindalldirs_key)) - +    @SCons.Memoize.CountDictCall(_Rfindalldirs_key)      def Rfindalldirs(self, pathlist):          """          Return all of the directories for a given path list, including @@ -856,8 +918,7 @@ class Base(SCons.Node.Node):          cwd = self.cwd or self.fs._cwd          return cwd.Rfindalldirs(pathlist) -    memoizer_counters.append(SCons.Memoize.CountValue('rentry')) - +    @SCons.Memoize.CountMethodCall      def rentry(self):          try:              return self._memo['rentry'] @@ -878,6 +939,17 @@ class Base(SCons.Node.Node):      def _glob1(self, pattern, ondisk=True, source=False, strings=False):          return [] +     +# Dict that provides a simple backward compatibility +# layer for the Node attributes 'abspath', 'labspath', +# 'path', 'tpath' and 'path_elements'. +# @see Base.__getattr__ above +node_bwcomp = {'abspath' : Base.get_abspath, +               'labspath' : Base.get_labspath, +               'path' : Base.get_internal_path, +               'tpath' : Base.get_tpath, +               'path_elements' : Base.get_path_elements, +               'suffix' : Base.get_suffix}  class Entry(Base):      """This is the class for generic Node.FS entries--that is, things @@ -887,6 +959,28 @@ class Entry(Base):      time comes, and then call the same-named method in the transformed      class.""" +    __slots__ = ['scanner_paths', +                 'cachedir_csig', +                 'cachesig', +                 'repositories', +                 'srcdir', +                 'entries', +                 'searched', +                 '_sconsign', +                 'variant_dirs', +                 'root', +                 'dirname', +                 'on_disk_entries', +                 'sccs_dir', +                 'rcs_dir', +                 'released_target_info', +                 'contentsig'] + +    def __init__(self, name, directory, fs): +        Base.__init__(self, name, directory, fs) +        self._func_exists = 3 +        self._func_get_contents = 1  +      def diskcheck_match(self):          pass @@ -917,7 +1011,7 @@ class Entry(Base):                  self.__class__ = Dir                  self._morph()              elif must_exist: -                msg = "No such file or directory: '%s'" % self.abspath +                msg = "No such file or directory: '%s'" % self.get_abspath()                  raise SCons.Errors.UserError(msg)              else:                  self.__class__ = File @@ -939,17 +1033,7 @@ class Entry(Base):      def get_contents(self):          """Fetch the contents of the entry.  Returns the exact binary          contents of the file.""" -        try: -            self = self.disambiguate(must_exist=1) -        except SCons.Errors.UserError: -            # There was nothing on disk with which to disambiguate -            # this entry.  Leave it as an Entry, but return a null -            # string so calls to get_contents() in emitters and the -            # like (e.g. in qt.py) don't have to disambiguate by hand -            # or catch the exception. -            return '' -        else: -            return self.get_contents() +        return SCons.Node._get_contents_map[self._func_get_contents](self)      def get_text_contents(self):          """Fetch the decoded text contents of a Unicode encoded Entry. @@ -989,10 +1073,7 @@ class Entry(Base):      # to make various tests pass.      def exists(self): -        """Return if the Entry exists.  Check the file system to see -        what we should turn into first.  Assume a file if there's no -        directory.""" -        return self.disambiguate().exists() +        return SCons.Node._exists_map[self._func_exists](self)      def rel_path(self, other):          d = self.disambiguate() @@ -1003,9 +1084,6 @@ class Entry(Base):      def new_ninfo(self):          return self.disambiguate().new_ninfo() -    def changed_since_last_build(self, target, prev_ni): -        return self.disambiguate().changed_since_last_build(target, prev_ni) -      def _glob1(self, pattern, ondisk=True, source=False, strings=False):          return self.disambiguate()._glob1(pattern, ondisk, source, strings) @@ -1019,9 +1097,6 @@ _classEntry = Entry  class LocalFS(object): -    if SCons.Memoize.use_memoizer: -        __metaclass__ = SCons.Memoize.Memoized_Metaclass -      # This class implements an abstraction layer for operations involving      # a local file system.  Essentially, this wraps any function in      # the os, os.path or shutil modules that we use to actually go do @@ -1101,8 +1176,6 @@ class LocalFS(object):  class FS(LocalFS): -    memoizer_counters = [] -      def __init__(self, path = None):          """Initialize the Node.FS subsystem. @@ -1128,8 +1201,8 @@ class FS(LocalFS):          self.defaultDrive = _my_normcase(_my_splitdrive(self.pathTop)[0])          self.Top = self.Dir(self.pathTop) -        self.Top.path = '.' -        self.Top.tpath = '.' +        self.Top._path = '.' +        self.Top._tpath = '.'          self._cwd = self.Top          DirNodeInfo.fs = self @@ -1160,7 +1233,7 @@ class FS(LocalFS):              if dir is not None:                  self._cwd = dir                  if change_os_dir: -                    os.chdir(dir.abspath) +                    os.chdir(dir.get_abspath())          except OSError:              self._cwd = curr              raise @@ -1249,9 +1322,9 @@ class FS(LocalFS):              # The path is relative to the top-level SCons directory.              if p in ('', '.'): -                p = directory.labspath +                p = directory.get_labspath()              else: -                p = directory.labspath + '/' + p +                p = directory.get_labspath() + '/' + p          else:              if do_splitdrive:                  drive, p = _my_splitdrive(p) @@ -1285,9 +1358,9 @@ class FS(LocalFS):                      directory = self._cwd                  if p in ('', '.'): -                    p = directory.labspath +                    p = directory.get_labspath()                  else: -                    p = directory.labspath + '/' + p +                    p = directory.get_labspath() + '/' + p                  if drive:                      root = self.get_root(drive) @@ -1393,7 +1466,7 @@ class FS(LocalFS):                  if start_dir.is_under(bd):                      # If already in the build-dir location, don't reflect                      return [orig], fmt % str(orig) -                p = os.path.join(bd.path, *tail) +                p = os.path.join(bd._path, *tail)                  targets.append(self.Entry(p))              tail = [dir.name] + tail              dir = dir.up() @@ -1412,8 +1485,9 @@ class FS(LocalFS):          return cwd.glob(pathname, ondisk, source, strings, exclude)  class DirNodeInfo(SCons.Node.NodeInfoBase): +    __slots__ = ()      # This should get reset by the FS initialization. -    current_version_id = 1 +    current_version_id = 2      fs = None @@ -1425,11 +1499,12 @@ class DirNodeInfo(SCons.Node.NodeInfoBase):              if drive:                  root = self.fs.get_root(drive)          if not os.path.isabs(s): -            s = top.labspath + '/' + s +            s = top.get_labspath() + '/' + s          return root._lookup_abs(s, Entry)  class DirBuildInfo(SCons.Node.BuildInfoBase): -    current_version_id = 1 +    __slots__ = () +    current_version_id = 2  glob_magic_check = re.compile('[*?[]') @@ -1440,7 +1515,22 @@ class Dir(Base):      """A class for directories in a file system.      """ -    memoizer_counters = [] +    __slots__ = ['scanner_paths', +                 'cachedir_csig', +                 'cachesig', +                 'repositories', +                 'srcdir', +                 'entries', +                 'searched', +                 '_sconsign', +                 'variant_dirs', +                 'root', +                 'dirname', +                 'on_disk_entries', +                 'sccs_dir', +                 'rcs_dir', +                 'released_target_info', +                 'contentsig']      NodeInfo = DirNodeInfo      BuildInfo = DirBuildInfo @@ -1470,6 +1560,22 @@ class Dir(Base):          self._sconsign = None          self.variant_dirs = []          self.root = self.dir.root +        self.changed_since_last_build = 3 +        self._func_sconsign = 1 +        self._func_exists = 2 +        self._func_get_contents = 2 +         +        self._abspath = SCons.Util.silent_intern(self.dir.entry_abspath(self.name)) +        self._labspath = SCons.Util.silent_intern(self.dir.entry_labspath(self.name)) +        if self.dir._path == '.': +            self._path = SCons.Util.silent_intern(self.name) +        else: +            self._path = SCons.Util.silent_intern(self.dir.entry_path(self.name)) +        if self.dir._tpath == '.': +            self._tpath = SCons.Util.silent_intern(self.name) +        else: +            self._tpath = SCons.Util.silent_intern(self.dir.entry_tpath(self.name)) +        self._path_elements = self.dir._path_elements + [self]          # For directories, we make a difference between the directory          # 'name' and the directory 'dirname'. The 'name' attribute is @@ -1562,8 +1668,7 @@ class Dir(Base):              return self.srcdir.get_all_rdirs() + self.repositories          return self.repositories -    memoizer_counters.append(SCons.Memoize.CountValue('get_all_rdirs')) - +    @SCons.Memoize.CountMethodCall      def get_all_rdirs(self):          try:              return list(self._memo['get_all_rdirs']) @@ -1589,7 +1694,7 @@ class Dir(Base):      def addRepository(self, dir):          if dir != self and not dir in self.repositories:              self.repositories.append(dir) -            dir.tpath = '.' +            dir._tpath = '.'              self.__clearRepositoryCache()      def up(self): @@ -1598,8 +1703,7 @@ class Dir(Base):      def _rel_path_key(self, other):          return str(other) -    memoizer_counters.append(SCons.Memoize.CountDict('rel_path', _rel_path_key)) - +    @SCons.Memoize.CountDictCall(_rel_path_key)      def rel_path(self, other):          """Return a path to "other" relative to this directory.          """ @@ -1628,7 +1732,7 @@ class Dir(Base):          if self is other:              result = '.' -        elif not other in self.path_elements: +        elif not other in self._path_elements:              try:                  other_dir = other.get_dir()              except AttributeError: @@ -1643,10 +1747,10 @@ class Dir(Base):                      else:                          result = dir_rel_path + OS_SEP + other.name          else: -            i = self.path_elements.index(other) + 1 +            i = self._path_elements.index(other) + 1 -            path_elems = ['..'] * (len(self.path_elements) - i) \ -                         + [n.name for n in other.path_elements[i:]] +            path_elems = ['..'] * (len(self._path_elements) - i) \ +                         + [n.name for n in other._path_elements[i:]]              result = OS_SEP.join(path_elems) @@ -1713,7 +1817,7 @@ class Dir(Base):              if p is None:                  # Don't use while: - else: for this condition because                  # if so, then parent is None and has no .path attribute. -                raise SCons.Errors.StopError(parent.path) +                raise SCons.Errors.StopError(parent._path)              parent = p          listDirs.reverse()          for dirnode in listDirs: @@ -1753,10 +1857,7 @@ class Dir(Base):      def get_contents(self):          """Return content signatures and names of all our children          separated by new-lines. Ensure that the nodes are sorted.""" -        contents = [] -        for node in sorted(self.children(), key=lambda t: t.name): -            contents.append('%s %s\n' % (node.get_csig(), node.name)) -        return ''.join(contents) +        return SCons.Node._get_contents_map[self._func_get_contents](self)      def get_csig(self):          """Compute the content signature for Directory nodes. In @@ -1770,8 +1871,6 @@ class Dir(Base):      def do_duplicate(self, src):          pass -    changed_since_last_build = SCons.Node.Node.state_has_changed -      def is_up_to_date(self):          """If any child is not up-to-date, then this directory isn't,          either.""" @@ -1795,12 +1894,8 @@ class Dir(Base):          return self      def sconsign(self): -        """Return the .sconsign file info for this directory, -        creating it first if necessary.""" -        if not self._sconsign: -            import SCons.SConsign -            self._sconsign = SCons.SConsign.ForDirectory(self) -        return self._sconsign +        """Return the .sconsign file info for this directory. """ +        return _sconsign_map[self._func_sconsign](self)      def srcnode(self):          """Dir has a special need for srcnode()...if we @@ -1817,17 +1912,34 @@ class Dir(Base):                  stamp = kid.get_timestamp()          return stamp +    def get_abspath(self): +        """Get the absolute path of the file.""" +        return self._abspath + +    def get_labspath(self): +        """Get the absolute path of the file.""" +        return self._labspath + +    def get_internal_path(self): +        return self._path +         +    def get_tpath(self): +        return self._tpath +         +    def get_path_elements(self): +        return self._path_elements +      def entry_abspath(self, name): -        return self.abspath + OS_SEP + name +        return self._abspath + OS_SEP + name      def entry_labspath(self, name): -        return self.labspath + '/' + name +        return self._labspath + '/' + name      def entry_path(self, name): -        return self.path + OS_SEP + name +        return self._path + OS_SEP + name      def entry_tpath(self, name): -        return self.tpath + OS_SEP + name +        return self._tpath + OS_SEP + name      def entry_exists_on_disk(self, name):          """ Searches through the file/dir entries of the current @@ -1841,7 +1953,7 @@ class Dir(Base):          except AttributeError:              d = {}              try: -                entries = os.listdir(self.abspath) +                entries = os.listdir(self._abspath)              except OSError:                  pass              else: @@ -1854,7 +1966,7 @@ class Dir(Base):              if result is None:                  # Belt-and-suspenders for Windows:  check directly for                  # 8.3 file names that don't show up in os.listdir(). -                result = os.path.exists(self.abspath + OS_SEP + name) +                result = os.path.exists(self._abspath + OS_SEP + name)                  d[name] = result              return result          else: @@ -1887,8 +1999,7 @@ class Dir(Base):                          break          return rentry_exists -    memoizer_counters.append(SCons.Memoize.CountValue('srcdir_list')) - +    @SCons.Memoize.CountMethodCall      def srcdir_list(self):          try:              return self._memo['srcdir_list'] @@ -1929,8 +2040,7 @@ class Dir(Base):      def _srcdir_find_file_key(self, filename):          return filename -    memoizer_counters.append(SCons.Memoize.CountDict('srcdir_find_file', _srcdir_find_file_key)) - +    @SCons.Memoize.CountDictCall(_srcdir_find_file_key)      def srcdir_find_file(self, filename):          try:              memo_dict = self._memo['srcdir_find_file'] @@ -2105,7 +2215,7 @@ class Dir(Base):                  for name in node_names: selfEntry(name)              if ondisk:                  try: -                    disk_names = os.listdir(dir.abspath) +                    disk_names = os.listdir(dir._abspath)                  except os.error:                      continue                  names.extend(disk_names) @@ -2151,18 +2261,12 @@ class RootDir(Dir):      add a separator when creating the path names of entries within      this directory.      """ +     +    __slots__ = ['_lookupDict'] +          def __init__(self, drive, fs):          if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.FS.RootDir') -        # We're going to be our own parent directory (".." entry and .dir -        # attribute) so we have to set up some values so Base.__init__() -        # won't gag won't it calls some of our methods. -        self.abspath = '' -        self.labspath = '' -        self.path = '' -        self.tpath = '' -        self.path_elements = [] -        self.duplicate = 0 -        self.root = self +        SCons.Node.Node.__init__(self)          # Handle all the types of drives:          if drive == '': @@ -2178,33 +2282,85 @@ class RootDir(Dir):              name = drive              dirname = drive + OS_SEP -        Base.__init__(self, name, self, fs) +        #: Filename with extension as it was specified when the object was +        #: created; to obtain filesystem path, use Python str() function +        self.name = SCons.Util.silent_intern(name) +        self.fs = fs #: Reference to parent Node.FS object + +        self._path_elements = [self] +        self.dir = self +        self._func_rexists = 2 +        self._func_target_from_source = 1 +        self.store_info = 1          # Now set our paths to what we really want them to be. The          # name should already contain any necessary separators, such          # as the initial drive letter (the name) plus the directory          # separator, except for the "lookup abspath," which does not          # have the drive letter. -        self.abspath = dirname -        self.labspath = '' -        self.path = dirname -        self.tpath = dirname -        self._morph() - -        # Must be reset after Dir._morph() is invoked... +        self._abspath = dirname +        self._labspath = '' +        self._path = dirname +        self._tpath = dirname          self.dirname = dirname +        self._morph() + +        self.duplicate = 0          self._lookupDict = {}          self._lookupDict[''] = self          self._lookupDict['/'] = self - +        self.root = self          # The // entry is necessary because os.path.normpath()          # preserves double slashes at the beginning of a path on Posix          # platforms.          if not has_unc:              self._lookupDict['//'] = self +    def _morph(self): +        """Turn a file system Node (either a freshly initialized directory +        object or a separate Entry object) into a proper directory object. + +        Set up this directory's entries and hook it into the file +        system tree.  Specify that directories (this Node) don't use +        signatures for calculating whether they're current. +        """ + +        self.repositories = [] +        self.srcdir = None + +        self.entries = {} +        self.entries['.'] = self +        self.entries['..'] = self.dir +        self.cwd = self +        self.searched = 0 +        self._sconsign = None +        self.variant_dirs = [] +        self.changed_since_last_build = 3 +        self._func_sconsign = 1 +        self._func_exists = 2 +        self._func_get_contents = 2 +         +        # Don't just reset the executor, replace its action list, +        # because it might have some pre-or post-actions that need to +        # be preserved. +        # +        # But don't reset the executor if there is a non-null executor +        # attached already. The existing executor might have other +        # targets, in which case replacing the action list with a +        # Mkdir action is a big mistake. +        if not hasattr(self, 'executor'): +            self.builder = get_MkdirBuilder() +            self.get_executor().set_action_list(self.builder.action) +        else: +            # Prepend MkdirBuilder action to existing action list +            l = self.get_executor().action_list +            a = get_MkdirBuilder().action +            l.insert(0, a)  +            self.get_executor().set_action_list(l) +       +      def must_be_same(self, klass):          if klass is Dir:              return @@ -2253,19 +2409,19 @@ class RootDir(Dir):          return result      def __str__(self): -        return self.abspath +        return self._abspath      def entry_abspath(self, name): -        return self.abspath + name +        return self._abspath + name      def entry_labspath(self, name):          return '/' + name      def entry_path(self, name): -        return self.path + name +        return self._path + name      def entry_tpath(self, name): -        return self.tpath + name +        return self._tpath + name      def is_under(self, dir):          if self is dir: @@ -2283,7 +2439,8 @@ class RootDir(Dir):          return _null  class FileNodeInfo(SCons.Node.NodeInfoBase): -    current_version_id = 1 +    __slots__ = ('csig', 'timestamp', 'size') +    current_version_id = 2      field_list = ['csig', 'timestamp', 'size'] @@ -2298,11 +2455,43 @@ class FileNodeInfo(SCons.Node.NodeInfoBase):              if drive:                  root = self.fs.get_root(drive)          if not os.path.isabs(s): -            s = top.labspath + '/' + s +            s = top.get_labspath() + '/' + s          return root._lookup_abs(s, Entry) +    def __getstate__(self): +        """ +        Return all fields that shall be pickled. Walk the slots in the class +        hierarchy and add those to the state dictionary. If a '__dict__' slot is +        available, copy all entries to the dictionary. Also include the version +        id, which is fixed for all instances of a class. +        """ +        state = getattr(self, '__dict__', {}).copy() +        for obj in type(self).mro(): +            for name in getattr(obj,'__slots__',()): +                if hasattr(self, name): +                    state[name] = getattr(self, name) + +        state['_version_id'] = self.current_version_id +        try: +            del state['__weakref__'] +        except KeyError: +            pass + +        return state + +    def __setstate__(self, state): +        """ +        Restore the attributes from a pickled state. +        """ +        # TODO check or discard version +        del state['_version_id'] +        for key, value in state.items(): +            if key not in ('__weakref__',): +                setattr(self, key, value) +  class FileBuildInfo(SCons.Node.BuildInfoBase): -    current_version_id = 1 +    __slots__ = () +    current_version_id = 2      def convert_to_sconsign(self):          """ @@ -2317,7 +2506,7 @@ class FileBuildInfo(SCons.Node.BuildInfoBase):          else:              def node_to_str(n):                  try: -                    s = n.path +                    s = n.get_internal_path()                  except AttributeError:                      s = str(n)                  else: @@ -2358,6 +2547,8 @@ class FileBuildInfo(SCons.Node.BuildInfoBase):                  nodeinfos = getattr(self, sattr)              except AttributeError:                  continue +            if strings is None or nodeinfos is None: +                continue              nodes = []              for s, ni in zip(strings, nodeinfos):                  if not isinstance(s, SCons.Node.Node): @@ -2371,6 +2562,8 @@ class FileBuildInfo(SCons.Node.BuildInfoBase):          for bkid, bkidsig in zip(bkids, bkidsigs):              result.append(str(bkid) + ': ' +                            ' '.join(bkidsig.format(names=names))) +        if not hasattr(self,'bact'): +            self.bact = "none"          result.append('%s [%s]' % (self.bactsig, self.bact))          return '\n'.join(result) @@ -2378,7 +2571,22 @@ class File(Base):      """A class for files in a file system.      """ -    memoizer_counters = [] +    __slots__ = ['scanner_paths', +                 'cachedir_csig', +                 'cachesig', +                 'repositories', +                 'srcdir', +                 'entries', +                 'searched', +                 '_sconsign', +                 'variant_dirs', +                 'root', +                 'dirname', +                 'on_disk_entries', +                 'sccs_dir', +                 'rcs_dir', +                 'released_target_info', +                 'contentsig']      NodeInfo = FileNodeInfo      BuildInfo = FileBuildInfo @@ -2429,6 +2637,14 @@ class File(Base):          if not hasattr(self, 'released_target_info'):              self.released_target_info = False +        self.store_info = 1 +        self._func_exists = 4 +        self._func_get_contents = 3 +         +        # Initialize this Node's decider function to decide_source() because +        # every file is a source file until it has a Builder attached... +        self.changed_since_last_build = 4 +                  # If there was already a Builder set on this entry, then          # we need to make sure we call the target-decider function,          # not the source-decider.  Reaching in and doing this by hand @@ -2440,22 +2656,13 @@ class File(Base):          # not clear right now how to fix that, stick with what works          # until it becomes clear...          if self.has_builder(): -            self.changed_since_last_build = self.decide_target +            self.changed_since_last_build = 5      def scanner_key(self):          return self.get_suffix()      def get_contents(self): -        if not self.rexists(): -            return '' -        fname = self.rfile().abspath -        try: -            contents = open(fname, "rb").read() -        except EnvironmentError, e: -            if not e.filename: -                e.filename = fname -            raise -        return contents +        return SCons.Node._get_contents_map[self._func_get_contents](self)      # This attempts to figure out what the encoding of the text is      # based upon the BOM bytes, and then decodes the contents so that @@ -2482,7 +2689,7 @@ class File(Base):          """          if not self.rexists():              return SCons.Util.MD5signature('') -        fname = self.rfile().abspath +        fname = self.rfile().get_abspath()          try:              cs = SCons.Util.MD5filesignature(fname,                  chunksize=SCons.Node.FS.File.md5_chunksize*1024) @@ -2492,9 +2699,7 @@ class File(Base):              raise          return cs - -    memoizer_counters.append(SCons.Memoize.CountValue('get_size')) - +    @SCons.Memoize.CountMethodCall      def get_size(self):          try:              return self._memo['get_size'] @@ -2510,8 +2715,7 @@ class File(Base):          return size -    memoizer_counters.append(SCons.Memoize.CountValue('get_timestamp')) - +    @SCons.Memoize.CountMethodCall      def get_timestamp(self):          try:              return self._memo['get_timestamp'] @@ -2527,14 +2731,6 @@ class File(Base):          return timestamp -    def store_info(self): -        # Merge our build information into the already-stored entry. -        # This accomodates "chained builds" where a file that's a target -        # in one build (SConstruct file) is a source in a different build. -        # See test/chained-build.py for the use case. -        if do_store_info: -            self.dir.sconsign().store_info(self.name, self) -      convert_copy_attrs = [          'bsources',          'bimplicit', @@ -2647,8 +2843,7 @@ class File(Base):              delattr(old_entry, attr)          return new_entry -    memoizer_counters.append(SCons.Memoize.CountValue('get_stored_info')) - +    @SCons.Memoize.CountMethodCall      def get_stored_info(self):          try:              return self._memo['get_stored_info'] @@ -2688,8 +2883,7 @@ class File(Base):      def _get_found_includes_key(self, env, scanner, path):          return (id(env), id(scanner), path) -    memoizer_counters.append(SCons.Memoize.CountDict('get_found_includes', _get_found_includes_key)) - +    @SCons.Memoize.CountDictCall(_get_found_includes_key)      def get_found_includes(self, env, scanner, path):          """Return the included implicit dependencies in this file.          Cache results so we only scan the file once per path @@ -2773,9 +2967,9 @@ class File(Base):              # any build information that's stored in the .sconsign file              # into our binfo object so it doesn't get lost.              old = self.get_stored_info() -            self.get_binfo().__dict__.update(old.binfo.__dict__) +            self.get_binfo().merge(old.binfo) -        self.store_info() +        SCons.Node.store_info_map[self.store_info](self)      def release_target_info(self):          """Called just after this node has been marked @@ -2875,7 +3069,7 @@ class File(Base):      def _rmv_existing(self):          self.clear_memoized_values() -        if print_duplicate: +        if SCons.Node.print_duplicate:              print "dup: removing existing target %s"%self          e = Unlink(self, [], None)          if isinstance(e, SCons.Errors.BuildError): @@ -2911,18 +3105,18 @@ class File(Base):      def remove(self):          """Remove this file."""          if self.exists() or self.islink(): -            self.fs.unlink(self.path) +            self.fs.unlink(self.get_internal_path())              return 1          return None      def do_duplicate(self, src):          self._createDir() -        if print_duplicate: +        if SCons.Node.print_duplicate:              print "dup: relinking variant '%s' from '%s'"%(self, src)          Unlink(self, None, None)          e = Link(self, src, None)          if isinstance(e, SCons.Errors.BuildError): -            desc = "Cannot duplicate `%s' in `%s': %s." % (src.path, self.dir.path, e.errstr) +            desc = "Cannot duplicate `%s' in `%s': %s." % (src.get_internal_path(), self.dir._path, e.errstr)              raise SCons.Errors.StopError(desc)          self.linked = 1          # The Link() action may or may not have actually @@ -2931,36 +3125,14 @@ class File(Base):          # _rexists attributes so they can be reevaluated.          self.clear() -    memoizer_counters.append(SCons.Memoize.CountValue('exists')) - +    @SCons.Memoize.CountMethodCall      def exists(self):          try:              return self._memo['exists']          except KeyError:              pass -        # Duplicate from source path if we are set up to do this. -        if self.duplicate and not self.is_derived() and not self.linked: -            src = self.srcnode() -            if src is not self: -                # At this point, src is meant to be copied in a variant directory. -                src = src.rfile() -                if src.abspath != self.abspath: -                    if src.exists(): -                        self.do_duplicate(src) -                        # Can't return 1 here because the duplication might -                        # not actually occur if the -n option is being used. -                    else: -                        # The source file does not exist.  Make sure no old -                        # copy remains in the variant directory. -                        if print_duplicate: -                            print "dup: no src for %s, unlinking old variant copy"%self -                        if Base.exists(self) or self.islink(): -                            self.fs.unlink(self.path) -                        # Return None explicitly because the Base.exists() call -                        # above will have cached its value if the file existed. -                        self._memo['exists'] = None -                        return None -        result = Base.exists(self) +         +        result = SCons.Node._exists_map[self._func_exists](self)          self._memo['exists'] = result          return result @@ -3037,7 +3209,7 @@ class File(Base):      def builder_set(self, builder):          SCons.Node.Node.builder_set(self, builder) -        self.changed_since_last_build = self.decide_target +        self.changed_since_last_build = 5      def built(self):          """Called just after this File node is successfully built. @@ -3054,10 +3226,10 @@ class File(Base):          if (not SCons.Node.interactive and               not hasattr(self.attributes, 'keep_targetinfo')):              # Ensure that the build infos get computed and cached...         -            self.store_info() +            SCons.Node.store_info_map[self.store_info](self)              # ... then release some more variables.              self._specific_sources = False -            self.labspath = None +            self._labspath = None              self._save_str()              self.cwd = None @@ -3116,16 +3288,6 @@ class File(Base):          except AttributeError:              return 1 -    def decide_source(self, target, prev_ni): -        return target.get_build_env().decide_source(self, target, prev_ni) - -    def decide_target(self, target, prev_ni): -        return target.get_build_env().decide_target(self, target, prev_ni) - -    # Initialize this Node's decider function to decide_source() because -    # every file is a source file until it has a Builder attached... -    changed_since_last_build = decide_source -      def is_up_to_date(self):          T = 0          if T: Trace('is_up_to_date(%s):' % self) @@ -3143,7 +3305,7 @@ class File(Base):                          e = LocalCopy(self, r, None)                          if isinstance(e, SCons.Errors.BuildError):                              raise  -                        self.store_info() +                        SCons.Node.store_info_map[self.store_info](self)                      if T: Trace(' 1\n')                      return 1              self.changed() @@ -3154,8 +3316,7 @@ class File(Base):              if T: Trace(' self.exists():  %s\n' % r)              return not r -    memoizer_counters.append(SCons.Memoize.CountValue('rfile')) - +    @SCons.Memoize.CountMethodCall      def rfile(self):          try:              return self._memo['rfile'] @@ -3257,7 +3418,7 @@ class File(Base):          # Append this node's signature...          sigs.append(self.get_contents_sig())          # ...and it's path -        sigs.append(self.path) +        sigs.append(self.get_internal_path())          # Merge this all into a single signature          result = self.cachesig = SCons.Util.MD5collect(sigs)          return result @@ -3273,10 +3434,6 @@ def get_default_fs():  class FileFinder(object):      """      """ -    if SCons.Memoize.use_memoizer: -        __metaclass__ = SCons.Memoize.Memoized_Metaclass - -    memoizer_counters = []      def __init__(self):          self._memo = {} @@ -3319,8 +3476,7 @@ class FileFinder(object):      def _find_file_key(self, filename, paths, verbose=None):          return (filename, paths) -    memoizer_counters.append(SCons.Memoize.CountDict('find_file', _find_file_key)) - +    @SCons.Memoize.CountDictCall(_find_file_key)      def find_file(self, filename, paths, verbose=None):          """          find_file(str, [Dir()]) -> [nodes] diff --git a/engine/SCons/Node/Python.py b/engine/SCons/Node/Python.py index 99773ab..b247ff6 100644 --- a/engine/SCons/Node/Python.py +++ b/engine/SCons/Node/Python.py @@ -27,20 +27,54 @@ Python nodes.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Node/Python.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Node/Python.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Node  class ValueNodeInfo(SCons.Node.NodeInfoBase): -    current_version_id = 1 +    __slots__ = ('csig',) +    current_version_id = 2      field_list = ['csig']      def str_to_node(self, s):          return Value(s) +    def __getstate__(self): +        """ +        Return all fields that shall be pickled. Walk the slots in the class +        hierarchy and add those to the state dictionary. If a '__dict__' slot is +        available, copy all entries to the dictionary. Also include the version +        id, which is fixed for all instances of a class. +        """ +        state = getattr(self, '__dict__', {}).copy() +        for obj in type(self).mro(): +            for name in getattr(obj,'__slots__',()): +                if hasattr(self, name): +                    state[name] = getattr(self, name) + +        state['_version_id'] = self.current_version_id +        try: +            del state['__weakref__'] +        except KeyError: +            pass +         +        return state + +    def __setstate__(self, state): +        """ +        Restore the attributes from a pickled state. +        """ +        # TODO check or discard version +        del state['_version_id'] +        for key, value in state.items(): +            if key not in ('__weakref__',): +                setattr(self, key, value) + +  class ValueBuildInfo(SCons.Node.BuildInfoBase): -    current_version_id = 1 +    __slots__ = () +    current_version_id = 2  class Value(SCons.Node.Node):      """A class for Python variables, typically passed on the command line  @@ -53,6 +87,8 @@ class Value(SCons.Node.Node):      def __init__(self, value, built_value=None):          SCons.Node.Node.__init__(self)          self.value = value +        self.changed_since_last_build = 6 +        self.store_info = 0          if built_value is not None:              self.built_value = built_value diff --git a/engine/SCons/Node/__init__.py b/engine/SCons/Node/__init__.py index a261ee7..79db894 100644 --- a/engine/SCons/Node/__init__.py +++ b/engine/SCons/Node/__init__.py @@ -41,7 +41,7 @@ be able to depend on any other type of "thing."  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Node/__init__.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Node/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import collections  import copy @@ -55,6 +55,8 @@ import SCons.Util  from SCons.Debug import Trace +print_duplicate = 0 +  def classname(obj):      return str(obj.__class__).split('.')[-1] @@ -105,6 +107,233 @@ Annotate = do_nothing  # clean builds and update runs (see release_target_info).  interactive = False +def is_derived_none(node): +    raise NotImplementedError + +def is_derived_node(node): +    """ +        Returns true if this node is derived (i.e. built). +    """ +    return node.has_builder() or node.side_effect + +_is_derived_map = {0 : is_derived_none, +                   1 : is_derived_node} + +def exists_none(node): +    raise NotImplementedError + +def exists_always(node): +    return 1 + +def exists_base(node): +    return node.stat() is not None + +def exists_entry(node): +    """Return if the Entry exists.  Check the file system to see +    what we should turn into first.  Assume a file if there's no +    directory.""" +    node.disambiguate() +    return _exists_map[node._func_exists](node) + +def exists_file(node): +    # Duplicate from source path if we are set up to do this. +    if node.duplicate and not node.is_derived() and not node.linked: +        src = node.srcnode() +        if src is not node: +            # At this point, src is meant to be copied in a variant directory. +            src = src.rfile() +            if src.get_abspath() != node.get_abspath(): +                if src.exists(): +                    node.do_duplicate(src) +                    # Can't return 1 here because the duplication might +                    # not actually occur if the -n option is being used. +                else: +                    # The source file does not exist.  Make sure no old +                    # copy remains in the variant directory. +                    if print_duplicate: +                        print "dup: no src for %s, unlinking old variant copy"%self +                    if exists_base(node) or node.islink(): +                        node.fs.unlink(node.get_internal_path()) +                    # Return None explicitly because the Base.exists() call +                    # above will have cached its value if the file existed. +                    return None +    return exists_base(node) + +_exists_map = {0 : exists_none, +               1 : exists_always, +               2 : exists_base, +               3 : exists_entry, +               4 : exists_file} + + +def rexists_none(node): +    raise NotImplementedError + +def rexists_node(node): +    return node.exists() + +def rexists_base(node): +    return node.rfile().exists() + +_rexists_map = {0 : rexists_none, +                1 : rexists_node, +                2 : rexists_base} + +def get_contents_none(node): +    raise NotImplementedError + +def get_contents_entry(node): +    """Fetch the contents of the entry.  Returns the exact binary +    contents of the file.""" +    try: +        node = node.disambiguate(must_exist=1) +    except SCons.Errors.UserError: +        # There was nothing on disk with which to disambiguate +        # this entry.  Leave it as an Entry, but return a null +        # string so calls to get_contents() in emitters and the +        # like (e.g. in qt.py) don't have to disambiguate by hand +        # or catch the exception. +        return '' +    else: +        return _get_contents_map[node._func_get_contents](node) + +def get_contents_dir(node): +    """Return content signatures and names of all our children +    separated by new-lines. Ensure that the nodes are sorted.""" +    contents = [] +    for n in sorted(node.children(), key=lambda t: t.name): +        contents.append('%s %s\n' % (n.get_csig(), n.name)) +    return ''.join(contents) + +def get_contents_file(node):     +    if not node.rexists(): +        return '' +    fname = node.rfile().get_abspath() +    try: +        contents = open(fname, "rb").read() +    except EnvironmentError, e: +        if not e.filename: +            e.filename = fname +        raise +    return contents + +_get_contents_map = {0 : get_contents_none, +                     1 : get_contents_entry, +                     2 : get_contents_dir, +                     3 : get_contents_file} + +def target_from_source_none(node, prefix, suffix, splitext): +    raise NotImplementedError + +def target_from_source_base(node, prefix, suffix, splitext): +    return node.dir.Entry(prefix + splitext(node.name)[0] + suffix) + +_target_from_source_map = {0 : target_from_source_none, +                           1 : target_from_source_base} + +# +# The new decider subsystem for Nodes +# +# We would set and overwrite the changed_since_last_build function +# before, but for being able to use slots (less memory!) we now have +# a dictionary of the different decider functions. Then in the Node +# subclasses we simply store the index to the decider that should be +# used by it. +# + +# +# First, the single decider functions +# +def changed_since_last_build_node(node, target, prev_ni): +    """ + +    Must be overridden in a specific subclass to return True if this +    Node (a dependency) has changed since the last time it was used +    to build the specified target.  prev_ni is this Node's state (for +    example, its file timestamp, length, maybe content signature) +    as of the last time the target was built. + +    Note that this method is called through the dependency, not the +    target, because a dependency Node must be able to use its own +    logic to decide if it changed.  For example, File Nodes need to +    obey if we're configured to use timestamps, but Python Value Nodes +    never use timestamps and always use the content.  If this method +    were called through the target, then each Node's implementation +    of this method would have to have more complicated logic to +    handle all the different Node types on which it might depend. +    """ +    raise NotImplementedError + +def changed_since_last_build_alias(node, target, prev_ni): +    cur_csig = node.get_csig() +    try: +        return cur_csig != prev_ni.csig +    except AttributeError: +        return 1 + +def changed_since_last_build_entry(node, target, prev_ni): +    node.disambiguate() +    return _decider_map[node.changed_since_last_build](node, target, prev_ni) + +def changed_since_last_build_state_changed(node, target, prev_ni): +    return (node.state != SCons.Node.up_to_date) + +def decide_source(node, target, prev_ni): +    return target.get_build_env().decide_source(node, target, prev_ni) + +def decide_target(node, target, prev_ni): +    return target.get_build_env().decide_target(node, target, prev_ni) + +def changed_since_last_build_python(node, target, prev_ni): +    cur_csig = node.get_csig() +    try: +        return cur_csig != prev_ni.csig +    except AttributeError: +        return 1 + + +# +# Now, the mapping from indices to decider functions +# +_decider_map = {0 : changed_since_last_build_node, +               1 : changed_since_last_build_alias, +               2 : changed_since_last_build_entry, +               3 : changed_since_last_build_state_changed, +               4 : decide_source, +               5 : decide_target, +               6 : changed_since_last_build_python} + +do_store_info = True + +# +# The new store_info subsystem for Nodes +# +# We would set and overwrite the store_info function +# before, but for being able to use slots (less memory!) we now have +# a dictionary of the different functions. Then in the Node +# subclasses we simply store the index to the info method that should be +# used by it. +# + +# +# First, the single info functions +# + +def store_info_pass(node): +    pass + +def store_info_file(node): +    # Merge our build information into the already-stored entry. +    # This accommodates "chained builds" where a file that's a target +    # in one build (SConstruct file) is a source in a different build. +    # See test/chained-build.py for the use case. +    if do_store_info: +        node.dir.sconsign().store_info(node.name, node) + + +store_info_map = {0 : store_info_pass, +                  1 : store_info_file} +  # Classes for signature info for Nodes.  class NodeInfoBase(object): @@ -114,11 +343,8 @@ class NodeInfoBase(object):      Node subclasses should subclass NodeInfoBase to provide their own      logic for dealing with their own Node-specific signature information.      """ -    current_version_id = 1 -    def __init__(self, node=None): -        # Create an object attribute from the class attribute so it ends up -        # in the pickled data in the .sconsign file. -        self._version_id = self.current_version_id +    __slots__ = ('__weakref__',) +    current_version_id = 2      def update(self, node):          try:              field_list = self.field_list @@ -138,13 +364,25 @@ class NodeInfoBase(object):      def convert(self, node, val):          pass      def merge(self, other): -        self.__dict__.update(other.__dict__) +        """ +        Merge the fields of another object into this object. Already existing +        information is overwritten by the other instance's data. +        WARNING: If a '__dict__' slot is added, it should be updated instead of +        replaced. +        """ +        state = other.__getstate__() +        self.__setstate__(state)      def format(self, field_list=None, names=0):          if field_list is None:              try:                  field_list = self.field_list              except AttributeError: -                field_list = sorted(self.__dict__.keys()) +                field_list = getattr(self, '__dict__', {}).keys() +                for obj in type(self).mro(): +                    for slot in getattr(obj, '__slots__', ()): +                        if slot not in ('__weakref__', '__dict__'): +                            field_list.append(slot) +                field_list.sort()          fields = []          for field in field_list:              try: @@ -157,6 +395,38 @@ class NodeInfoBase(object):              fields.append(f)          return fields +    def __getstate__(self): +        """ +        Return all fields that shall be pickled. Walk the slots in the class +        hierarchy and add those to the state dictionary. If a '__dict__' slot is +        available, copy all entries to the dictionary. Also include the version +        id, which is fixed for all instances of a class. +        """ +        state = getattr(self, '__dict__', {}).copy() +        for obj in type(self).mro(): +            for name in getattr(obj,'__slots__',()): +                if hasattr(self, name): +                    state[name] = getattr(self, name) +     +        state['_version_id'] = self.current_version_id +        try: +            del state['__weakref__'] +        except KeyError: +            pass +        return state +     +    def __setstate__(self, state): +        """ +        Restore the attributes from a pickled state. The version is discarded. +        """ +        # TODO check or discard version +        del state['_version_id'] +     +        for key, value in state.items(): +            if key not in ('__weakref__',): +                setattr(self, key, value) + +  class BuildInfoBase(object):      """      The generic base class for build information for a Node. @@ -167,30 +437,106 @@ class BuildInfoBase(object):      generic build stuff we have to track:  sources, explicit dependencies,      implicit dependencies, and action information.      """ -    current_version_id = 1 -    def __init__(self, node=None): +    __slots__ = ("bsourcesigs", "bdependsigs", "bimplicitsigs", "bactsig", +                 "bsources", "bdepends", "bact", "bimplicit", "__weakref__") +    current_version_id = 2 +    def __init__(self):          # Create an object attribute from the class attribute so it ends up          # in the pickled data in the .sconsign file. -        self._version_id = self.current_version_id          self.bsourcesigs = []          self.bdependsigs = []          self.bimplicitsigs = []          self.bactsig = None      def merge(self, other): -        self.__dict__.update(other.__dict__) +        """ +        Merge the fields of another object into this object. Already existing +        information is overwritten by the other instance's data. +        WARNING: If a '__dict__' slot is added, it should be updated instead of +        replaced. +        """ +        state = other.__getstate__() +        self.__setstate__(state) +  +    def __getstate__(self): +        """ +        Return all fields that shall be pickled. Walk the slots in the class +        hierarchy and add those to the state dictionary. If a '__dict__' slot is +        available, copy all entries to the dictionary. Also include the version +        id, which is fixed for all instances of a class. +        """ +        state = getattr(self, '__dict__', {}).copy() +        for obj in type(self).mro(): +            for name in getattr(obj,'__slots__',()): +                if hasattr(self, name): +                    state[name] = getattr(self, name) + +        state['_version_id'] = self.current_version_id +        try: +            del state['__weakref__'] +        except KeyError: +            pass +        return state + +    def __setstate__(self, state): +        """ +        Restore the attributes from a pickled state. +        """ +        # TODO check or discard version +        del state['_version_id'] +        for key, value in state.items(): +            if key not in ('__weakref__',): +                setattr(self, key, value)  class Node(object):      """The base Node class, for entities that we know how to      build, or use to build other Nodes.      """ -    if SCons.Memoize.use_memoizer: -        __metaclass__ = SCons.Memoize.Memoized_Metaclass - -    memoizer_counters = [] +    __slots__ = ['sources', +                 'sources_set', +                 '_specific_sources', +                 'depends', +                 'depends_set', +                 'ignore', +                 'ignore_set', +                 'prerequisites', +                 'implicit', +                 'waiting_parents', +                 'waiting_s_e', +                 'ref_count', +                 'wkids', +                 'env', +                 'state', +                 'precious', +                 'noclean', +                 'nocache', +                 'cached', +                 'always_build', +                 'includes', +                 'attributes', +                 'side_effect', +                 'side_effects', +                 'linked', +                 '_memo', +                 'executor', +                 'binfo', +                 'ninfo', +                 'builder', +                 'is_explicit', +                 'implicit_set', +                 'changed_since_last_build', +                 'store_info', +                 'pseudo', +                 '_tags', +                 '_func_is_derived', +                 '_func_exists', +                 '_func_rexists', +                 '_func_get_contents', +                 '_func_target_from_source']      class Attrs(object): -        pass +        __slots__ = ('shared', '__dict__') +       def __init__(self):          if SCons.Debug.track_instances: logInstanceCreation(self, 'Node.Node') @@ -234,7 +580,15 @@ class Node(object):          self.side_effect = 0 # true iff this node is a side effect          self.side_effects = [] # the side effects of building this target          self.linked = 0 # is this node linked to the variant directory? - +        self.changed_since_last_build = 0 +        self.store_info = 0 +        self._tags = None +        self._func_is_derived = 1 +        self._func_exists = 1 +        self._func_rexists = 1 +        self._func_get_contents = 0 +        self._func_target_from_source = 0 +                  self.clear_memoized_values()          # Let the interface in which the build engine is embedded @@ -248,8 +602,7 @@ class Node(object):      def get_suffix(self):          return '' -    memoizer_counters.append(SCons.Memoize.CountValue('get_build_env')) - +    @SCons.Memoize.CountMethodCall      def get_build_env(self):          """Fetch the appropriate Environment to build this node.          """ @@ -418,7 +771,7 @@ class Node(object):              pass          else:              self.ninfo.update(self) -            self.store_info() +            SCons.Node.store_info_map[self.store_info](self)      def release_target_info(self):          """Called just after this node has been marked @@ -546,7 +899,7 @@ class Node(object):          example: source with source builders are not derived in this sense,          and hence should not return true.          """ -        return self.has_builder() or self.side_effect +        return _is_derived_map[self._func_is_derived](self)      def alter_targets(self):          """Return a list of alternate targets for this Node. @@ -706,7 +1059,7 @@ class Node(object):      BuildInfo = BuildInfoBase      def new_ninfo(self): -        ninfo = self.NodeInfo(self) +        ninfo = self.NodeInfo()          return ninfo      def get_ninfo(self): @@ -717,7 +1070,7 @@ class Node(object):              return self.ninfo      def new_binfo(self): -        binfo = self.BuildInfo(self) +        binfo = self.BuildInfo()          return binfo      def get_binfo(self): @@ -802,14 +1155,6 @@ class Node(object):      def get_cachedir_csig(self):          return self.get_csig() -    def store_info(self): -        """Make the build signature permanent (that is, store it in the -        .sconsign file or equivalent).""" -        pass - -    def do_not_store_info(self): -        pass -      def get_stored_info(self):          return None @@ -847,13 +1192,16 @@ class Node(object):      def exists(self):          """Does this node exists?""" -        # All node exist by default: -        return 1 +        return _exists_map[self._func_exists](self)      def rexists(self):          """Does this node exist locally or in a repositiory?"""          # There are no repositories by default: -        return self.exists() +        return _rexists_map[self._func_rexists](self) + +    def get_contents(self): +        """Fetch the contents of the entry.""" +        return _get_contents_map[self._func_get_contents](self)      def missing(self):          return not self.is_derived() and \ @@ -941,11 +1289,10 @@ class Node(object):          # build info that it's cached so we can re-calculate it.          self.executor_cleanup() -    memoizer_counters.append(SCons.Memoize.CountValue('_children_get')) - +    @SCons.Memoize.CountMethodCall      def _children_get(self):          try: -            return self._memo['children_get'] +            return self._memo['_children_get']          except KeyError:              pass @@ -976,7 +1323,7 @@ class Node(object):          else:              children = self.all_children(scan=0) -        self._memo['children_get'] = children +        self._memo['_children_get'] = children          return children      def all_children(self, scan=1): @@ -1016,9 +1363,6 @@ class Node(object):      def get_state(self):          return self.state -    def state_has_changed(self, target, prev_ni): -        return (self.state != SCons.Node.up_to_date) -      def get_env(self):          env = self.env          if not env: @@ -1026,28 +1370,28 @@ class Node(object):              env = SCons.Defaults.DefaultEnvironment()          return env -    def changed_since_last_build(self, target, prev_ni): -        """ - -        Must be overridden in a specific subclass to return True if this -        Node (a dependency) has changed since the last time it was used -        to build the specified target.  prev_ni is this Node's state (for -        example, its file timestamp, length, maybe content signature) -        as of the last time the target was built. - -        Note that this method is called through the dependency, not the -        target, because a dependency Node must be able to use its own -        logic to decide if it changed.  For example, File Nodes need to -        obey if we're configured to use timestamps, but Python Value Nodes -        never use timestamps and always use the content.  If this method -        were called through the target, then each Node's implementation -        of this method would have to have more complicated logic to -        handle all the different Node types on which it might depend. -        """ -        raise NotImplementedError -      def Decider(self, function): -        SCons.Util.AddMethod(self, function, 'changed_since_last_build') +        foundkey = None +        for k, v in _decider_map.iteritems(): +            if v == function: +                foundkey = k +                break +        if not foundkey: +            foundkey = len(_decider_map) +            _decider_map[foundkey] = function +        self.changed_since_last_build = foundkey + +    def Tag(self, key, value): +        """ Add a user-defined tag. """ +        if not self._tags: +            self._tags = {} +        self._tags[key] = value + +    def GetTag(self, key): +        """ Return a user-defined tag. """ +        if not self._tags: +            return None +        return self._tags.get(key, None)      def changed(self, node=None, allowcache=False):          """ @@ -1095,7 +1439,7 @@ class Node(object):              result = True          for child, prev_ni in zip(children, then): -            if child.changed_since_last_build(self, prev_ni): +            if _decider_map[child.changed_since_last_build](child, self, prev_ni):                  if t: Trace(': %s changed' % child)                  result = True @@ -1266,7 +1610,7 @@ class Node(object):          for k in new_bkids:              if not k in old_bkids:                  lines.append("`%s' is a new dependency\n" % stringify(k)) -            elif k.changed_since_last_build(self, osig[k]): +            elif _decider_map[k.changed_since_last_build](k, self, osig[k]):                  lines.append("`%s' changed\n" % stringify(k))          if len(lines) == 0 and old_bkids != new_bkids: diff --git a/engine/SCons/Options/BoolOption.py b/engine/SCons/Options/BoolOption.py index 33ed315..c8d901f 100644 --- a/engine/SCons/Options/BoolOption.py +++ b/engine/SCons/Options/BoolOption.py @@ -21,7 +21,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Options/BoolOption.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Options/BoolOption.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __doc__ = """Place-holder for the old SCons.Options module hierarchy diff --git a/engine/SCons/Options/EnumOption.py b/engine/SCons/Options/EnumOption.py index 8a3601b..58b99ef 100644 --- a/engine/SCons/Options/EnumOption.py +++ b/engine/SCons/Options/EnumOption.py @@ -21,7 +21,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Options/EnumOption.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Options/EnumOption.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __doc__ = """Place-holder for the old SCons.Options module hierarchy diff --git a/engine/SCons/Options/ListOption.py b/engine/SCons/Options/ListOption.py index f32ebb6..00c93d9 100644 --- a/engine/SCons/Options/ListOption.py +++ b/engine/SCons/Options/ListOption.py @@ -21,7 +21,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Options/ListOption.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Options/ListOption.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __doc__ = """Place-holder for the old SCons.Options module hierarchy diff --git a/engine/SCons/Options/PackageOption.py b/engine/SCons/Options/PackageOption.py index 2a70d27..56624f0 100644 --- a/engine/SCons/Options/PackageOption.py +++ b/engine/SCons/Options/PackageOption.py @@ -21,7 +21,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Options/PackageOption.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Options/PackageOption.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __doc__ = """Place-holder for the old SCons.Options module hierarchy diff --git a/engine/SCons/Options/PathOption.py b/engine/SCons/Options/PathOption.py index 4450b02..a4b81ec 100644 --- a/engine/SCons/Options/PathOption.py +++ b/engine/SCons/Options/PathOption.py @@ -21,7 +21,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Options/PathOption.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Options/PathOption.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __doc__ = """Place-holder for the old SCons.Options module hierarchy diff --git a/engine/SCons/Options/__init__.py b/engine/SCons/Options/__init__.py index 4595b5a..5099712 100644 --- a/engine/SCons/Options/__init__.py +++ b/engine/SCons/Options/__init__.py @@ -21,7 +21,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Options/__init__.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Options/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __doc__ = """Place-holder for the old SCons.Options module hierarchy diff --git a/engine/SCons/PathList.py b/engine/SCons/PathList.py index a69a64c..b359144 100644 --- a/engine/SCons/PathList.py +++ b/engine/SCons/PathList.py @@ -21,7 +21,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/PathList.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/PathList.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __doc__ = """SCons.PathList @@ -171,11 +171,6 @@ class PathListCache(object):      cheaply avoid re-parsing both values of CPPPATH by using the      common value from this cache.      """ -    if SCons.Memoize.use_memoizer: -        __metaclass__ = SCons.Memoize.Memoized_Metaclass - -    memoizer_counters = [] -      def __init__(self):          self._memo = {} @@ -196,8 +191,7 @@ class PathListCache(object):              pathlist = tuple(SCons.Util.flatten(pathlist))          return pathlist -    memoizer_counters.append(SCons.Memoize.CountDict('PathList', _PathList_key)) - +    @SCons.Memoize.CountDictCall(_PathList_key)      def PathList(self, pathlist):          """          Returns the cached _PathList object for the specified pathlist, diff --git a/engine/SCons/Platform/__init__.py b/engine/SCons/Platform/__init__.py index aa3c58f..ca4bc9b 100644 --- a/engine/SCons/Platform/__init__.py +++ b/engine/SCons/Platform/__init__.py @@ -42,7 +42,7 @@ their own platform definition.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Platform/__init__.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Platform/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.compat diff --git a/engine/SCons/Platform/aix.py b/engine/SCons/Platform/aix.py index 40f714e..44bccd1 100644 --- a/engine/SCons/Platform/aix.py +++ b/engine/SCons/Platform/aix.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Platform/aix.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Platform/aix.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os  import subprocess diff --git a/engine/SCons/Platform/cygwin.py b/engine/SCons/Platform/cygwin.py index e30fa65..d04bbe7 100644 --- a/engine/SCons/Platform/cygwin.py +++ b/engine/SCons/Platform/cygwin.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Platform/cygwin.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Platform/cygwin.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import posix  from SCons.Platform import TempFileMunge diff --git a/engine/SCons/Platform/darwin.py b/engine/SCons/Platform/darwin.py index d494961..efd8ba4 100644 --- a/engine/SCons/Platform/darwin.py +++ b/engine/SCons/Platform/darwin.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Platform/darwin.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Platform/darwin.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import posix  import os diff --git a/engine/SCons/Platform/hpux.py b/engine/SCons/Platform/hpux.py index 4e73361..2e2fbca 100644 --- a/engine/SCons/Platform/hpux.py +++ b/engine/SCons/Platform/hpux.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Platform/hpux.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Platform/hpux.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import posix diff --git a/engine/SCons/Platform/irix.py b/engine/SCons/Platform/irix.py index 3084b3a..3bedbdf 100644 --- a/engine/SCons/Platform/irix.py +++ b/engine/SCons/Platform/irix.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Platform/irix.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Platform/irix.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import posix diff --git a/engine/SCons/Platform/os2.py b/engine/SCons/Platform/os2.py index 1190947..82eb163 100644 --- a/engine/SCons/Platform/os2.py +++ b/engine/SCons/Platform/os2.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Platform/os2.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Platform/os2.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import win32  def generate(env): diff --git a/engine/SCons/Platform/posix.py b/engine/SCons/Platform/posix.py index 9fe5aa5..8445863 100644 --- a/engine/SCons/Platform/posix.py +++ b/engine/SCons/Platform/posix.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Platform/posix.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Platform/posix.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import errno  import os diff --git a/engine/SCons/Platform/sunos.py b/engine/SCons/Platform/sunos.py index cca5a44..1c1d797 100644 --- a/engine/SCons/Platform/sunos.py +++ b/engine/SCons/Platform/sunos.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Platform/sunos.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Platform/sunos.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import posix diff --git a/engine/SCons/Platform/win32.py b/engine/SCons/Platform/win32.py index 7293489..3bad86b 100644 --- a/engine/SCons/Platform/win32.py +++ b/engine/SCons/Platform/win32.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Platform/win32.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Platform/win32.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os  import os.path diff --git a/engine/SCons/SConf.py b/engine/SCons/SConf.py index 442983e..2ef4003 100644 --- a/engine/SCons/SConf.py +++ b/engine/SCons/SConf.py @@ -34,7 +34,7 @@ libraries are installed, if some command line options are supported etc.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/SConf.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/SConf.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.compat @@ -175,8 +175,11 @@ class SConfBuildInfo(SCons.Node.FS.FileBuildInfo):      are result (did the builder succeed last time?) and string, which      contains messages of the original build phase.      """ -    result = None # -> 0/None -> no error, != 0 error -    string = None # the stdout / stderr output when building the target +    __slots__ = ('result', 'string') +     +    def __init__(self): +        self.result = None # -> 0/None -> no error, != 0 error +        self.string = None # the stdout / stderr output when building the target      def set_build_result(self, result, string):          self.result = result @@ -352,8 +355,10 @@ class SConfBuildTask(SCons.Taskmaster.AlwaysTask):                  raise SCons.Errors.ExplicitExit(self.targets[0],exc_value.code)              except Exception, e:                  for t in self.targets: -                    binfo = t.get_binfo() -                    binfo.__class__ = SConfBuildInfo +                    #binfo = t.get_binfo() +                    #binfo.__class__ = SConfBuildInfo +                    binfo = SConfBuildInfo() +                    binfo.merge(t.get_binfo())                      binfo.set_build_result(1, s.getvalue())                      sconsign_entry = SCons.SConsign.SConsignEntry()                      sconsign_entry.binfo = binfo @@ -370,8 +375,10 @@ class SConfBuildTask(SCons.Taskmaster.AlwaysTask):                  raise e              else:                  for t in self.targets: -                    binfo = t.get_binfo() -                    binfo.__class__ = SConfBuildInfo +                    #binfo = t.get_binfo() +                    #binfo.__class__ = SConfBuildInfo +                    binfo = SConfBuildInfo() +                    binfo.merge(t.get_binfo())                      binfo.set_build_result(0, s.getvalue())                      sconsign_entry = SCons.SConsign.SConsignEntry()                      sconsign_entry.binfo = binfo @@ -500,7 +507,7 @@ class SConfBase(object):          # we override the store_info() method with a null place-holder          # so we really control how it gets written.          for n in nodes: -            n.store_info = n.do_not_store_info +            n.store_info = 0              if not hasattr(n, 'attributes'):                  n.attributes = SCons.Node.Node.Attrs()              n.attributes.keep_targetinfo = 1 @@ -640,7 +647,7 @@ class SConfBase(object):          ok = self.TryLink(text, extension)          if( ok ):              prog = self.lastTarget -            pname = prog.path +            pname = prog.get_internal_path()              output = self.confdir.File(os.path.basename(pname)+'.out')              node = self.env.Command(output, prog, [ [ pname, ">", "${TARGET}"] ])              ok = self.BuildNodes(node) @@ -684,7 +691,6 @@ class SConfBase(object):          else:              if not os.path.isdir( dirName ):                  os.makedirs( dirName ) -                node._exists = 1      def _startup(self):          """Private method. Set up logstream, and set the environment diff --git a/engine/SCons/SConsign.py b/engine/SCons/SConsign.py index bb893c1..e31a3eb 100644 --- a/engine/SCons/SConsign.py +++ b/engine/SCons/SConsign.py @@ -27,7 +27,7 @@ Writing and reading information to the .sconsign file or files.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/SConsign.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/SConsign.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.compat @@ -122,16 +122,40 @@ class SConsignEntry(object):      XXX As coded below, we do expect a '.binfo' attribute to be added,      but we'll probably generalize this in the next refactorings.      """ -    current_version_id = 1 +    __slots__ = ("binfo", "ninfo", "__weakref__") +    current_version_id = 2 +          def __init__(self):          # Create an object attribute from the class attribute so it ends up          # in the pickled data in the .sconsign file. -        _version_id = self.current_version_id +        #_version_id = self.current_version_id +        pass +          def convert_to_sconsign(self):          self.binfo.convert_to_sconsign() +              def convert_from_sconsign(self, dir, name):          self.binfo.convert_from_sconsign(dir, name) +    def __getstate__(self): +        state = getattr(self, '__dict__', {}).copy() +        for obj in type(self).mro(): +            for name in getattr(obj,'__slots__',()): +                if hasattr(self, name): +                    state[name] = getattr(self, name) + +        state['_version_id'] = self.current_version_id +        try: +            del state['__weakref__'] +        except KeyError: +            pass +        return state + +    def __setstate__(self, state): +        for key, value in state.items(): +            if key not in ('_version_id','__weakref__'): +                setattr(self, key, value) +          class Base(object):      """      This is the controlling class for the signatures for the collection of @@ -202,7 +226,7 @@ class DB(Base):          # Read using the path relative to the top of the Repository          # (self.dir.tpath) from which we're fetching the signature          # information. -        path = normcase(dir.tpath) +        path = normcase(dir.get_tpath())          try:              rawentries = db[path]          except KeyError: @@ -217,7 +241,7 @@ class DB(Base):                  raise              except Exception, e:                  SCons.Warnings.warn(SCons.Warnings.CorruptSConsignWarning, -                                    "Ignoring corrupt sconsign entry : %s (%s)\n"%(self.dir.tpath, e)) +                                    "Ignoring corrupt sconsign entry : %s (%s)\n"%(self.dir.get_tpath(), e))              for key, entry in self.entries.items():                  entry.convert_from_sconsign(dir, key) @@ -244,7 +268,7 @@ class DB(Base):          # directory (self.dir.path), not relative to the top of          # the Repository; we only write to our own .sconsign file,          # not to .sconsign files in Repositories. -        path = normcase(self.dir.path) +        path = normcase(self.dir.get_internal_path())          for key, entry in self.entries.items():              entry.convert_to_sconsign()          db[path] = pickle.dumps(self.entries, 1) @@ -287,7 +311,7 @@ class DirFile(Dir):          """          self.dir = dir -        self.sconsign = os.path.join(dir.path, '.sconsign') +        self.sconsign = os.path.join(dir.get_internal_path(), '.sconsign')          try:              fp = open(self.sconsign, 'rb') @@ -323,7 +347,7 @@ class DirFile(Dir):          self.merge() -        temp = os.path.join(self.dir.path, '.scons%d' % os.getpid()) +        temp = os.path.join(self.dir.get_internal_path(), '.scons%d' % os.getpid())          try:              file = open(temp, 'wb')              fname = temp diff --git a/engine/SCons/Scanner/C.py b/engine/SCons/Scanner/C.py index a1db3f6..33e1145 100644 --- a/engine/SCons/Scanner/C.py +++ b/engine/SCons/Scanner/C.py @@ -27,7 +27,7 @@ This module implements the depenency scanner for C/C++ code.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Scanner/C.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Scanner/C.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Node.FS  import SCons.Scanner diff --git a/engine/SCons/Scanner/D.py b/engine/SCons/Scanner/D.py index d4834c2..2c51a09 100644 --- a/engine/SCons/Scanner/D.py +++ b/engine/SCons/Scanner/D.py @@ -30,7 +30,7 @@ Coded by Andy Friesen  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Scanner/D.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Scanner/D.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import re diff --git a/engine/SCons/Scanner/Dir.py b/engine/SCons/Scanner/Dir.py index 9ede571..7565423 100644 --- a/engine/SCons/Scanner/Dir.py +++ b/engine/SCons/Scanner/Dir.py @@ -20,7 +20,7 @@  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Scanner/Dir.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Scanner/Dir.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Node.FS  import SCons.Scanner @@ -77,7 +77,7 @@ def scan_on_disk(node, env, path=()):      that and then call the in-memory scanning function.      """      try: -        flist = node.fs.listdir(node.abspath) +        flist = node.fs.listdir(node.get_abspath())      except (IOError, OSError):          return []      e = node.Entry diff --git a/engine/SCons/Scanner/Fortran.py b/engine/SCons/Scanner/Fortran.py index 690f71a..a1f3927 100644 --- a/engine/SCons/Scanner/Fortran.py +++ b/engine/SCons/Scanner/Fortran.py @@ -26,7 +26,7 @@ This module implements the dependency scanner for Fortran code.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Scanner/Fortran.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Scanner/Fortran.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import re diff --git a/engine/SCons/Scanner/IDL.py b/engine/SCons/Scanner/IDL.py index 892858c..6758bd2 100644 --- a/engine/SCons/Scanner/IDL.py +++ b/engine/SCons/Scanner/IDL.py @@ -28,7 +28,7 @@ Definition Language) files.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Scanner/IDL.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Scanner/IDL.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Node.FS  import SCons.Scanner diff --git a/engine/SCons/Scanner/LaTeX.py b/engine/SCons/Scanner/LaTeX.py index 2c4fcbb..aed074c 100644 --- a/engine/SCons/Scanner/LaTeX.py +++ b/engine/SCons/Scanner/LaTeX.py @@ -27,7 +27,7 @@ This module implements the dependency scanner for LaTeX code.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Scanner/LaTeX.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Scanner/LaTeX.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os.path  import re diff --git a/engine/SCons/Scanner/Prog.py b/engine/SCons/Scanner/Prog.py index 48dcddf..c0511dc 100644 --- a/engine/SCons/Scanner/Prog.py +++ b/engine/SCons/Scanner/Prog.py @@ -21,7 +21,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Scanner/Prog.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Scanner/Prog.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Node  import SCons.Node.FS diff --git a/engine/SCons/Scanner/RC.py b/engine/SCons/Scanner/RC.py index 29044c0..f73b47e 100644 --- a/engine/SCons/Scanner/RC.py +++ b/engine/SCons/Scanner/RC.py @@ -28,7 +28,7 @@ Definition Language) files.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Scanner/RC.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Scanner/RC.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Node.FS  import SCons.Scanner diff --git a/engine/SCons/Scanner/__init__.py b/engine/SCons/Scanner/__init__.py index cb73a69..d51cb9e 100644 --- a/engine/SCons/Scanner/__init__.py +++ b/engine/SCons/Scanner/__init__.py @@ -27,7 +27,7 @@ The Scanner package for the SCons software construction utility.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Scanner/__init__.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Scanner/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import re diff --git a/engine/SCons/Script/Interactive.py b/engine/SCons/Script/Interactive.py index b650e84..afcde0c 100644 --- a/engine/SCons/Script/Interactive.py +++ b/engine/SCons/Script/Interactive.py @@ -20,7 +20,7 @@  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Script/Interactive.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Script/Interactive.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __doc__ = """  SCons interactive mode diff --git a/engine/SCons/Script/Main.py b/engine/SCons/Script/Main.py index eb3b5de..6684fbd 100644 --- a/engine/SCons/Script/Main.py +++ b/engine/SCons/Script/Main.py @@ -34,7 +34,7 @@ deprecated_python_version = (2, 7, 0)  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Script/Main.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Script/Main.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.compat @@ -214,7 +214,7 @@ class BuildTask(SCons.Taskmaster.OutOfDateTask):          if self.top and not t.has_builder() and not t.side_effect:              if not t.exists():                  if t.__class__.__name__ in ('File', 'Dir', 'Entry'): -                    errstr="Do not know how to make %s target `%s' (%s)." % (t.__class__.__name__, t, t.abspath) +                    errstr="Do not know how to make %s target `%s' (%s)." % (t.__class__.__name__, t, t.get_abspath())                  else: # Alias or Python or ...                      errstr="Do not know how to make %s target `%s'." % (t.__class__.__name__, t)                  sys.stderr.write("scons: *** " + errstr) @@ -351,7 +351,7 @@ class CleanTask(SCons.Taskmaster.AlwaysTask):          if target in SCons.Environment.CleanTargets:              files = SCons.Environment.CleanTargets[target]              for f in files: -                self.fs_delete(f.abspath, str(f), remove) +                self.fs_delete(f.get_abspath(), str(f), remove)      def show(self):          for t in self._get_files_to_clean(): @@ -672,7 +672,7 @@ def _set_debug_values(options):      if "prepare" in debug_values:          SCons.Taskmaster.print_prepare = 1      if "duplicate" in debug_values: -        SCons.Node.FS.print_duplicate = 1 +        SCons.Node.print_duplicate = 1  def _create_path(plist):      path = '.' @@ -946,9 +946,9 @@ def _main(parser):          progress_display.set_mode(0)      if options.site_dir: -        _load_site_scons_dir(d.path, options.site_dir) +        _load_site_scons_dir(d.get_internal_path(), options.site_dir)      elif not options.no_site_dir: -        _load_all_site_scons_dirs(d.path) +        _load_all_site_scons_dirs(d.get_internal_path())      if options.include_dir:          sys.path = options.include_dir + sys.path @@ -1111,7 +1111,6 @@ def _build_targets(fs, options, targets, target_top):      display.set_mode(not options.silent)      SCons.Action.print_actions          = not options.silent      SCons.Action.execute_actions        = not options.no_exec -    SCons.Node.FS.do_store_info         = not options.no_exec      SCons.Node.do_store_info            = not options.no_exec      SCons.SConf.dryrun                  = options.no_exec diff --git a/engine/SCons/Script/SConsOptions.py b/engine/SCons/Script/SConsOptions.py index 2258533..7e458aa 100644 --- a/engine/SCons/Script/SConsOptions.py +++ b/engine/SCons/Script/SConsOptions.py @@ -21,7 +21,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Script/SConsOptions.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Script/SConsOptions.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import optparse  import re diff --git a/engine/SCons/Script/SConscript.py b/engine/SCons/Script/SConscript.py index 9240717..ead6f2e 100644 --- a/engine/SCons/Script/SConscript.py +++ b/engine/SCons/Script/SConscript.py @@ -28,7 +28,7 @@ files.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  from __future__ import division -__revision__ = "src/engine/SCons/Script/SConscript.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Script/SConscript.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons  import SCons.Action @@ -265,7 +265,7 @@ def _SConscript(fs, *files, **kw):                              call_stack[-1].globals.update({__file__:old_file})                  else:                      SCons.Warnings.warn(SCons.Warnings.MissingSConscriptWarning, -                             "Ignoring missing SConscript '%s'" % f.path) +                             "Ignoring missing SConscript '%s'" % f.get_internal_path())          finally:              SCons.Script.sconscript_reading = SCons.Script.sconscript_reading - 1 @@ -438,7 +438,7 @@ class SConsEnvironment(SCons.Environment.Base):                      fname = fn.get_path(src_dir)                      files = [os.path.join(str(variant_dir), fname)]                  else: -                    files = [fn.abspath] +                    files = [fn.get_abspath()]                  kw['src_dir'] = variant_dir              self.fs.VariantDir(variant_dir, src_dir, duplicate) diff --git a/engine/SCons/Script/__init__.py b/engine/SCons/Script/__init__.py index f2cce2d..c21882f 100644 --- a/engine/SCons/Script/__init__.py +++ b/engine/SCons/Script/__init__.py @@ -34,7 +34,7 @@ it goes here.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Script/__init__.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Script/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import time  start_time = time.time() diff --git a/engine/SCons/Sig.py b/engine/SCons/Sig.py index 702889c..e949cfb 100644 --- a/engine/SCons/Sig.py +++ b/engine/SCons/Sig.py @@ -21,7 +21,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Sig.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Sig.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __doc__ = """Place-holder for the old SCons.Sig module hierarchy diff --git a/engine/SCons/Subst.py b/engine/SCons/Subst.py index 565e15c..da0fa68 100644 --- a/engine/SCons/Subst.py +++ b/engine/SCons/Subst.py @@ -26,7 +26,7 @@ SCons string substitution.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Subst.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Subst.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import collections  import re diff --git a/engine/SCons/Taskmaster.py b/engine/SCons/Taskmaster.py index bc008f3..b303f79 100644 --- a/engine/SCons/Taskmaster.py +++ b/engine/SCons/Taskmaster.py @@ -47,7 +47,7 @@ interface and the SCons build engine.  There are two key classes here:          target(s) that it decides need to be evaluated and/or built.  """ -__revision__ = "src/engine/SCons/Taskmaster.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Taskmaster.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  from itertools import chain  import operator @@ -242,7 +242,7 @@ class Task(object):                  #                  for t in cached_targets:                      try: -                        t.fs.unlink(t.path) +                        t.fs.unlink(t.get_internal_path())                      except (IOError, OSError):                          pass                  self.targets[0].build() diff --git a/engine/SCons/Tool/386asm.py b/engine/SCons/Tool/386asm.py index 2559d4a..06d271e 100644 --- a/engine/SCons/Tool/386asm.py +++ b/engine/SCons/Tool/386asm.py @@ -32,7 +32,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/386asm.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/386asm.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  from SCons.Tool.PharLapCommon import addPharLapPaths  import SCons.Util diff --git a/engine/SCons/Tool/BitKeeper.py b/engine/SCons/Tool/BitKeeper.py index 5956a14..9df9f59 100644 --- a/engine/SCons/Tool/BitKeeper.py +++ b/engine/SCons/Tool/BitKeeper.py @@ -32,7 +32,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/BitKeeper.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/BitKeeper.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Action  import SCons.Builder diff --git a/engine/SCons/Tool/CVS.py b/engine/SCons/Tool/CVS.py index 07d8d58..14bc18e 100644 --- a/engine/SCons/Tool/CVS.py +++ b/engine/SCons/Tool/CVS.py @@ -29,7 +29,7 @@ selection method.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/CVS.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/CVS.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Action  import SCons.Builder diff --git a/engine/SCons/Tool/DCommon.py b/engine/SCons/Tool/DCommon.py index cc08f72..db03660 100644 --- a/engine/SCons/Tool/DCommon.py +++ b/engine/SCons/Tool/DCommon.py @@ -28,7 +28,7 @@ Coded by Russel Winder (russel@winder.org.uk)  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/DCommon.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/DCommon.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os.path diff --git a/engine/SCons/Tool/FortranCommon.py b/engine/SCons/Tool/FortranCommon.py index 46b9aa5..b8ff7d9 100644 --- a/engine/SCons/Tool/FortranCommon.py +++ b/engine/SCons/Tool/FortranCommon.py @@ -27,7 +27,7 @@ Stuff for processing Fortran, common to all fortran dialects.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/FortranCommon.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/FortranCommon.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import re  import os.path diff --git a/engine/SCons/Tool/GettextCommon.py b/engine/SCons/Tool/GettextCommon.py index 9e94d5e..af9b074 100644 --- a/engine/SCons/Tool/GettextCommon.py +++ b/engine/SCons/Tool/GettextCommon.py @@ -24,7 +24,7 @@ Used by several tools of `gettext` toolset.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/GettextCommon.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/GettextCommon.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Warnings  import re diff --git a/engine/SCons/Tool/JavaCommon.py b/engine/SCons/Tool/JavaCommon.py index bbb982c..8b1e48e 100644 --- a/engine/SCons/Tool/JavaCommon.py +++ b/engine/SCons/Tool/JavaCommon.py @@ -27,7 +27,7 @@ Stuff for processing Java.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/JavaCommon.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/JavaCommon.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os  import os.path diff --git a/engine/SCons/Tool/MSCommon/__init__.py b/engine/SCons/Tool/MSCommon/__init__.py index 4ac3fae..90cb0bc 100644 --- a/engine/SCons/Tool/MSCommon/__init__.py +++ b/engine/SCons/Tool/MSCommon/__init__.py @@ -21,7 +21,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/MSCommon/__init__.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/MSCommon/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __doc__ = """  Common functions for Microsoft Visual Studio and Visual C/C++. diff --git a/engine/SCons/Tool/MSCommon/arch.py b/engine/SCons/Tool/MSCommon/arch.py index acd6383..5bc7ea5 100644 --- a/engine/SCons/Tool/MSCommon/arch.py +++ b/engine/SCons/Tool/MSCommon/arch.py @@ -21,7 +21,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/MSCommon/arch.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/MSCommon/arch.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __doc__ = """Module to define supported Windows chip architectures.  """ diff --git a/engine/SCons/Tool/MSCommon/common.py b/engine/SCons/Tool/MSCommon/common.py index 3a6c505..60d7d40 100644 --- a/engine/SCons/Tool/MSCommon/common.py +++ b/engine/SCons/Tool/MSCommon/common.py @@ -21,7 +21,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/MSCommon/common.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/MSCommon/common.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __doc__ = """  Common helper functions for working with the Microsoft tool chain. diff --git a/engine/SCons/Tool/MSCommon/netframework.py b/engine/SCons/Tool/MSCommon/netframework.py index 24e4218..0606e27 100644 --- a/engine/SCons/Tool/MSCommon/netframework.py +++ b/engine/SCons/Tool/MSCommon/netframework.py @@ -20,7 +20,7 @@  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/MSCommon/netframework.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/MSCommon/netframework.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __doc__ = """  """ diff --git a/engine/SCons/Tool/MSCommon/sdk.py b/engine/SCons/Tool/MSCommon/sdk.py index c455f4d..537f367 100644 --- a/engine/SCons/Tool/MSCommon/sdk.py +++ b/engine/SCons/Tool/MSCommon/sdk.py @@ -21,7 +21,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/MSCommon/sdk.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/MSCommon/sdk.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __doc__ = """Module to detect the Platform/Windows SDK diff --git a/engine/SCons/Tool/MSCommon/vc.py b/engine/SCons/Tool/MSCommon/vc.py index 0db8a8c..02a32a0 100644 --- a/engine/SCons/Tool/MSCommon/vc.py +++ b/engine/SCons/Tool/MSCommon/vc.py @@ -30,7 +30,7 @@  #   * test on 64 bits XP +  VS 2005 (and VS 6 if possible)  #   * SDK  #   * Assembly -__revision__ = "src/engine/SCons/Tool/MSCommon/vc.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/MSCommon/vc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __doc__ = """Module for Visual C/C++ detection and configuration.  """ diff --git a/engine/SCons/Tool/MSCommon/vs.py b/engine/SCons/Tool/MSCommon/vs.py index d122ec6..619cbe5 100644 --- a/engine/SCons/Tool/MSCommon/vs.py +++ b/engine/SCons/Tool/MSCommon/vs.py @@ -21,7 +21,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/MSCommon/vs.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/MSCommon/vs.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __doc__ = """Module to detect Visual Studio and/or Visual C/C++  """ diff --git a/engine/SCons/Tool/Perforce.py b/engine/SCons/Tool/Perforce.py index 5ab84e3..ddff25f 100644 --- a/engine/SCons/Tool/Perforce.py +++ b/engine/SCons/Tool/Perforce.py @@ -29,7 +29,7 @@ selection method.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/Perforce.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/Perforce.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os diff --git a/engine/SCons/Tool/PharLapCommon.py b/engine/SCons/Tool/PharLapCommon.py index ca3aced..576dea1 100644 --- a/engine/SCons/Tool/PharLapCommon.py +++ b/engine/SCons/Tool/PharLapCommon.py @@ -29,7 +29,7 @@ Phar Lap ETS tool chain.  Right now, this is linkloc and  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/PharLapCommon.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/PharLapCommon.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os  import os.path diff --git a/engine/SCons/Tool/RCS.py b/engine/SCons/Tool/RCS.py index d2616c3..d63bcd4 100644 --- a/engine/SCons/Tool/RCS.py +++ b/engine/SCons/Tool/RCS.py @@ -29,7 +29,7 @@ selection method.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/RCS.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/RCS.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Action  import SCons.Builder diff --git a/engine/SCons/Tool/SCCS.py b/engine/SCons/Tool/SCCS.py index b582a09..76f69e7 100644 --- a/engine/SCons/Tool/SCCS.py +++ b/engine/SCons/Tool/SCCS.py @@ -29,7 +29,7 @@ selection method.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/SCCS.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/SCCS.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Action  import SCons.Builder diff --git a/engine/SCons/Tool/Subversion.py b/engine/SCons/Tool/Subversion.py index 29390a9..85470b1 100644 --- a/engine/SCons/Tool/Subversion.py +++ b/engine/SCons/Tool/Subversion.py @@ -29,7 +29,7 @@ selection method.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/Subversion.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/Subversion.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os.path diff --git a/engine/SCons/Tool/__init__.py b/engine/SCons/Tool/__init__.py index 944f3dc..bb9729a 100644 --- a/engine/SCons/Tool/__init__.py +++ b/engine/SCons/Tool/__init__.py @@ -35,7 +35,7 @@ tool definition.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/__init__.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import imp  import sys @@ -340,7 +340,7 @@ symlinks for the platform we are on"""      if version:          # here we need the full pathname so the links end up in the right directory -        libname = getattr(target[0].attributes, 'shlibpath', target[0].path) +        libname = getattr(target[0].attributes, 'shlibpath', target[0].get_internal_path())          if Verbose:              print "VerShLib: target lib is = ", libname              print "VerShLib: name is = ", target[0].name diff --git a/engine/SCons/Tool/aixc++.py b/engine/SCons/Tool/aixc++.py index 96caa8a..864fcdf 100644 --- a/engine/SCons/Tool/aixc++.py +++ b/engine/SCons/Tool/aixc++.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/aixc++.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/aixc++.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os.path diff --git a/engine/SCons/Tool/aixcc.py b/engine/SCons/Tool/aixcc.py index c771a6d..02e0649 100644 --- a/engine/SCons/Tool/aixcc.py +++ b/engine/SCons/Tool/aixcc.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/aixcc.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/aixcc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os.path diff --git a/engine/SCons/Tool/aixf77.py b/engine/SCons/Tool/aixf77.py index 4cc69c1..5327cf7 100644 --- a/engine/SCons/Tool/aixf77.py +++ b/engine/SCons/Tool/aixf77.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/aixf77.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/aixf77.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os.path diff --git a/engine/SCons/Tool/aixlink.py b/engine/SCons/Tool/aixlink.py index 89cf399..7ad9cc6 100644 --- a/engine/SCons/Tool/aixlink.py +++ b/engine/SCons/Tool/aixlink.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/aixlink.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/aixlink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os  import os.path diff --git a/engine/SCons/Tool/applelink.py b/engine/SCons/Tool/applelink.py index 46b7995..9ef1b75 100644 --- a/engine/SCons/Tool/applelink.py +++ b/engine/SCons/Tool/applelink.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/applelink.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/applelink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Util diff --git a/engine/SCons/Tool/ar.py b/engine/SCons/Tool/ar.py index ef72779..2d7f7b9 100644 --- a/engine/SCons/Tool/ar.py +++ b/engine/SCons/Tool/ar.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/ar.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/ar.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Defaults  import SCons.Tool diff --git a/engine/SCons/Tool/as.py b/engine/SCons/Tool/as.py index 0c87af6..6c7304f 100644 --- a/engine/SCons/Tool/as.py +++ b/engine/SCons/Tool/as.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/as.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/as.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Defaults  import SCons.Tool diff --git a/engine/SCons/Tool/bcc32.py b/engine/SCons/Tool/bcc32.py index 50eb4f4..a8295a3 100644 --- a/engine/SCons/Tool/bcc32.py +++ b/engine/SCons/Tool/bcc32.py @@ -27,7 +27,7 @@ XXX  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/bcc32.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/bcc32.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os  import os.path diff --git a/engine/SCons/Tool/c++.py b/engine/SCons/Tool/c++.py index 42c42f0..580bf9c 100644 --- a/engine/SCons/Tool/c++.py +++ b/engine/SCons/Tool/c++.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/c++.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/c++.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os.path diff --git a/engine/SCons/Tool/cc.py b/engine/SCons/Tool/cc.py index a2581b8..7332ad0 100644 --- a/engine/SCons/Tool/cc.py +++ b/engine/SCons/Tool/cc.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/cc.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/cc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Tool  import SCons.Defaults diff --git a/engine/SCons/Tool/cvf.py b/engine/SCons/Tool/cvf.py index a2ad78f..89ac9fb 100644 --- a/engine/SCons/Tool/cvf.py +++ b/engine/SCons/Tool/cvf.py @@ -27,7 +27,7 @@ Tool-specific initialization for the Compaq Visual Fortran compiler.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/cvf.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/cvf.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import fortran diff --git a/engine/SCons/Tool/default.py b/engine/SCons/Tool/default.py index 7c96b20..35e872c 100644 --- a/engine/SCons/Tool/default.py +++ b/engine/SCons/Tool/default.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/default.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/default.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Tool diff --git a/engine/SCons/Tool/dmd.py b/engine/SCons/Tool/dmd.py index bbd2383..327da15 100644 --- a/engine/SCons/Tool/dmd.py +++ b/engine/SCons/Tool/dmd.py @@ -58,7 +58,7 @@ Lib tool variables:  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/dmd.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/dmd.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os  import subprocess diff --git a/engine/SCons/Tool/docbook/__init__.py b/engine/SCons/Tool/docbook/__init__.py index 26a1a95..aead43c 100644 --- a/engine/SCons/Tool/docbook/__init__.py +++ b/engine/SCons/Tool/docbook/__init__.py @@ -448,7 +448,7 @@ def DocbookEpub(env, target, source=None, *args, **kw):          Ensure all the resources in the manifest are present in the OEBPS directory.          """          hrefs = [] -        content_file = os.path.join(source[0].abspath, 'content.opf') +        content_file = os.path.join(source[0].get_abspath(), 'content.opf')          if not os.path.isfile(content_file):              return @@ -491,9 +491,9 @@ def DocbookEpub(env, target, source=None, *args, **kw):          for href in hrefs:              # If the resource was not already created by DocBook XSL itself,               # copy it into the OEBPS folder -            referenced_file = os.path.join(source[0].abspath, href) +            referenced_file = os.path.join(source[0].get_abspath(), href)              if not os.path.exists(referenced_file): -                shutil.copy(href, os.path.join(source[0].abspath, href)) +                shutil.copy(href, os.path.join(source[0].get_abspath(), href))      # Init list of targets/sources      target, source = __extend_targets_sources(target, source) diff --git a/engine/SCons/Tool/dvi.py b/engine/SCons/Tool/dvi.py index 7a67745..aba7168 100644 --- a/engine/SCons/Tool/dvi.py +++ b/engine/SCons/Tool/dvi.py @@ -27,7 +27,7 @@ Common DVI Builder definition for various other Tool modules that use it.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/dvi.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/dvi.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Builder  import SCons.Tool diff --git a/engine/SCons/Tool/dvipdf.py b/engine/SCons/Tool/dvipdf.py index 882150f..0a6dde7 100644 --- a/engine/SCons/Tool/dvipdf.py +++ b/engine/SCons/Tool/dvipdf.py @@ -30,7 +30,7 @@ selection method.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/dvipdf.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/dvipdf.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Action  import SCons.Defaults diff --git a/engine/SCons/Tool/dvips.py b/engine/SCons/Tool/dvips.py index 681b9fa..f72f2fe 100644 --- a/engine/SCons/Tool/dvips.py +++ b/engine/SCons/Tool/dvips.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/dvips.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/dvips.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Action  import SCons.Builder diff --git a/engine/SCons/Tool/f03.py b/engine/SCons/Tool/f03.py index 232c599..77165ad 100644 --- a/engine/SCons/Tool/f03.py +++ b/engine/SCons/Tool/f03.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/f03.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/f03.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Defaults  import SCons.Tool diff --git a/engine/SCons/Tool/f77.py b/engine/SCons/Tool/f77.py index c0661fa..593c517 100644 --- a/engine/SCons/Tool/f77.py +++ b/engine/SCons/Tool/f77.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/f77.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/f77.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Defaults  import SCons.Scanner.Fortran diff --git a/engine/SCons/Tool/f90.py b/engine/SCons/Tool/f90.py index 18d2132..c4a8df3 100644 --- a/engine/SCons/Tool/f90.py +++ b/engine/SCons/Tool/f90.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/f90.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/f90.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Defaults  import SCons.Scanner.Fortran diff --git a/engine/SCons/Tool/f95.py b/engine/SCons/Tool/f95.py index ca45326..f361e1d 100644 --- a/engine/SCons/Tool/f95.py +++ b/engine/SCons/Tool/f95.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/f95.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/f95.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Defaults  import SCons.Tool diff --git a/engine/SCons/Tool/filesystem.py b/engine/SCons/Tool/filesystem.py index 5508583..df57579 100644 --- a/engine/SCons/Tool/filesystem.py +++ b/engine/SCons/Tool/filesystem.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/filesystem.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/filesystem.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons  from SCons.Tool.install import copyFunc diff --git a/engine/SCons/Tool/fortran.py b/engine/SCons/Tool/fortran.py index c07e473..7a51321 100644 --- a/engine/SCons/Tool/fortran.py +++ b/engine/SCons/Tool/fortran.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/fortran.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/fortran.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import re diff --git a/engine/SCons/Tool/g++.py b/engine/SCons/Tool/g++.py index e4f4638..8246862 100644 --- a/engine/SCons/Tool/g++.py +++ b/engine/SCons/Tool/g++.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/g++.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/g++.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os.path  import re diff --git a/engine/SCons/Tool/g77.py b/engine/SCons/Tool/g77.py index 1cc9d7a..e09cf16 100644 --- a/engine/SCons/Tool/g77.py +++ b/engine/SCons/Tool/g77.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/g77.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/g77.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Util  from SCons.Tool.FortranCommon import add_all_to_env, add_f77_to_env diff --git a/engine/SCons/Tool/gas.py b/engine/SCons/Tool/gas.py index 5c2ab41..f987b95 100644 --- a/engine/SCons/Tool/gas.py +++ b/engine/SCons/Tool/gas.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/gas.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/gas.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  as_module = __import__('as', globals(), locals(), []) diff --git a/engine/SCons/Tool/gcc.py b/engine/SCons/Tool/gcc.py index 4dc0048..d2375c6 100644 --- a/engine/SCons/Tool/gcc.py +++ b/engine/SCons/Tool/gcc.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/gcc.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/gcc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import cc  import os diff --git a/engine/SCons/Tool/gdc.py b/engine/SCons/Tool/gdc.py index 0ba5418..7a67501 100644 --- a/engine/SCons/Tool/gdc.py +++ b/engine/SCons/Tool/gdc.py @@ -46,7 +46,7 @@ Lib tool variables:  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/gdc.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/gdc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Action  import SCons.Defaults diff --git a/engine/SCons/Tool/gettext.py b/engine/SCons/Tool/gettext.py index b03729c..e53ebdb 100644 --- a/engine/SCons/Tool/gettext.py +++ b/engine/SCons/Tool/gettext.py @@ -23,7 +23,7 @@  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/gettext.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/gettext.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  #############################################################################  def generate(env,**kw): diff --git a/engine/SCons/Tool/gfortran.py b/engine/SCons/Tool/gfortran.py index 575988c..02da302 100644 --- a/engine/SCons/Tool/gfortran.py +++ b/engine/SCons/Tool/gfortran.py @@ -32,7 +32,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/gfortran.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/gfortran.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Util diff --git a/engine/SCons/Tool/gnulink.py b/engine/SCons/Tool/gnulink.py index 5c0eee7..81c0130 100644 --- a/engine/SCons/Tool/gnulink.py +++ b/engine/SCons/Tool/gnulink.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/gnulink.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/gnulink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Util diff --git a/engine/SCons/Tool/gs.py b/engine/SCons/Tool/gs.py index f5d7d1d..3e2eecc 100644 --- a/engine/SCons/Tool/gs.py +++ b/engine/SCons/Tool/gs.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/gs.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/gs.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Action  import SCons.Builder diff --git a/engine/SCons/Tool/hpc++.py b/engine/SCons/Tool/hpc++.py index d0ea716..eb23e94 100644 --- a/engine/SCons/Tool/hpc++.py +++ b/engine/SCons/Tool/hpc++.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/hpc++.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/hpc++.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os.path diff --git a/engine/SCons/Tool/hpcc.py b/engine/SCons/Tool/hpcc.py index c3fae40..827460d 100644 --- a/engine/SCons/Tool/hpcc.py +++ b/engine/SCons/Tool/hpcc.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/hpcc.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/hpcc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Util diff --git a/engine/SCons/Tool/hplink.py b/engine/SCons/Tool/hplink.py index 08f622c..e3512a2 100644 --- a/engine/SCons/Tool/hplink.py +++ b/engine/SCons/Tool/hplink.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/hplink.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/hplink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os  import os.path diff --git a/engine/SCons/Tool/icc.py b/engine/SCons/Tool/icc.py index 5b491d0..d6e3663 100644 --- a/engine/SCons/Tool/icc.py +++ b/engine/SCons/Tool/icc.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/icc.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/icc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import cc diff --git a/engine/SCons/Tool/icl.py b/engine/SCons/Tool/icl.py index 1940518..88c6881 100644 --- a/engine/SCons/Tool/icl.py +++ b/engine/SCons/Tool/icl.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/icl.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/icl.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Tool.intelc diff --git a/engine/SCons/Tool/ifl.py b/engine/SCons/Tool/ifl.py index 3d1d6f1..ef5bdd6 100644 --- a/engine/SCons/Tool/ifl.py +++ b/engine/SCons/Tool/ifl.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/ifl.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/ifl.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Defaults  from SCons.Scanner.Fortran import FortranScan diff --git a/engine/SCons/Tool/ifort.py b/engine/SCons/Tool/ifort.py index cd01308..275c5c8 100644 --- a/engine/SCons/Tool/ifort.py +++ b/engine/SCons/Tool/ifort.py @@ -32,7 +32,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/ifort.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/ifort.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Defaults  from SCons.Scanner.Fortran import FortranScan diff --git a/engine/SCons/Tool/ilink.py b/engine/SCons/Tool/ilink.py index 9751e23..b2c3513 100644 --- a/engine/SCons/Tool/ilink.py +++ b/engine/SCons/Tool/ilink.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/ilink.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/ilink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Defaults  import SCons.Tool diff --git a/engine/SCons/Tool/ilink32.py b/engine/SCons/Tool/ilink32.py index a5fef95..a2f1e67 100644 --- a/engine/SCons/Tool/ilink32.py +++ b/engine/SCons/Tool/ilink32.py @@ -27,7 +27,7 @@ XXX  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/ilink32.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/ilink32.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Tool  import SCons.Tool.bcc32 diff --git a/engine/SCons/Tool/install.py b/engine/SCons/Tool/install.py index d310ee6..0b3642c 100644 --- a/engine/SCons/Tool/install.py +++ b/engine/SCons/Tool/install.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/install.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/install.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os  import re diff --git a/engine/SCons/Tool/intelc.py b/engine/SCons/Tool/intelc.py index dfc7a2b..256f32e 100644 --- a/engine/SCons/Tool/intelc.py +++ b/engine/SCons/Tool/intelc.py @@ -32,7 +32,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  from __future__ import division -__revision__ = "src/engine/SCons/Tool/intelc.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/intelc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import math, sys, os.path, glob, string, re diff --git a/engine/SCons/Tool/ipkg.py b/engine/SCons/Tool/ipkg.py index f62083a..bf2b496 100644 --- a/engine/SCons/Tool/ipkg.py +++ b/engine/SCons/Tool/ipkg.py @@ -33,7 +33,7 @@ packages fake_root.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/ipkg.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/ipkg.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os diff --git a/engine/SCons/Tool/jar.py b/engine/SCons/Tool/jar.py index 5cd01b9..50d3fc0 100644 --- a/engine/SCons/Tool/jar.py +++ b/engine/SCons/Tool/jar.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/jar.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/jar.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Subst  import SCons.Util diff --git a/engine/SCons/Tool/javac.py b/engine/SCons/Tool/javac.py index d52066f..bb57208 100644 --- a/engine/SCons/Tool/javac.py +++ b/engine/SCons/Tool/javac.py @@ -30,7 +30,7 @@ selection method.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/javac.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/javac.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os  import os.path diff --git a/engine/SCons/Tool/javah.py b/engine/SCons/Tool/javah.py index 808393a..1d667b9 100644 --- a/engine/SCons/Tool/javah.py +++ b/engine/SCons/Tool/javah.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/javah.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/javah.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os.path diff --git a/engine/SCons/Tool/latex.py b/engine/SCons/Tool/latex.py index 24d13d0..69413cc 100644 --- a/engine/SCons/Tool/latex.py +++ b/engine/SCons/Tool/latex.py @@ -32,7 +32,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/latex.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/latex.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Action  import SCons.Defaults diff --git a/engine/SCons/Tool/ldc.py b/engine/SCons/Tool/ldc.py index b0e5634..c1b558f 100644 --- a/engine/SCons/Tool/ldc.py +++ b/engine/SCons/Tool/ldc.py @@ -46,7 +46,7 @@ Lib tool variables:  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/ldc.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/ldc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os  import subprocess diff --git a/engine/SCons/Tool/lex.py b/engine/SCons/Tool/lex.py index a58f6d7..9f6557d 100644 --- a/engine/SCons/Tool/lex.py +++ b/engine/SCons/Tool/lex.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/lex.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/lex.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os.path diff --git a/engine/SCons/Tool/link.py b/engine/SCons/Tool/link.py index 089b6e5..6874301 100644 --- a/engine/SCons/Tool/link.py +++ b/engine/SCons/Tool/link.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/link.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/link.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import re @@ -86,7 +86,7 @@ def shlib_emitter(target, source, env):              # the version number              target[0].attributes.shlibname = version_names[0]              shlib = env.File(version_names[0], directory=target[0].get_dir()) -            target[0].attributes.shlibpath = shlib.path +            target[0].attributes.shlibpath = shlib.get_internal_path()              for name in version_names[1:]:                  env.SideEffect(name, shlib)                  env.Clean(shlib, name) diff --git a/engine/SCons/Tool/linkloc.py b/engine/SCons/Tool/linkloc.py index 023cdd3..d2c218f 100644 --- a/engine/SCons/Tool/linkloc.py +++ b/engine/SCons/Tool/linkloc.py @@ -32,7 +32,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/linkloc.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/linkloc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os.path  import re diff --git a/engine/SCons/Tool/m4.py b/engine/SCons/Tool/m4.py index 7b471e2..dfc4665 100644 --- a/engine/SCons/Tool/m4.py +++ b/engine/SCons/Tool/m4.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/m4.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/m4.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Action  import SCons.Builder diff --git a/engine/SCons/Tool/masm.py b/engine/SCons/Tool/masm.py index 9a4dbee..7036de6 100644 --- a/engine/SCons/Tool/masm.py +++ b/engine/SCons/Tool/masm.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/masm.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/masm.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Defaults  import SCons.Tool diff --git a/engine/SCons/Tool/midl.py b/engine/SCons/Tool/midl.py index 266b422..0d93073 100644 --- a/engine/SCons/Tool/midl.py +++ b/engine/SCons/Tool/midl.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/midl.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/midl.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Action  import SCons.Builder diff --git a/engine/SCons/Tool/mingw.py b/engine/SCons/Tool/mingw.py index 60821d6..236ce32 100644 --- a/engine/SCons/Tool/mingw.py +++ b/engine/SCons/Tool/mingw.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/mingw.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/mingw.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os  import os.path diff --git a/engine/SCons/Tool/msgfmt.py b/engine/SCons/Tool/msgfmt.py index 9e3f437..4cfe686 100644 --- a/engine/SCons/Tool/msgfmt.py +++ b/engine/SCons/Tool/msgfmt.py @@ -21,7 +21,7 @@  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/msgfmt.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/msgfmt.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  from SCons.Builder import BuilderBase  ############################################################################# diff --git a/engine/SCons/Tool/msginit.py b/engine/SCons/Tool/msginit.py index 2240658..53046d6 100644 --- a/engine/SCons/Tool/msginit.py +++ b/engine/SCons/Tool/msginit.py @@ -24,7 +24,7 @@ Tool specific initialization of msginit tool.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/msginit.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/msginit.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Warnings  import SCons.Builder diff --git a/engine/SCons/Tool/msgmerge.py b/engine/SCons/Tool/msgmerge.py index e5012a1..e2d06f4 100644 --- a/engine/SCons/Tool/msgmerge.py +++ b/engine/SCons/Tool/msgmerge.py @@ -24,7 +24,7 @@ Tool specific initialization for `msgmerge` tool.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/msgmerge.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/msgmerge.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  #############################################################################  def _update_or_init_po_files(target, source, env): diff --git a/engine/SCons/Tool/mslib.py b/engine/SCons/Tool/mslib.py index baab454..a82e88d 100644 --- a/engine/SCons/Tool/mslib.py +++ b/engine/SCons/Tool/mslib.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/mslib.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/mslib.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Defaults  import SCons.Tool diff --git a/engine/SCons/Tool/mslink.py b/engine/SCons/Tool/mslink.py index 158b700..6906303 100644 --- a/engine/SCons/Tool/mslink.py +++ b/engine/SCons/Tool/mslink.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/mslink.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/mslink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os.path @@ -216,7 +216,7 @@ def embedManifestDllCheck(target, source, env):      """Function run by embedManifestDllCheckAction to check for existence of manifest      and other conditions, and embed the manifest by calling embedManifestDllAction if so."""      if env.get('WINDOWS_EMBED_MANIFEST', 0): -        manifestSrc = target[0].abspath + '.manifest' +        manifestSrc = target[0].get_abspath() + '.manifest'          if os.path.exists(manifestSrc):              ret = (embedManifestDllAction) ([target[0]],None,env)                      if ret: @@ -230,7 +230,7 @@ def embedManifestExeCheck(target, source, env):      """Function run by embedManifestExeCheckAction to check for existence of manifest      and other conditions, and embed the manifest by calling embedManifestExeAction if so."""      if env.get('WINDOWS_EMBED_MANIFEST', 0): -        manifestSrc = target[0].abspath + '.manifest' +        manifestSrc = target[0].get_abspath() + '.manifest'          if os.path.exists(manifestSrc):              ret = (embedManifestExeAction) ([target[0]],None,env)              if ret: diff --git a/engine/SCons/Tool/mssdk.py b/engine/SCons/Tool/mssdk.py index 649f83c..3836817 100644 --- a/engine/SCons/Tool/mssdk.py +++ b/engine/SCons/Tool/mssdk.py @@ -21,7 +21,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/mssdk.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/mssdk.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  """engine.SCons.Tool.mssdk diff --git a/engine/SCons/Tool/msvc.py b/engine/SCons/Tool/msvc.py index cace2ee..03d65ee 100644 --- a/engine/SCons/Tool/msvc.py +++ b/engine/SCons/Tool/msvc.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/msvc.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/msvc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os.path  import re diff --git a/engine/SCons/Tool/msvs.py b/engine/SCons/Tool/msvs.py index d7c0955..0ad4c78 100644 --- a/engine/SCons/Tool/msvs.py +++ b/engine/SCons/Tool/msvs.py @@ -30,7 +30,7 @@ selection method.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/msvs.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/msvs.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.compat @@ -1983,7 +1983,7 @@ def generate(env):          env['MSVSSCONSCRIPT'] = default_MSVS_SConscript      env['MSVSSCONS'] = '"%s" -c "%s"' % (python_executable, getExecScriptMain(env)) -    env['MSVSSCONSFLAGS'] = '-C "${MSVSSCONSCRIPT.dir.abspath}" -f ${MSVSSCONSCRIPT.name}' +    env['MSVSSCONSFLAGS'] = '-C "${MSVSSCONSCRIPT.dir.get_abspath()}" -f ${MSVSSCONSCRIPT.name}'      env['MSVSSCONSCOM'] = '$MSVSSCONS $MSVSSCONSFLAGS'      env['MSVSBUILDCOM'] = '$MSVSSCONSCOM "$MSVSBUILDTARGET"'      env['MSVSREBUILDCOM'] = '$MSVSSCONSCOM "$MSVSBUILDTARGET"' diff --git a/engine/SCons/Tool/mwcc.py b/engine/SCons/Tool/mwcc.py index 5519dcc..a130d0f 100644 --- a/engine/SCons/Tool/mwcc.py +++ b/engine/SCons/Tool/mwcc.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/mwcc.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/mwcc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os  import os.path diff --git a/engine/SCons/Tool/mwld.py b/engine/SCons/Tool/mwld.py index b196ac3..8f6f3a2 100644 --- a/engine/SCons/Tool/mwld.py +++ b/engine/SCons/Tool/mwld.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/mwld.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/mwld.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Tool diff --git a/engine/SCons/Tool/nasm.py b/engine/SCons/Tool/nasm.py index fd9a2e9..86a7ef8 100644 --- a/engine/SCons/Tool/nasm.py +++ b/engine/SCons/Tool/nasm.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/nasm.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/nasm.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Defaults  import SCons.Tool diff --git a/engine/SCons/Tool/packaging/__init__.py b/engine/SCons/Tool/packaging/__init__.py index b7fb43b..2107d5f 100644 --- a/engine/SCons/Tool/packaging/__init__.py +++ b/engine/SCons/Tool/packaging/__init__.py @@ -25,7 +25,7 @@ SCons Packaging Tool.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/packaging/__init__.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/packaging/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Environment  from SCons.Variables import * @@ -80,7 +80,7 @@ def Tag(env, target, source, *more_tags, **kw_tags):              #if not k.startswith('PACKAGING_'):              if k[:10] != 'PACKAGING_':                  k='PACKAGING_'+k -            setattr(t, k, v) +            t.Tag(k, v)  def Package(env, target=None, source=None, **kw):      """ Entry point for the package tool. @@ -235,9 +235,11 @@ def copy_attr(f1, f2):      #pattrs = [x for x in dir(f1) if not hasattr(f2, x) and\      #                                x.startswith('PACKAGING_')]      copyit = lambda x: not hasattr(f2, x) and x[:10] == 'PACKAGING_' -    pattrs = list(filter(copyit, dir(f1))) -    for attr in pattrs: -        setattr(f2, attr, getattr(f1, attr)) +    if f1._tags: +        pattrs = list(filter(copyit, f1._tags)) +        for attr in pattrs: +            f2.Tag(attr, f1.GetTag(attr)) +  def putintopackageroot(target, source, env, pkgroot, honor_install_location=1):      """ Uses the CopyAs builder to copy all source files to the directory given      in pkgroot. @@ -262,9 +264,9 @@ def putintopackageroot(target, source, env, pkgroot, honor_install_location=1):          if file.is_under(pkgroot):              new_source.append(file)          else: -            if hasattr(file, 'PACKAGING_INSTALL_LOCATION') and\ +            if file.GetTag('PACKAGING_INSTALL_LOCATION') and\                         honor_install_location: -                new_name=make_path_relative(file.PACKAGING_INSTALL_LOCATION) +                new_name=make_path_relative(file.GetTag('PACKAGING_INSTALL_LOCATION'))              else:                  new_name=make_path_relative(file.get_path()) @@ -301,7 +303,7 @@ def stripinstallbuilder(target, source, env):              for ss in s.sources:                  n_source.append(ss)                  copy_attr(s, ss) -                setattr(ss, 'PACKAGING_INSTALL_LOCATION', s.get_path()) +                ss.Tag('PACKAGING_INSTALL_LOCATION', s.get_path())      return (target, n_source) diff --git a/engine/SCons/Tool/packaging/ipk.py b/engine/SCons/Tool/packaging/ipk.py index 8ffe3ab..51c3381 100644 --- a/engine/SCons/Tool/packaging/ipk.py +++ b/engine/SCons/Tool/packaging/ipk.py @@ -24,7 +24,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/packaging/ipk.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/packaging/ipk.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Builder  import SCons.Node.FS @@ -120,7 +120,7 @@ def build_specfiles(source, target, env):              return opened_files[needle]          except KeyError:              file=filter(lambda x: x.get_path().rfind(needle)!=-1, haystack)[0] -            opened_files[needle]=open(file.abspath, 'w') +            opened_files[needle]=open(file.get_abspath(), 'w')              return opened_files[needle]      control_file=open_file('control', target) diff --git a/engine/SCons/Tool/packaging/msi.py b/engine/SCons/Tool/packaging/msi.py index 0f2f94b..41b7c77 100644 --- a/engine/SCons/Tool/packaging/msi.py +++ b/engine/SCons/Tool/packaging/msi.py @@ -25,7 +25,7 @@ The msi packager.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/packaging/msi.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/packaging/msi.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os  import SCons @@ -189,7 +189,7 @@ def build_wxsfile(target, source, env):      """ compiles a .wxs file from the keywords given in env['msi_spec'] and          by analyzing the tree of source nodes and their tags.      """ -    file = open(target[0].abspath, 'w') +    file = open(target[0].get_abspath(), 'w')      try:          # Create a document with the Wix root tag diff --git a/engine/SCons/Tool/packaging/rpm.py b/engine/SCons/Tool/packaging/rpm.py index f7a6e45..f7e2577 100644 --- a/engine/SCons/Tool/packaging/rpm.py +++ b/engine/SCons/Tool/packaging/rpm.py @@ -25,7 +25,7 @@ The rpm packager.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/packaging/rpm.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/packaging/rpm.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os @@ -130,8 +130,7 @@ def build_specfile(target, source, env):      """ Builds a RPM specfile from a dictionary with string metadata and      by analyzing a tree of nodes.      """ -    file = open(target[0].abspath, 'w') -    str  = "" +    file = open(target[0].get_abspath(), 'w')      try:          file.write( build_specfile_header(env) ) @@ -279,7 +278,9 @@ def build_specfile_filesection(spec, files):          tags = {}          for k in supported_tags.keys():              try: -                tags[k]=getattr(file, k) +                v = file.GetTag(k) +                if v: +                    tags[k] = v              except AttributeError:                  pass @@ -287,7 +288,7 @@ def build_specfile_filesection(spec, files):          str = str + SimpleTagCompiler(supported_tags, mandatory=0).compile( tags )          str = str + ' ' -        str = str + file.PACKAGING_INSTALL_LOCATION +        str = str + file.GetTag('PACKAGING_INSTALL_LOCATION')          str = str + '\n\n'      return str diff --git a/engine/SCons/Tool/packaging/src_tarbz2.py b/engine/SCons/Tool/packaging/src_tarbz2.py index 7c05f05..438fc20 100644 --- a/engine/SCons/Tool/packaging/src_tarbz2.py +++ b/engine/SCons/Tool/packaging/src_tarbz2.py @@ -26,7 +26,7 @@ The tarbz2 SRC packager.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/packaging/src_tarbz2.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/packaging/src_tarbz2.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  from SCons.Tool.packaging import putintopackageroot diff --git a/engine/SCons/Tool/packaging/src_targz.py b/engine/SCons/Tool/packaging/src_targz.py index 1b16b59..6a85869 100644 --- a/engine/SCons/Tool/packaging/src_targz.py +++ b/engine/SCons/Tool/packaging/src_targz.py @@ -26,7 +26,7 @@ The targz SRC packager.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/packaging/src_targz.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/packaging/src_targz.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  from SCons.Tool.packaging import putintopackageroot diff --git a/engine/SCons/Tool/packaging/src_zip.py b/engine/SCons/Tool/packaging/src_zip.py index a267a57..e1a1d49 100644 --- a/engine/SCons/Tool/packaging/src_zip.py +++ b/engine/SCons/Tool/packaging/src_zip.py @@ -26,7 +26,7 @@ The zip SRC packager.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/packaging/src_zip.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/packaging/src_zip.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  from SCons.Tool.packaging import putintopackageroot diff --git a/engine/SCons/Tool/packaging/tarbz2.py b/engine/SCons/Tool/packaging/tarbz2.py index f05c03a..79f8219 100644 --- a/engine/SCons/Tool/packaging/tarbz2.py +++ b/engine/SCons/Tool/packaging/tarbz2.py @@ -26,7 +26,7 @@ The tarbz2 SRC packager.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/packaging/tarbz2.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/packaging/tarbz2.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot diff --git a/engine/SCons/Tool/packaging/targz.py b/engine/SCons/Tool/packaging/targz.py index 038f394..eeb3d6a 100644 --- a/engine/SCons/Tool/packaging/targz.py +++ b/engine/SCons/Tool/packaging/targz.py @@ -26,7 +26,7 @@ The targz SRC packager.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/packaging/targz.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/packaging/targz.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot diff --git a/engine/SCons/Tool/packaging/zip.py b/engine/SCons/Tool/packaging/zip.py index 32b7bf2..6c4037d 100644 --- a/engine/SCons/Tool/packaging/zip.py +++ b/engine/SCons/Tool/packaging/zip.py @@ -26,7 +26,7 @@ The zip SRC packager.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/packaging/zip.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/packaging/zip.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  from SCons.Tool.packaging import stripinstallbuilder, putintopackageroot diff --git a/engine/SCons/Tool/pdf.py b/engine/SCons/Tool/pdf.py index 58193d4..0ccb49b 100644 --- a/engine/SCons/Tool/pdf.py +++ b/engine/SCons/Tool/pdf.py @@ -28,7 +28,7 @@ Add an explicit action to run epstopdf to convert .eps files to .pdf  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/pdf.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/pdf.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Builder  import SCons.Tool diff --git a/engine/SCons/Tool/pdflatex.py b/engine/SCons/Tool/pdflatex.py index 37fc3a0..42188f4 100644 --- a/engine/SCons/Tool/pdflatex.py +++ b/engine/SCons/Tool/pdflatex.py @@ -32,7 +32,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/pdflatex.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/pdflatex.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Action  import SCons.Util diff --git a/engine/SCons/Tool/pdftex.py b/engine/SCons/Tool/pdftex.py index 3bbd603..e38a278 100644 --- a/engine/SCons/Tool/pdftex.py +++ b/engine/SCons/Tool/pdftex.py @@ -32,7 +32,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/pdftex.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/pdftex.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os  import SCons.Action diff --git a/engine/SCons/Tool/qt.py b/engine/SCons/Tool/qt.py index 18e163a..b8233c0 100644 --- a/engine/SCons/Tool/qt.py +++ b/engine/SCons/Tool/qt.py @@ -32,7 +32,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/qt.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/qt.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os.path  import re diff --git a/engine/SCons/Tool/rmic.py b/engine/SCons/Tool/rmic.py index ac785d6..6045b7f 100644 --- a/engine/SCons/Tool/rmic.py +++ b/engine/SCons/Tool/rmic.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/rmic.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/rmic.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os.path diff --git a/engine/SCons/Tool/rpcgen.py b/engine/SCons/Tool/rpcgen.py index a0e7330..1a3de76 100644 --- a/engine/SCons/Tool/rpcgen.py +++ b/engine/SCons/Tool/rpcgen.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/rpcgen.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/rpcgen.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  from SCons.Builder import Builder  import SCons.Util diff --git a/engine/SCons/Tool/rpm.py b/engine/SCons/Tool/rpm.py index 1f70b0d..46b3112 100644 --- a/engine/SCons/Tool/rpm.py +++ b/engine/SCons/Tool/rpm.py @@ -33,7 +33,7 @@ tar.gz consisting of the source file and a specfile.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/rpm.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/rpm.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os  import re @@ -51,11 +51,11 @@ def get_cmd(source, env):      if SCons.Util.is_List(source):          tar_file_with_included_specfile = source[0]      return "%s %s %s"%(env['RPM'], env['RPMFLAGS'], -                       tar_file_with_included_specfile.abspath ) +                       tar_file_with_included_specfile.get_abspath() )  def build_rpm(target, source, env):      # create a temporary rpm build root. -    tmpdir = os.path.join( os.path.dirname( target[0].abspath ), 'rpmtemp' ) +    tmpdir = os.path.join( os.path.dirname( target[0].get_abspath() ), 'rpmtemp' )      if os.path.exists(tmpdir):          shutil.rmtree(tmpdir) @@ -87,7 +87,7 @@ def build_rpm(target, source, env):              expected   = os.path.basename(input.get_path())              assert expected == rpm_output, "got %s but expected %s" % (rpm_output, expected) -            shutil.copy( output, input.abspath ) +            shutil.copy( output, input.get_abspath() )      # cleanup before leaving. diff --git a/engine/SCons/Tool/rpmutils.py b/engine/SCons/Tool/rpmutils.py index 0325dba..10b5560 100644 --- a/engine/SCons/Tool/rpmutils.py +++ b/engine/SCons/Tool/rpmutils.py @@ -35,7 +35,7 @@ exact syntax.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/rpmutils.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/rpmutils.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import platform diff --git a/engine/SCons/Tool/sgiar.py b/engine/SCons/Tool/sgiar.py index 2837e05..6be4c65 100644 --- a/engine/SCons/Tool/sgiar.py +++ b/engine/SCons/Tool/sgiar.py @@ -33,7 +33,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/sgiar.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/sgiar.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Defaults  import SCons.Tool diff --git a/engine/SCons/Tool/sgic++.py b/engine/SCons/Tool/sgic++.py index c2585e7..8ae115a 100644 --- a/engine/SCons/Tool/sgic++.py +++ b/engine/SCons/Tool/sgic++.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/sgic++.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/sgic++.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Util diff --git a/engine/SCons/Tool/sgicc.py b/engine/SCons/Tool/sgicc.py index bd88b01..ec26bf1 100644 --- a/engine/SCons/Tool/sgicc.py +++ b/engine/SCons/Tool/sgicc.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/sgicc.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/sgicc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import cc diff --git a/engine/SCons/Tool/sgilink.py b/engine/SCons/Tool/sgilink.py index ba0af79..828f6d0 100644 --- a/engine/SCons/Tool/sgilink.py +++ b/engine/SCons/Tool/sgilink.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/sgilink.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/sgilink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Util diff --git a/engine/SCons/Tool/sunar.py b/engine/SCons/Tool/sunar.py index 32a5fcd..9c3e481 100644 --- a/engine/SCons/Tool/sunar.py +++ b/engine/SCons/Tool/sunar.py @@ -32,7 +32,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/sunar.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/sunar.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Defaults  import SCons.Tool diff --git a/engine/SCons/Tool/sunc++.py b/engine/SCons/Tool/sunc++.py index c470758..75fe435 100644 --- a/engine/SCons/Tool/sunc++.py +++ b/engine/SCons/Tool/sunc++.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/sunc++.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/sunc++.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons diff --git a/engine/SCons/Tool/suncc.py b/engine/SCons/Tool/suncc.py index 0ef730f..b543b95 100644 --- a/engine/SCons/Tool/suncc.py +++ b/engine/SCons/Tool/suncc.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/suncc.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/suncc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Util diff --git a/engine/SCons/Tool/sunf77.py b/engine/SCons/Tool/sunf77.py index d8c089f..bff5c1a 100644 --- a/engine/SCons/Tool/sunf77.py +++ b/engine/SCons/Tool/sunf77.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/sunf77.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/sunf77.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Util diff --git a/engine/SCons/Tool/sunf90.py b/engine/SCons/Tool/sunf90.py index 91b61be..b0e31d1 100644 --- a/engine/SCons/Tool/sunf90.py +++ b/engine/SCons/Tool/sunf90.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/sunf90.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/sunf90.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Util diff --git a/engine/SCons/Tool/sunf95.py b/engine/SCons/Tool/sunf95.py index 5f76172..5263f5a 100644 --- a/engine/SCons/Tool/sunf95.py +++ b/engine/SCons/Tool/sunf95.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/sunf95.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/sunf95.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Util diff --git a/engine/SCons/Tool/sunlink.py b/engine/SCons/Tool/sunlink.py index dc4febf..d8a941f 100644 --- a/engine/SCons/Tool/sunlink.py +++ b/engine/SCons/Tool/sunlink.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/sunlink.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/sunlink.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os  import os.path diff --git a/engine/SCons/Tool/swig.py b/engine/SCons/Tool/swig.py index 414d0cb..83cd315 100644 --- a/engine/SCons/Tool/swig.py +++ b/engine/SCons/Tool/swig.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/swig.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/swig.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os.path  import re @@ -42,6 +42,7 @@ import SCons.Defaults  import SCons.Scanner  import SCons.Tool  import SCons.Util +import SCons.Node  SwigAction = SCons.Action.Action('$SWIGCOM', '$SWIGCOMSTR') @@ -117,9 +118,13 @@ def _swigEmitter(target, source, env):              if outdir:                   java_files = [os.path.join(outdir, j) for j in java_files]              java_files = list(map(env.fs.File, java_files)) +            def t_from_s(t, p, s, x): +                return t.dir +            tsm = SCons.Node._target_from_source_map +            tkey = len(tsm) +            tsm[tkey] = t_from_s              for jf in java_files: -                t_from_s = lambda t, p, s, x: t.dir -                SCons.Util.AddMethod(jf, t_from_s, 'target_from_source') +                jf._func_target_from_source = tkey              target.extend(java_files)      return (target, source) diff --git a/engine/SCons/Tool/tar.py b/engine/SCons/Tool/tar.py index 9af8963..50afeae 100644 --- a/engine/SCons/Tool/tar.py +++ b/engine/SCons/Tool/tar.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/tar.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/tar.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Action  import SCons.Builder diff --git a/engine/SCons/Tool/tex.py b/engine/SCons/Tool/tex.py index 5321a6f..9dd462e 100644 --- a/engine/SCons/Tool/tex.py +++ b/engine/SCons/Tool/tex.py @@ -32,7 +32,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/tex.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/tex.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os.path  import re diff --git a/engine/SCons/Tool/textfile.py b/engine/SCons/Tool/textfile.py index 2c0b627..9c2b3a1 100644 --- a/engine/SCons/Tool/textfile.py +++ b/engine/SCons/Tool/textfile.py @@ -44,7 +44,7 @@ Textfile/Substfile builder for SCons.      is unpredictible whether the expansion will occur.  """ -__revision__ = "src/engine/SCons/Tool/textfile.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/textfile.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons diff --git a/engine/SCons/Tool/tlib.py b/engine/SCons/Tool/tlib.py index 75ff2ef..9040439 100644 --- a/engine/SCons/Tool/tlib.py +++ b/engine/SCons/Tool/tlib.py @@ -27,7 +27,7 @@ XXX  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/tlib.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/tlib.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Tool  import SCons.Tool.bcc32 diff --git a/engine/SCons/Tool/wix.py b/engine/SCons/Tool/wix.py index 9b4eedc..1291f18 100644 --- a/engine/SCons/Tool/wix.py +++ b/engine/SCons/Tool/wix.py @@ -30,7 +30,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/wix.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/wix.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import SCons.Builder  import SCons.Action diff --git a/engine/SCons/Tool/xgettext.py b/engine/SCons/Tool/xgettext.py index a28ce5b..ed6245d 100644 --- a/engine/SCons/Tool/xgettext.py +++ b/engine/SCons/Tool/xgettext.py @@ -24,7 +24,7 @@ Tool specific initialization of `xgettext` tool.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Tool/xgettext.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/xgettext.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  #############################################################################  class _CmdRunner(object): diff --git a/engine/SCons/Tool/yacc.py b/engine/SCons/Tool/yacc.py index f9c7b08..4b8d938 100644 --- a/engine/SCons/Tool/yacc.py +++ b/engine/SCons/Tool/yacc.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/yacc.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/yacc.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os.path diff --git a/engine/SCons/Tool/zip.py b/engine/SCons/Tool/zip.py index 6749fdd..750769a 100644 --- a/engine/SCons/Tool/zip.py +++ b/engine/SCons/Tool/zip.py @@ -31,7 +31,7 @@ selection method.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Tool/zip.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Tool/zip.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os.path diff --git a/engine/SCons/Util.py b/engine/SCons/Util.py index b3c37da..343f0a7 100644 --- a/engine/SCons/Util.py +++ b/engine/SCons/Util.py @@ -24,7 +24,7 @@ Various utility functions go here.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Util.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Util.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os  import sys @@ -992,7 +992,7 @@ class Selector(OrderedDict):      def __call__(self, env, source, ext=None):          if ext is None:              try: -                ext = source[0].suffix +                ext = source[0].get_suffix()              except IndexError:                  ext = ""          try: diff --git a/engine/SCons/Variables/BoolVariable.py b/engine/SCons/Variables/BoolVariable.py index 1fc59b4..1594559 100644 --- a/engine/SCons/Variables/BoolVariable.py +++ b/engine/SCons/Variables/BoolVariable.py @@ -34,7 +34,7 @@ Usage example:  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Variables/BoolVariable.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Variables/BoolVariable.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __all__ = ['BoolVariable',] diff --git a/engine/SCons/Variables/EnumVariable.py b/engine/SCons/Variables/EnumVariable.py index dd868ef..bc95cf6 100644 --- a/engine/SCons/Variables/EnumVariable.py +++ b/engine/SCons/Variables/EnumVariable.py @@ -37,7 +37,7 @@ Usage example:  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Variables/EnumVariable.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Variables/EnumVariable.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __all__ = ['EnumVariable',] diff --git a/engine/SCons/Variables/ListVariable.py b/engine/SCons/Variables/ListVariable.py index 0410897..1faee72 100644 --- a/engine/SCons/Variables/ListVariable.py +++ b/engine/SCons/Variables/ListVariable.py @@ -46,7 +46,7 @@ Usage example:  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Variables/ListVariable.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Variables/ListVariable.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  # Know Bug: This should behave like a Set-Type, but does not really,  # since elements can occur twice. diff --git a/engine/SCons/Variables/PackageVariable.py b/engine/SCons/Variables/PackageVariable.py index 202a8f1..b7a59fe 100644 --- a/engine/SCons/Variables/PackageVariable.py +++ b/engine/SCons/Variables/PackageVariable.py @@ -50,7 +50,7 @@ Usage example:  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Variables/PackageVariable.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Variables/PackageVariable.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __all__ = ['PackageVariable',] diff --git a/engine/SCons/Variables/PathVariable.py b/engine/SCons/Variables/PathVariable.py index 0ef5a1f..b095cbc 100644 --- a/engine/SCons/Variables/PathVariable.py +++ b/engine/SCons/Variables/PathVariable.py @@ -68,7 +68,7 @@ Usage example:  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/Variables/PathVariable.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Variables/PathVariable.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __all__ = ['PathVariable',] diff --git a/engine/SCons/Variables/__init__.py b/engine/SCons/Variables/__init__.py index f13167c..a00d4f8 100644 --- a/engine/SCons/Variables/__init__.py +++ b/engine/SCons/Variables/__init__.py @@ -26,7 +26,7 @@ customizable variables to an SCons build.  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/engine/SCons/Variables/__init__.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Variables/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os.path  import sys diff --git a/engine/SCons/Warnings.py b/engine/SCons/Warnings.py index e2a90fe..615bc45 100644 --- a/engine/SCons/Warnings.py +++ b/engine/SCons/Warnings.py @@ -27,7 +27,7 @@ This file implements the warnings framework for SCons.  """ -__revision__ = "src/engine/SCons/Warnings.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/Warnings.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import sys diff --git a/engine/SCons/__init__.py b/engine/SCons/__init__.py index 7cf97f9..019cbf9 100644 --- a/engine/SCons/__init__.py +++ b/engine/SCons/__init__.py @@ -27,15 +27,15 @@ The main package for the SCons software construction utility.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/__init__.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog" -__version__ = "2.3.6" +__version__ = "2.4.0" -__build__ = "rel_2.3.5:3347:d31d5a4e74b6[MODIFIED]" +__build__ = "rel_2.4.0:3365:9259ea1c13d7"  __buildsys__ = "hpmicrodog" -__date__ = "2015/07/31 14:36:10" +__date__ = "2015/09/21 14:03:43"  __developer__ = "bdbaddog" diff --git a/engine/SCons/compat/__init__.py b/engine/SCons/compat/__init__.py index 25e38f2..2352d4c 100644 --- a/engine/SCons/compat/__init__.py +++ b/engine/SCons/compat/__init__.py @@ -60,7 +60,7 @@ function defined below loads the module as the "real" name (without the  rest of our code will find our pre-loaded compatibility module.  """ -__revision__ = "src/engine/SCons/compat/__init__.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/compat/__init__.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os  import sys diff --git a/engine/SCons/compat/_scons_builtins.py b/engine/SCons/compat/_scons_builtins.py index a554e83..bf2005f 100644 --- a/engine/SCons/compat/_scons_builtins.py +++ b/engine/SCons/compat/_scons_builtins.py @@ -51,7 +51,7 @@ the FUNCTIONS or DATA output, that means those names are already built in  to this version of Python and we don't need to add them from this module.  """ -__revision__ = "src/engine/SCons/compat/_scons_builtins.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/compat/_scons_builtins.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import builtins diff --git a/engine/SCons/compat/_scons_collections.py b/engine/SCons/compat/_scons_collections.py index 8bb5a0d..1f13065 100644 --- a/engine/SCons/compat/_scons_collections.py +++ b/engine/SCons/compat/_scons_collections.py @@ -30,7 +30,7 @@ used by SCons, in an interface that looks enough like collections for  our purposes.  """ -__revision__ = "src/engine/SCons/compat/_scons_collections.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/compat/_scons_collections.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  # Use exec to hide old names from fixers.  exec("""if True: diff --git a/engine/SCons/compat/_scons_dbm.py b/engine/SCons/compat/_scons_dbm.py index 69594ee..3bc0768 100644 --- a/engine/SCons/compat/_scons_dbm.py +++ b/engine/SCons/compat/_scons_dbm.py @@ -30,7 +30,7 @@ that the whichdb.whichdb() implementstation in the various 2.X versions of  Python won't blow up even if dbm wasn't compiled in.  """ -__revision__ = "src/engine/SCons/compat/_scons_dbm.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/compat/_scons_dbm.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  class error(Exception):      pass diff --git a/engine/SCons/compat/_scons_hashlib.py b/engine/SCons/compat/_scons_hashlib.py index 2521f60..de93e4b 100644 --- a/engine/SCons/compat/_scons_hashlib.py +++ b/engine/SCons/compat/_scons_hashlib.py @@ -31,7 +31,7 @@ purposes, anyway).  In fact, this module will raise an ImportError if  the underlying md5 module isn't available.  """ -__revision__ = "src/engine/SCons/compat/_scons_hashlib.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/compat/_scons_hashlib.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import md5  from string import hexdigits diff --git a/engine/SCons/compat/_scons_io.py b/engine/SCons/compat/_scons_io.py index c6a2fa4..72cd3b6 100644 --- a/engine/SCons/compat/_scons_io.py +++ b/engine/SCons/compat/_scons_io.py @@ -29,7 +29,7 @@ functionality.  It only wraps the portions of io functionality used  by SCons, in an interface that looks enough like io for our purposes.  """ -__revision__ = "src/engine/SCons/compat/_scons_io.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/compat/_scons_io.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  # Use the "imp" module to protect the imports below from fixers.  import imp diff --git a/engine/SCons/cpp.py b/engine/SCons/cpp.py index d8874f2..cf80a4b 100644 --- a/engine/SCons/cpp.py +++ b/engine/SCons/cpp.py @@ -21,7 +21,7 @@  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/cpp.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/cpp.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  __doc__ = """  SCons C Pre-Processor module diff --git a/engine/SCons/exitfuncs.py b/engine/SCons/exitfuncs.py index 5c44508..19c8e8e 100644 --- a/engine/SCons/exitfuncs.py +++ b/engine/SCons/exitfuncs.py @@ -27,7 +27,7 @@ Register functions which are executed when SCons exits for any reason.  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  # -__revision__ = "src/engine/SCons/exitfuncs.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/engine/SCons/exitfuncs.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import atexit diff --git a/scons-time.1 b/scons-time.1 index c4750a1..fa4b01d 100644 --- a/scons-time.1 +++ b/scons-time.1 @@ -2,12 +2,12 @@  .\"     Title: SCONS-TIME  .\"    Author: [see the "AUTHORS" section]  .\" Generator: DocBook XSL Stylesheets v1.76.1 <http://docbook.sf.net/> -.\"      Date: 07/31/2015 -.\"    Manual: SCons 2.3.6 -.\"    Source: SCons 2.3.6 +.\"      Date: 09/21/2015 +.\"    Manual: SCons 2.4.0 +.\"    Source: SCons 2.4.0  .\"  Language: English  .\" -.TH "SCONS\-TIME" "1" "07/31/2015" "SCons 2\&.3\&.6" "SCons 2\&.3\&.6" +.TH "SCONS\-TIME" "1" "09/21/2015" "SCons 2\&.4\&.0" "SCons 2\&.4\&.0"  .\" -----------------------------------------------------------------  .\" * Define some portability stuff  .\" ----------------------------------------------------------------- @@ -3,11 +3,11 @@  .\"    Author: Steven Knight  .\" Generator: DocBook XSL Stylesheets v1.76.1 <http://docbook.sf.net/>  .\"      Date: <pubdate>2004 - 2015</pubdate> -.\"    Manual: SCons 2.3.6 -.\"    Source: SCons 2.3.6 version 2.3.6 +.\"    Manual: SCons 2.4.0 +.\"    Source: SCons 2.4.0 version 2.4.0  .\"  Language: English  .\" -.TH "SCONS" "1" "<pubdate>2004 - 2015</pubdate>" "SCons 2\&.3\&.6 version 2.3.6" "SCons 2\&.3\&.6" +.TH "SCONS" "1" "<pubdate>2004 - 2015</pubdate>" "SCons 2\&.4\&.0 version 2.4.0" "SCons 2\&.4\&.0"  .\" -----------------------------------------------------------------  .\" * Define some portability stuff  .\" ----------------------------------------------------------------- @@ -15554,8 +15554,7 @@ option on the command line\&.  .PP  SWIGPATH  .RS 4 -The list of directories that the scripting language wrapper and interface generate will search for included files\&. The SWIG implicit dependency scanner will search these directories for include files\&. The default is to use the same path specified as -\fB$CPPPATH\fR\&. +The list of directories that the scripting language wrapper and interface generate will search for included files\&. The SWIG implicit dependency scanner will search these directories for include files\&. The default value is an empty list\&.  .sp  Don\*(Aqt explicitly put include directory arguments in SWIGFLAGS; the result will be non\-portable and the directories will not be searched by the dependency scanner\&. Note: directory names in SWIGPATH will be looked\-up relative to the SConscript directory when they are used in a command\&. To force  scons @@ -15599,7 +15598,7 @@ construction variables to the beginning and end of each directory in  .RS 4  .\}  .nf -env = Environment(SWIGCOM="my_swig \-o $TARGET $_SWIGINCFLAGS $SORUCES") +env = Environment(SWIGCOM="my_swig \-o $TARGET $_SWIGINCFLAGS $SOURCES")  .fi  .if n \{\  .RE @@ -2,12 +2,12 @@  .\"     Title: SCONSIGN  .\"    Author: [see the "AUTHORS" section]  .\" Generator: DocBook XSL Stylesheets v1.76.1 <http://docbook.sf.net/> -.\"      Date: 07/31/2015 -.\"    Manual: SCons 2.3.6 -.\"    Source: SCons 2.3.6 +.\"      Date: 09/21/2015 +.\"    Manual: SCons 2.4.0 +.\"    Source: SCons 2.4.0  .\"  Language: English  .\" -.TH "SCONSIGN" "1" "07/31/2015" "SCons 2\&.3\&.6" "SCons 2\&.3\&.6" +.TH "SCONSIGN" "1" "09/21/2015" "SCons 2\&.4\&.0" "SCons 2\&.4\&.0"  .\" -----------------------------------------------------------------  .\" * Define some portability stuff  .\" ----------------------------------------------------------------- diff --git a/script/scons b/script/scons index a56dd8d..0e59647 100644 --- a/script/scons +++ b/script/scons @@ -23,15 +23,15 @@  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/script/scons.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/script/scons.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog" -__version__ = "2.3.6" +__version__ = "2.4.0" -__build__ = "rel_2.3.5:3347:d31d5a4e74b6[MODIFIED]" +__build__ = "rel_2.4.0:3365:9259ea1c13d7"  __buildsys__ = "hpmicrodog" -__date__ = "2015/07/31 14:36:10" +__date__ = "2015/09/21 14:03:43"  __developer__ = "bdbaddog" diff --git a/script/scons-time b/script/scons-time index 1fe3de5..f37d906 100644 --- a/script/scons-time +++ b/script/scons-time @@ -32,7 +32,7 @@  from __future__ import division  from __future__ import nested_scopes -__revision__ = "src/script/scons-time.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/script/scons-time.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import getopt  import glob diff --git a/script/scons.bat b/script/scons.bat index add424e..bda2baa 100644 --- a/script/scons.bat +++ b/script/scons.bat @@ -1,11 +1,11 @@  @REM Copyright (c) 2001 - 2015 The SCons Foundation
 -@REM src/script/scons.bat rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog
 +@REM src/script/scons.bat rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog
  @echo off
  set SCONS_ERRORLEVEL=
  if "%OS%" == "Windows_NT" goto WinNT
  @REM for 9x/Me you better not have more than 9 args
 -python -c "from os.path import join; import sys; sys.path = [ join(sys.prefix, 'Lib', 'site-packages', 'scons-2.3.6'), join(sys.prefix, 'Lib', 'site-packages', 'scons'), join(sys.prefix, 'scons-2.3.6'), join(sys.prefix, 'scons')] + sys.path; import SCons.Script; SCons.Script.main()" %1 %2 %3 %4 %5 %6 %7 %8 %9
 +python -c "from os.path import join; import sys; sys.path = [ join(sys.prefix, 'Lib', 'site-packages', 'scons-2.4.0'), join(sys.prefix, 'Lib', 'site-packages', 'scons'), join(sys.prefix, 'scons-2.4.0'), join(sys.prefix, 'scons')] + sys.path; import SCons.Script; SCons.Script.main()" %1 %2 %3 %4 %5 %6 %7 %8 %9
  @REM no way to set exit status of this script for 9x/Me
  goto endscons
 diff --git a/script/sconsign b/script/sconsign index c652bf7..35dad8a 100644 --- a/script/sconsign +++ b/script/sconsign @@ -23,15 +23,15 @@  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -__revision__ = "src/script/sconsign.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/script/sconsign.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog" -__version__ = "2.3.6" +__version__ = "2.4.0" -__build__ = "rel_2.3.5:3347:d31d5a4e74b6[MODIFIED]" +__build__ = "rel_2.4.0:3365:9259ea1c13d7"  __buildsys__ = "hpmicrodog" -__date__ = "2015/07/31 14:36:10" +__date__ = "2015/09/21 14:03:43"  __developer__ = "bdbaddog" @@ -278,7 +278,7 @@ def field(name, entry, verbose=Verbose):  def nodeinfo_raw(name, ninfo, prefix=""):      # This just formats the dictionary, which we would normally use str()      # to do, except that we want the keys sorted for deterministic output. -    d = ninfo.__dict__ +    d = ninfo.__getstate__()      try:          keys = ninfo.field_list + ['_version_id']      except AttributeError: @@ -32,13 +32,13 @@ NOTE: Installed SCons is not importable like usual Python packages. It is        below is dedicated to make it happen on various platforms.  """ -__revision__ = "src/setup.py rel_2.3.5:3347:d31d5a4e74b6 2015/07/31 14:36:10 bdbaddog" +__revision__ = "src/setup.py rel_2.4.0:3365:9259ea1c13d7 2015/09/21 14:03:43 bdbaddog"  import os  import stat  import sys -Version = "2.3.6" +Version = "2.4.0"  man_pages = [      'scons.1',  | 
