| Index: third_party/scons/scons-local/SCons/Environment.py
 | 
| ===================================================================
 | 
| --- third_party/scons/scons-local/SCons/Environment.py	(revision 7505)
 | 
| +++ third_party/scons/scons-local/SCons/Environment.py	(working copy)
 | 
| @@ -32,7 +32,7 @@
 | 
|  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
|  #
 | 
|  
 | 
| -__revision__ = "src/engine/SCons/Environment.py 3603 2008/10/10 05:46:45 scons"
 | 
| +__revision__ = "src/engine/SCons/Environment.py 3842 2008/12/20 22:59:52 scons"
 | 
|  
 | 
|  
 | 
|  import copy
 | 
| @@ -105,25 +105,41 @@
 | 
|          else:
 | 
|              env.Tool(tool)
 | 
|  
 | 
| -# These names are controlled by SCons; users should never set or override
 | 
| -# them.  This warning can optionally be turned off, but scons will still
 | 
| -# ignore the illegal variable names even if it's off.
 | 
| -reserved_construction_var_names = \
 | 
| -    ['TARGET', 'TARGETS', 'SOURCE', 'SOURCES']
 | 
| +# These names are (or will be) controlled by SCons; users should never
 | 
| +# set or override them.  This warning can optionally be turned off,
 | 
| +# but scons will still ignore the illegal variable names even if it's off.
 | 
| +reserved_construction_var_names = [
 | 
| +    'SOURCE',
 | 
| +    'SOURCES',
 | 
| +    'TARGET',
 | 
| +    'TARGETS',
 | 
| +]
 | 
|  
 | 
| +future_reserved_construction_var_names = [
 | 
| +    'CHANGED_SOURCES',
 | 
| +    'CHANGED_TARGETS',
 | 
| +    'UNCHANGED_SOURCES',
 | 
| +    'UNCHANGED_TARGETS',
 | 
| +]
 | 
| +
 | 
|  def copy_non_reserved_keywords(dict):
 | 
|      result = semi_deepcopy(dict)
 | 
|      for k in result.keys():
 | 
|          if k in reserved_construction_var_names:
 | 
| -            SCons.Warnings.warn(SCons.Warnings.ReservedVariableWarning,
 | 
| -                                "Ignoring attempt to set reserved variable `%s'" % k)
 | 
| +            msg = "Ignoring attempt to set reserved variable `$%s'"
 | 
| +            SCons.Warnings.warn(SCons.Warnings.ReservedVariableWarning, msg % k)
 | 
|              del result[k]
 | 
|      return result
 | 
|  
 | 
|  def _set_reserved(env, key, value):
 | 
| -    msg = "Ignoring attempt to set reserved variable `%s'" % key
 | 
| -    SCons.Warnings.warn(SCons.Warnings.ReservedVariableWarning, msg)
 | 
| +    msg = "Ignoring attempt to set reserved variable `$%s'"
 | 
| +    SCons.Warnings.warn(SCons.Warnings.ReservedVariableWarning, msg % key)
 | 
|  
 | 
| +def _set_future_reserved(env, key, value):
 | 
| +    env._dict[key] = value
 | 
| +    msg = "`$%s' will be reserved in a future release and setting it will become ignored"
 | 
| +    SCons.Warnings.warn(SCons.Warnings.FutureReservedVariableWarning, msg % key)
 | 
| +
 | 
|  def _set_BUILDERS(env, key, value):
 | 
|      try:
 | 
|          bd = env._dict[key]
 | 
| @@ -142,8 +158,26 @@
 | 
|      env._dict[key] = value
 | 
|      env.scanner_map_delete()
 | 
|  
 | 
| +def _delete_duplicates(l, keep_last):
 | 
| +    """Delete duplicates from a sequence, keeping the first or last."""
 | 
| +    seen={}
 | 
| +    result=[]
 | 
| +    if keep_last:           # reverse in & out, then keep first
 | 
| +        l.reverse()
 | 
| +    for i in l:
 | 
| +        try:
 | 
| +            if not seen.has_key(i):
 | 
| +                result.append(i)
 | 
| +                seen[i]=1
 | 
| +        except TypeError:
 | 
| +            # probably unhashable.  Just keep it.
 | 
| +            result.append(i)
 | 
| +    if keep_last:
 | 
| +        result.reverse()
 | 
| +    return result
 | 
|  
 | 
|  
 | 
| +
 | 
|  # The following is partly based on code in a comment added by Peter
 | 
|  # Shannon at the following page (there called the "transplant" class):
 | 
|  #
 | 
| @@ -219,8 +253,7 @@
 | 
|          return apply(MethodWrapper.__call__, (self, target, source) + args, kw)
 | 
|  
 | 
|      def __repr__(self):
 | 
| -        fmt = '<BuilderWrapper %s instance at 0x%08X>'
 | 
| -        return fmt % (repr(self.name), id(self))
 | 
| +        return '<BuilderWrapper %s>' % repr(self.name)
 | 
|  
 | 
|      def __str__(self):
 | 
|          return self.__repr__()
 | 
| @@ -347,6 +380,8 @@
 | 
|          self._special_set = {}
 | 
|          for key in reserved_construction_var_names:
 | 
|              self._special_set[key] = _set_reserved
 | 
| +        for key in future_reserved_construction_var_names:
 | 
| +            self._special_set[key] = _set_future_reserved
 | 
|          self._special_set['BUILDERS'] = _set_BUILDERS
 | 
|          self._special_set['SCANNERS'] = _set_SCANNERS
 | 
|  
 | 
| @@ -400,6 +435,9 @@
 | 
|      def has_key(self, key):
 | 
|          return self._dict.has_key(key)
 | 
|  
 | 
| +    def __contains__(self, key):
 | 
| +        return self._dict.__contains__(key)
 | 
| +
 | 
|      def items(self):
 | 
|          return self._dict.items()
 | 
|  
 | 
| @@ -528,7 +566,8 @@
 | 
|      def backtick(self, command):
 | 
|          import subprocess
 | 
|          # common arguments
 | 
| -        kw = { 'stdout' : subprocess.PIPE,
 | 
| +        kw = { 'stdin' : 'devnull',
 | 
| +               'stdout' : subprocess.PIPE,
 | 
|                 'stderr' : subprocess.PIPE,
 | 
|                 'universal_newlines' : True,
 | 
|               }
 | 
| @@ -1190,6 +1229,8 @@
 | 
|          """
 | 
|          kw = copy_non_reserved_keywords(kw)
 | 
|          for key, val in kw.items():
 | 
| +            if SCons.Util.is_List(val):
 | 
| +                val = _delete_duplicates(val, delete_existing)
 | 
|              if not self._dict.has_key(key) or self._dict[key] in ('', None):
 | 
|                  self._dict[key] = val
 | 
|              elif SCons.Util.is_Dict(self._dict[key]) and \
 | 
| @@ -1543,6 +1584,8 @@
 | 
|          """
 | 
|          kw = copy_non_reserved_keywords(kw)
 | 
|          for key, val in kw.items():
 | 
| +            if SCons.Util.is_List(val):
 | 
| +                val = _delete_duplicates(val, not delete_existing)
 | 
|              if not self._dict.has_key(key) or self._dict[key] in ('', None):
 | 
|                  self._dict[key] = val
 | 
|              elif SCons.Util.is_Dict(self._dict[key]) and \
 | 
| @@ -2169,6 +2212,10 @@
 | 
|              return 1
 | 
|          except KeyError:
 | 
|              return self.__dict__['__subject'].has_key(key)
 | 
| +    def __contains__(self, key):
 | 
| +        if self.__dict__['overrides'].__contains__(key):
 | 
| +            return 1
 | 
| +        return self.__dict__['__subject'].__contains__(key)
 | 
|      def Dictionary(self):
 | 
|          """Emulates the items() method of dictionaries."""
 | 
|          d = self.__dict__['__subject'].Dictionary().copy()
 | 
| 
 |