Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package scons for openSUSE:Factory checked 
in at 2024-10-25 19:19:10
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/scons (Old)
 and      /work/SRC/openSUSE:Factory/.scons.new.2020 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "scons"

Fri Oct 25 19:19:10 2024 rev:49 rq:1218160 version:4.8.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/scons/scons.changes      2024-07-10 
16:48:05.852494118 +0200
+++ /work/SRC/openSUSE:Factory/.scons.new.2020/scons.changes    2024-10-25 
19:19:54.619296538 +0200
@@ -1,0 +2,12 @@
+Thu Oct 24 18:52:36 UTC 2024 - Andreas Stieger <[email protected]>
+
+- SCons 4.8.1:
+  * env.Dump() now accepts any number of optional "key" arguments,
+    and returns a dictionary string
+  * Fix SCons.Variables import
+  * Fix a problem with AppendUnique and PrependUnique where a value
+    could be erroneously removed due to a substring match.
+  * Fix handling of ListVariable when supplying a quoted choice
+    containing a space character
+    
+-------------------------------------------------------------------

Old:
----
  SCons-4.8.0.tar.gz

New:
----
  SCons-4.8.1.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ scons.spec ++++++
--- /var/tmp/diff_new_pack.o6jOYZ/_old  2024-10-25 19:19:55.511333756 +0200
+++ /var/tmp/diff_new_pack.o6jOYZ/_new  2024-10-25 19:19:55.515333923 +0200
@@ -20,7 +20,7 @@
 %define pythons python3
 %{?sle15_python_module_pythons}
 Name:           scons
-Version:        4.8.0
+Version:        4.8.1
 Release:        0
 Summary:        Replacement for Make
 License:        MIT

++++++ SCons-4.8.0.tar.gz -> SCons-4.8.1.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/scons-4.8.0/PKG-INFO new/scons-4.8.1/PKG-INFO
--- old/scons-4.8.0/PKG-INFO    2024-07-08 01:52:31.029407500 +0200
+++ new/scons-4.8.1/PKG-INFO    2024-09-04 02:46:54.910740000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: SCons
-Version: 4.8.0
+Version: 4.8.1
 Summary: Open Source next-generation build tool.
 Author-email: William Deegan <[email protected]>
 License: MIT
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/scons-4.8.0/SCons/Environment.py 
new/scons-4.8.1/SCons/Environment.py
--- old/scons-4.8.0/SCons/Environment.py        2024-06-30 23:44:47.000000000 
+0200
+++ new/scons-4.8.1/SCons/Environment.py        2024-09-03 04:38:32.000000000 
+0200
@@ -1512,11 +1512,17 @@
 
         self._dict[envname][name] = nv
 
-    def AppendUnique(self, delete_existing: bool=False, **kw) -> None:
-        """Append values to existing construction variables
-        in an Environment, if they're not already there.
-        If delete_existing is True, removes existing values first, so
-        values move to end.
+    def AppendUnique(self, delete_existing: bool = False, **kw) -> None:
+        """Append values uniquely to existing construction variables.
+
+        Similar to :meth:`Append`, but the result may not contain duplicates
+        of any values passed for each given key (construction variable),
+        so an existing list may need to be pruned first, however it may still
+        contain other duplicates.
+
+        If *delete_existing* is true, removes existing values first, so values
+        move to the end; otherwise (the default) values are skipped if
+        already present.
         """
         kw = copy_non_reserved_keywords(kw)
         for key, val in kw.items():
@@ -1539,12 +1545,11 @@
                     val = [x for x in val if x not in dk]
                 self._dict[key] = dk + val
             else:
+                # val is not a list, so presumably a scalar (likely str).
                 dk = self._dict[key]
                 if is_List(dk):
-                    # By elimination, val is not a list.  Since dk is a
-                    # list, wrap val in a list first.
                     if delete_existing:
-                        dk = list(filter(lambda x, val=val: x not in val, dk))
+                        dk = [x for x in dk if x != val]
                         self._dict[key] = dk + [val]
                     else:
                         if val not in dk:
@@ -1694,28 +1699,37 @@
         return dlist
 
 
-    def Dump(self, key: Optional[str] = None, format: str = 'pretty') -> str:
-        """ Returns a dump of serialized construction variables.
+    def Dump(self, *key: str, format: str = 'pretty') -> str:
+        """Return string of serialized construction variables.
 
-        The display formats are intended for humaan readers when
-        debugging - none of the supported formats produce a result that
-        SCons itself can directly make use of. Objects that cannot
-        directly be represented get a placeholder like
-        ``<function foo at 0x123456>`` or ``<<non-serializable: function>>``.
+        Produces a "pretty" output of a dictionary of selected
+        construction variables, or all of them. The display *format* is
+        selectable. The result is intended for human consumption (e.g,
+        to print), mainly when debugging.  Objects that cannot directly be
+        represented get a placeholder like ``<function foo at 0x123456>``
+        (pretty-print) or ``<<non-serializable: function>>`` (JSON).
 
         Args:
-           key: if ``None``, format the whole dict of variables,
-              else format just the value of *key*.
+           key: if omitted, format the whole dict of variables,
+              else format *key*(s) with the corresponding values.
            format: specify the format to serialize to. ``"pretty"`` generates
              a pretty-printed string, ``"json"`` a JSON-formatted string.
 
         Raises:
            ValueError: *format* is not a recognized serialization format.
+
+        .. versionchanged:: NEXT_VERSION
+           *key* is no longer limited to a single construction variable name.
+           If *key* is supplied, a formatted dictionary is generated like the
+           no-arg case - previously a single *key* displayed just the value.
         """
-        if key:
-            cvars = self.Dictionary(key)
-        else:
+        if not key:
             cvars = self.Dictionary()
+        elif len(key) == 1:
+            dkey = key[0]
+            cvars = {dkey: self[dkey]}
+        else:
+            cvars = dict(zip(key, self.Dictionary(*key)))
 
         fmt = format.lower()
 
@@ -1735,14 +1749,15 @@
 
             class DumpEncoder(json.JSONEncoder):
                 """SCons special json Dump formatter."""
+
                 def default(self, obj):
                     if isinstance(obj, (UserList, UserDict)):
                         return obj.data
                     return f'<<non-serializable: {type(obj).__qualname__}>>'
 
             return json.dumps(cvars, indent=4, cls=DumpEncoder, sort_keys=True)
-        else:
-            raise ValueError("Unsupported serialization format: %s." % fmt)
+
+        raise ValueError("Unsupported serialization format: %s." % fmt)
 
 
     def FindIxes(self, paths: Sequence[str], prefix: str, suffix: str) -> 
Optional[str]:
@@ -1929,11 +1944,17 @@
 
         self._dict[envname][name] = nv
 
-    def PrependUnique(self, delete_existing: bool=False, **kw) -> None:
-        """Prepend values to existing construction variables
-        in an Environment, if they're not already there.
-        If delete_existing is True, removes existing values first, so
-        values move to front.
+    def PrependUnique(self, delete_existing: bool = False, **kw) -> None:
+        """Prepend values uniquely to existing construction variables.
+
+        Similar to :meth:`Prepend`, but the result may not contain duplicates
+        of any values passed for each given key (construction variable),
+        so an existing list may need to be pruned first, however it may still
+        contain other duplicates.
+
+        If *delete_existing* is true, removes existing values first, so values
+        move to the front; otherwise (the default) values are skipped if
+        already present.
         """
         kw = copy_non_reserved_keywords(kw)
         for key, val in kw.items():
@@ -1956,12 +1977,11 @@
                     val = [x for x in val if x not in dk]
                 self._dict[key] = val + dk
             else:
+                # val is not a list, so presumably a scalar (likely str).
                 dk = self._dict[key]
                 if is_List(dk):
-                    # By elimination, val is not a list.  Since dk is a
-                    # list, wrap val in a list first.
                     if delete_existing:
-                        dk = [x for x in dk if x not in val]
+                        dk = [x for x in dk if x != val]
                         self._dict[key] = [val] + dk
                     else:
                         if val not in dk:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/scons-4.8.0/SCons/Platform/win32.py 
new/scons-4.8.1/SCons/Platform/win32.py
--- old/scons-4.8.0/SCons/Platform/win32.py     2024-02-04 21:49:23.000000000 
+0100
+++ new/scons-4.8.1/SCons/Platform/win32.py     2024-09-03 04:38:32.000000000 
+0200
@@ -167,7 +167,7 @@
         try:
             with open(tmpFileStdoutName, "rb") as tmpFileStdout:
                 output = tmpFileStdout.read()
-                stdout.write(output.decode(stdout.encoding, "replace"))
+                stdout.write(output.decode('oem', "replace").replace("\r\n", 
"\n"))
             os.remove(tmpFileStdoutName)
         except OSError:
             pass
@@ -176,7 +176,7 @@
         try:
             with open(tmpFileStderrName, "rb") as tmpFileStderr:
                 errors = tmpFileStderr.read()
-                stderr.write(errors.decode(stderr.encoding, "replace"))
+                stderr.write(errors.decode('oem', "replace").replace("\r\n", 
"\n"))
             os.remove(tmpFileStderrName)
         except OSError:
             pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/scons-4.8.0/SCons/Script/Main.py 
new/scons-4.8.1/SCons/Script/Main.py
--- old/scons-4.8.0/SCons/Script/Main.py        2024-07-08 01:48:05.000000000 
+0200
+++ new/scons-4.8.1/SCons/Script/Main.py        2024-07-08 02:20:02.000000000 
+0200
@@ -67,7 +67,7 @@
 
 # these define the range of versions SCons supports
 minimum_python_version = (3, 6, 0)
-deprecated_python_version = (3, 7, 0)  # the first non-deprecated version
+deprecated_python_version = (3, 7, 0)
 
 # ordered list of SConstruct names to look for if there is no -f flag
 KNOWN_SCONSTRUCT_NAMES = [
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/scons-4.8.0/SCons/Util/sctypes.py 
new/scons-4.8.1/SCons/Util/sctypes.py
--- old/scons-4.8.0/SCons/Util/sctypes.py       2024-02-22 23:42:56.000000000 
+0100
+++ new/scons-4.8.1/SCons/Util/sctypes.py       2024-07-22 03:13:08.000000000 
+0200
@@ -11,7 +11,8 @@
 import os
 import pprint
 import re
-from typing import Optional
+import sys
+from typing import Optional, Union
 
 from collections import UserDict, UserList, UserString, deque
 from collections.abc import MappingView, Iterable
@@ -50,38 +51,63 @@
 # Empirically, it is faster to check explicitly for str than for basestring.
 BaseStringTypes = str
 
+# Later Python versions allow us to explicitly apply type hints based off the
+# return value similar to isinstance(), albeit not as precise.
+if sys.version_info >= (3, 13):
+    from typing import TypeAlias, TypeIs
+
+    DictTypeRet: TypeAlias = TypeIs[Union[dict, UserDict]]
+    ListTypeRet: TypeAlias = TypeIs[Union[list, UserList, deque]]
+    SequenceTypeRet: TypeAlias = TypeIs[Union[list, tuple, deque, UserList, 
MappingView]]
+    TupleTypeRet: TypeAlias = TypeIs[tuple]
+    StringTypeRet: TypeAlias = TypeIs[Union[str, UserString]]
+elif sys.version_info >= (3, 10):
+    from typing import TypeAlias, TypeGuard
+
+    DictTypeRet: TypeAlias = TypeGuard[Union[dict, UserDict]]
+    ListTypeRet: TypeAlias = TypeGuard[Union[list, UserList, deque]]
+    SequenceTypeRet: TypeAlias = TypeGuard[Union[list, tuple, deque, UserList, 
MappingView]]
+    TupleTypeRet: TypeAlias = TypeGuard[tuple]
+    StringTypeRet: TypeAlias = TypeGuard[Union[str, UserString]]
+else:
+    DictTypeRet = Union[bool, bool]
+    ListTypeRet = Union[bool, bool]
+    SequenceTypeRet = Union[bool, bool]
+    TupleTypeRet = Union[bool, bool]
+    StringTypeRet = Union[bool, bool]
+
 
 def is_Dict(  # pylint: disable=redefined-outer-name,redefined-builtin
     obj, isinstance=isinstance, DictTypes=DictTypes
-) -> bool:
+) -> DictTypeRet:
     """Check if object is a dict."""
     return isinstance(obj, DictTypes)
 
 
 def is_List(  # pylint: disable=redefined-outer-name,redefined-builtin
     obj, isinstance=isinstance, ListTypes=ListTypes
-) -> bool:
+) -> ListTypeRet:
     """Check if object is a list."""
     return isinstance(obj, ListTypes)
 
 
 def is_Sequence(  # pylint: disable=redefined-outer-name,redefined-builtin
     obj, isinstance=isinstance, SequenceTypes=SequenceTypes
-) -> bool:
+) -> SequenceTypeRet:
     """Check if object is a sequence."""
     return isinstance(obj, SequenceTypes)
 
 
 def is_Tuple(  # pylint: disable=redefined-builtin
     obj, isinstance=isinstance, tuple=tuple
-) -> bool:
+) -> TupleTypeRet:
     """Check if object is a tuple."""
     return isinstance(obj, tuple)
 
 
 def is_String(  # pylint: disable=redefined-outer-name,redefined-builtin
     obj, isinstance=isinstance, StringTypes=StringTypes
-) -> bool:
+) -> StringTypeRet:
     """Check if object is a string."""
     return isinstance(obj, StringTypes)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/scons-4.8.0/SCons/Variables/BoolVariable.py 
new/scons-4.8.1/SCons/Variables/BoolVariable.py
--- old/scons-4.8.0/SCons/Variables/BoolVariable.py     2024-07-06 
05:33:58.000000000 +0200
+++ new/scons-4.8.1/SCons/Variables/BoolVariable.py     2024-09-03 
04:38:32.000000000 +0200
@@ -32,7 +32,7 @@
         ...
 """
 
-from typing import Tuple, Callable
+from typing import Callable, Tuple, Union
 
 import SCons.Errors
 
@@ -42,7 +42,7 @@
 FALSE_STRINGS = ('n', 'no', 'false', 'f', '0', 'off', 'none')
 
 
-def _text2bool(val: str) -> bool:
+def _text2bool(val: Union[str, bool]) -> bool:
     """Convert boolean-like string to boolean.
 
     If *val* looks like it expresses a bool-like value, based on
@@ -54,6 +54,9 @@
     Raises:
         ValueError: if *val* cannot be converted to boolean.
     """
+    if isinstance(val, bool):
+        # mainly for the subst=False case: default might be a bool
+        return val
     lval = val.lower()
     if lval in TRUE_STRINGS:
         return True
@@ -63,7 +66,7 @@
     raise ValueError(f"Invalid value for boolean variable: {val!r}")
 
 
-def _validator(key, val, env) -> None:
+def _validator(key: str, val, env) -> None:
     """Validate that the value of *key* in *env* is a boolean.
 
     Parameter *val* is not used in the check.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/scons-4.8.0/SCons/Variables/ListVariable.py 
new/scons-4.8.1/SCons/Variables/ListVariable.py
--- old/scons-4.8.0/SCons/Variables/ListVariable.py     2024-07-06 
05:33:58.000000000 +0200
+++ new/scons-4.8.1/SCons/Variables/ListVariable.py     2024-09-03 
04:38:32.000000000 +0200
@@ -81,6 +81,7 @@
         if allowedElems is None:
             allowedElems = []
         super().__init__([_f for _f in initlist if _f])
+        # TODO: why sorted? don't we want to display in the order user gave?
         self.allowedElems = sorted(allowedElems)
 
     def __cmp__(self, other):
@@ -118,6 +119,9 @@
     The arguments *allowedElems* and *mapdict* are non-standard
     for a :class:`Variables` converter: the lambda in the
     :func:`ListVariable` function arranges for us to be called correctly.
+
+    Incoming values ``all`` and ``none`` are recognized and converted
+    into their expanded form.
     """
     if val == 'none':
         val = []
@@ -155,7 +159,7 @@
     allowedElems = env[key].allowedElems
     if isinstance(val, _ListVariable):  # not substituted, use .data
         notAllowed = [v for v in val.data if v not in allowedElems]
-    else:  # val will be a string
+    else:  # presumably a string
         notAllowed = [v for v in val.split() if v not in allowedElems]
     if notAllowed:
         # Converter only synthesized 'all' and 'none', they are never
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/scons-4.8.0/SCons/Variables/PackageVariable.py 
new/scons-4.8.1/SCons/Variables/PackageVariable.py
--- old/scons-4.8.0/SCons/Variables/PackageVariable.py  2024-05-25 
21:36:34.000000000 +0200
+++ new/scons-4.8.1/SCons/Variables/PackageVariable.py  2024-09-03 
04:38:32.000000000 +0200
@@ -51,7 +51,7 @@
 """
 
 import os
-from typing import Callable, Optional, Tuple
+from typing import Callable, Optional, Tuple, Union
 
 import SCons.Errors
 
@@ -60,13 +60,16 @@
 ENABLE_STRINGS = ('1', 'yes', 'true',  'on', 'enable', 'search')
 DISABLE_STRINGS = ('0', 'no',  'false', 'off', 'disable')
 
-def _converter(val):
+def _converter(val: Union[str, bool]) -> Union[str, bool]:
     """Convert package variables.
 
     Returns True or False if one of the recognized truthy or falsy
     values is seen, else return the value unchanged (expected to
     be a path string).
     """
+    if isinstance(val, bool):
+        # mainly for the subst=False case: default might be a bool
+        return val
     lval = val.lower()
     if lval in ENABLE_STRINGS:
         return True
@@ -75,7 +78,7 @@
     return val
 
 
-def _validator(key, val, env, searchfunc) -> None:
+def _validator(key: str, val, env, searchfunc) -> None:
     """Validate package variable for valid path.
 
     Checks that if a path is given as the value, that pathname actually exists.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/scons-4.8.0/SCons/Variables/PathVariable.py 
new/scons-4.8.1/SCons/Variables/PathVariable.py
--- old/scons-4.8.0/SCons/Variables/PathVariable.py     2024-07-06 
05:33:58.000000000 +0200
+++ new/scons-4.8.1/SCons/Variables/PathVariable.py     2024-09-03 
04:38:32.000000000 +0200
@@ -93,12 +93,12 @@
     """
 
     @staticmethod
-    def PathAccept(key, val, env) -> None:
+    def PathAccept(key: str, val, env) -> None:
         """Validate path with no checking."""
         return
 
     @staticmethod
-    def PathIsDir(key, val, env) -> None:
+    def PathIsDir(key: str, val, env) -> None:
         """Validate path is a directory."""
         if os.path.isdir(val):
             return
@@ -109,7 +109,7 @@
         raise SCons.Errors.UserError(msg)
 
     @staticmethod
-    def PathIsDirCreate(key, val, env) -> None:
+    def PathIsDirCreate(key: str, val, env) -> None:
         """Validate path is a directory, creating if needed."""
         if os.path.isdir(val):
             return
@@ -123,7 +123,7 @@
             raise SCons.Errors.UserError(msg) from exc
 
     @staticmethod
-    def PathIsFile(key, val, env) -> None:
+    def PathIsFile(key: str, val, env) -> None:
         """Validate path is a file."""
         if not os.path.isfile(val):
             if os.path.isdir(val):
@@ -133,7 +133,7 @@
             raise SCons.Errors.UserError(msg)
 
     @staticmethod
-    def PathExists(key, val, env) -> None:
+    def PathExists(key: str, val, env) -> None:
         """Validate path exists."""
         if not os.path.exists(val):
             msg = f'Path for variable {key!r} does not exist: {val}'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/scons-4.8.0/SCons/Variables/__init__.py 
new/scons-4.8.1/SCons/Variables/__init__.py
--- old/scons-4.8.0/SCons/Variables/__init__.py 2024-07-06 05:33:58.000000000 
+0200
+++ new/scons-4.8.1/SCons/Variables/__init__.py 2024-09-03 04:38:32.000000000 
+0200
@@ -43,6 +43,11 @@
 __all__ = [
     "Variable",
     "Variables",
+    "BoolVariable",
+    "EnumVariable",
+    "ListVariable",
+    "PackageVariable",
+    "PathVariable",
 ]
 
 class Variable:
@@ -56,7 +61,10 @@
 
     def __str__(self) -> str:
         """Provide a way to "print" a Variable object."""
-        return f"({self.key!r}, {self.aliases}, {self.help!r}, 
{self.default!r}, {self.validator}, {self.converter})"
+        return (
+            f"({self.key!r}, {self.aliases}, {self.help!r}, {self.default!r}, "
+            f"validator={self.validator}, converter={self.converter})"
+        )
 
 
 class Variables:
@@ -282,7 +290,13 @@
         for option in self.options:
             if option.validator and option.key in values:
                 if option.do_subst:
-                    value = env.subst('${%s}' % option.key)
+                    val = env[option.key]
+                    if not SCons.Util.is_String(val):
+                        # issue #4585: a _ListVariable should not be further
+                        #    substituted, breaks on values with spaces.
+                        value = val
+                    else:
+                        value = env.subst('${%s}' % option.key)
                 else:
                     value = env[option.key]
                 option.validator(option.key, value, env)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/scons-4.8.0/SCons/__init__.py 
new/scons-4.8.1/SCons/__init__.py
--- old/scons-4.8.0/SCons/__init__.py   2024-07-08 01:52:12.000000000 +0200
+++ new/scons-4.8.1/SCons/__init__.py   2024-09-04 02:46:37.000000000 +0200
@@ -1,9 +1,9 @@
-__version__="4.8.0"
+__version__="4.8.1"
 __copyright__="Copyright (c) 2001 - 2024 The SCons Foundation"
 __developer__="bdbaddog"
-__date__="Sun, 07 Jul 2024 16:52:07 -0700"
+__date__="Tue, 03 Sep 2024 17:46:32 -0700"
 __buildsys__="M1Dog2021"
-__revision__="7c688f694c644b61342670ce92977bf4a396c0d4"
-__build__="7c688f694c644b61342670ce92977bf4a396c0d4"
+__revision__="08661ed4c552323ef3a7f0ff1af38868cbabb05e"
+__build__="08661ed4c552323ef3a7f0ff1af38868cbabb05e"
 # make sure compatibility is always in place
 import SCons.compat  # noqa
\ No newline at end of file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/scons-4.8.0/SCons.egg-info/PKG-INFO 
new/scons-4.8.1/SCons.egg-info/PKG-INFO
--- old/scons-4.8.0/SCons.egg-info/PKG-INFO     2024-07-08 01:52:30.000000000 
+0200
+++ new/scons-4.8.1/SCons.egg-info/PKG-INFO     2024-09-04 02:46:54.000000000 
+0200
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: SCons
-Version: 4.8.0
+Version: 4.8.1
 Summary: Open Source next-generation build tool.
 Author-email: William Deegan <[email protected]>
 License: MIT
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/scons-4.8.0/pyproject.toml 
new/scons-4.8.1/pyproject.toml
--- old/scons-4.8.0/pyproject.toml      2024-07-06 05:33:58.000000000 +0200
+++ new/scons-4.8.1/pyproject.toml      2024-07-22 03:13:08.000000000 +0200
@@ -52,6 +52,9 @@
 include-package-data = true
 license-files = ["LICENSE"]
 
+[tool.setuptools.dynamic]
+version = {attr = "SCons.__version__"}
+
 [tool.setuptools.packages.find]
 exclude = ["template"]
 namespaces = false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/scons-4.8.0/scons-time.1 new/scons-4.8.1/scons-time.1
--- old/scons-4.8.0/scons-time.1        2024-07-08 01:52:25.000000000 +0200
+++ new/scons-4.8.1/scons-time.1        2024-09-04 02:46:49.000000000 +0200
@@ -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/07/2024
-.\"    Manual: SCons 4.8.0
-.\"    Source: SCons 4.8.0
+.\"      Date: 09/03/2024
+.\"    Manual: SCons 4.8.1
+.\"    Source: SCons 4.8.1
 .\"  Language: English
 .\"
-.TH "SCONS\-TIME" "1" "07/07/2024" "SCons 4\&.8\&.0" "SCons 4\&.8\&.0"
+.TH "SCONS\-TIME" "1" "09/03/2024" "SCons 4\&.8\&.1" "SCons 4\&.8\&.1"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/scons-4.8.0/scons.1 new/scons-4.8.1/scons.1
--- old/scons-4.8.0/scons.1     2024-07-08 01:52:28.000000000 +0200
+++ new/scons-4.8.1/scons.1     2024-09-04 02:46:52.000000000 +0200
@@ -2,12 +2,12 @@
 .\"     Title: SCONS
 .\"    Author: The SCons Development Team
 .\" Generator: DocBook XSL Stylesheets v1.76.1 <http://docbook.sf.net/>
-.\"      Date: <pubdate>Released Sun, 07 Jul 2024 16:52:07 -0700</pubdate>
-.\"    Manual: SCons 4.8.0
-.\"    Source: SCons 4.8.0 Version 4.8.0
+.\"      Date: <pubdate>Released Tue, 03 Sep 2024 17:46:32 -0700</pubdate>
+.\"    Manual: SCons 4.8.1
+.\"    Source: SCons 4.8.1 Version 4.8.1
 .\"  Language: English
 .\"
-.TH "SCONS" "1" "<pubdate>Released Sun, 07 Jul 2024 16:52:07 -0700</pubdate>" 
"SCons 4\&.8\&.0 Version 4.8.0" "SCons 4\&.8\&.0"
+.TH "SCONS" "1" "<pubdate>Released Tue, 03 Sep 2024 17:46:32 -0700</pubdate>" 
"SCons 4\&.8\&.1 Version 4.8.1" "SCons 4\&.8\&.1"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
@@ -2044,7 +2044,7 @@
 Builder Methods
 .RE
 .RS 4
-Methods and Functions to do Things
+Functions and Environment Methods
 .RE
 .RS 4
 SConscript Variables
@@ -8802,110 +8802,105 @@
 for more information about defining your own Scanner objects and using the
 SourceFileScanner
 object\&.
-.SS "Methods and Functions To Do Things"
+.SS "SCons Functions and Environment Methods"
 .PP
-In addition to Builder methods,
-\fBscons\fR
-provides a number of other
+
+SCons
+provides a variety of
 construction environment
-methods and global functions to manipulate the build configuration\&. Usually, 
a
+methods and global functions to manipulate the build configuration\&. Often, a
 construction environment
-method and global function with the same name both exist for convenience\&. In 
the following list, the global function is documented in this style:
+method and a global function with the same name exist for convenience\&. In 
this section, both forms are shown if the function can be called in either 
way\&. The documentation style for these is as follows:
 .sp
 .if n \{\
 .RS 4
 .\}
 .nf
-\fBFunction\fR(\fIarguments, [optional arguments]\fR)
+\fBFunction\fR(\fIarguments, [optional arguments, \&.\&.\&.]\fR)  # Global 
function
+\fIenv\fR\&.Function(\fIarguments, [optional arguments, \&.\&.\&.]\fR)  # 
Environment method
 .fi
 .if n \{\
 .RE
 .\}
 .PP
-and the
+In these function signatures, arguments in brackets ([]) are optional, and 
ellipses (\&.\&.\&.) indicate possible repetition\&. Positional vs\&. keyword 
arguments are usually detailed in the following text, not in the signature 
itself\&. The
+Python
+positional\-only (/) and keyword\-only (*) markers are not used\&.
+.PP
+When the
+Python
+keyword=value
+style is shown, it can have two meanings\&. If the keyword argument is known 
to the function, the value is the default for that argument if it is omitted\&. 
If the keyword is unknown to the function, some methods treat it as a
+construction variable
+assignment; otherwise an exception is raised for an unknown argument\&.
+.PP
+A global function and a same\-named
 construction environment
-method looks like:
+method have the same base functionality, with two key differences:
 .sp
-.if n \{\
 .RS 4
+.ie n \{\
+\h'-04' 1.\h'+01'\c
 .\}
-.nf
-\fIenv\fR\&.Function(\fIarguments, [optional arguments]\fR)
-.fi
-.if n \{\
-.RE
+.el \{\
+.sp -1
+.IP "  1." 4.2
 .\}
-.PP
-If the function can be called both ways, then both forms are listed\&.
-.PP
-The global function and same\-named
-construction environment
-method provide almost identical functionality, with a couple of exceptions\&. 
First, many of the
-construction environment
-methods affect only that
-construction environment, while the global function has a global effect (or, 
alternatively, takes an additional positional argument to specify the affected
-construction environment)\&. Second, where appropriate, calling the 
functionality through a
-construction environment
-will substitute
-construction variables
-into any supplied string arguments, while the global function, unless it takes 
a
-construction environment
-parameter, does not have the context of a
+
+Construction environment
+methods that change the environment act on the environment instance from which 
they are called, while the corresponding global function acts on a special 
\(lqhidden\(rq
 construction environment
-to pick variables from, and thus cannot perform substitutions\&. For example:
+called the Default Environment\&. In some cases, the global function may take 
an initial argument giving the object to operate on\&.
+.RE
 .sp
-.if n \{\
 .RS 4
+.ie n \{\
+\h'-04' 2.\h'+01'\c
 .\}
-.nf
-Default(\*(Aq$FOO\*(Aq)
-
-env = Environment(FOO=\*(Aqfoo\*(Aq)
-env\&.Default(\*(Aq$FOO\*(Aq)
-.fi
-.if n \{\
-.RE
+.el \{\
+.sp -1
+.IP "  2." 4.2
 .\}
-.PP
-In the above example, the call to the global
-\fBDefault\fR
-function will add a target named
-\fB$FOO\fR
-to the list of default targets, while the call to the
-\fBenv\&.Default\fR
-construction environment
-method will expand the value and add a target named
-\fBfoo\fR
-to the list of default targets\&. For more on
+String\-valued arguments (including strings in list\-valued arguments) are 
subject to construction variable expansion by the environment method form; 
variable expansion is not immediately performed in the global function\&. For 
example,
+\fBDefault(\*(Aq$MYTARGET\*(Aq)\fR
+adds
+\*(Aq$MYTARGET\*(Aq
+to the list of default targets, while if the value in
+\fIenv\fR
+of
+MYTARGET
+is
+\*(Aqmine\*(Aq,
+\fBenv\&.Default(\*(Aq$MYTARGET\*(Aq\fR
+adds
+\*(Aqmine\*(Aq
+to the default targets\&. For more details on
 construction variable
 expansion, see the
 Construction variables
-section below\&.
+section\&.
+.RE
 .PP
 Global functions are automatically in scope inside
 SConscript
-files\&. If you have custom
+files\&. If your project adds
+Python
+modules that you include via the
 Python
-code that you import into an
+import
+statement from an
 SConscript
-file, such code will need to bring them into their own scope\&. You can do 
that by adding the following import to the
+file, such code will need to add the functions to that module\(cqs global 
scope explicitly\&. You can do that by adding the following import to the
 Python
 module:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-from SCons\&.Script import *
-.fi
-.if n \{\
-.RE
-.\}
+\fBfrom SCons\&.Script import *\fR\&.
 .PP
-Construction environment
-methods and global functions provided by
-\fBscons\fR
-include:
+
+SCons
+provides the following
+construction environment
+methods and global functions\&. The list can be augmented on a project basis 
using
+\fBAddMethod\fR
 .PP
 \fBAction\fR(\fIaction, [output, [var, \&.\&.\&.]] [key=value, \&.\&.\&.]\fR), 
\fIenv\fR\&.Action(\fIaction, [output, [var, \&.\&.\&.]] [key=value, 
\&.\&.\&.]\fR)
 .RS 4
@@ -8975,16 +8970,18 @@
 .\}
 .RE
 .PP
-\fBAddOption\fR(\fIarguments\fR)
+\fBAddOption\fR(\fIopt_str, \&.\&.\&., attr=value, \&.\&.\&.\fR)
 .RS 4
-Adds a local (project\-specific) command\-line option\&.
-\fIarguments\fR
-are the same as those supported by the
-\fBadd_option\fR
+Adds a local (project\-specific) command\-line option\&. One or more
+\fIopt_str\fR
+values are the strings representing how the option can be called, while the 
keyword arguments define attributes of the option\&. For the most part these 
are the same as for the
+\fBOptionParser\&.add_option\fR
 method in the standard Python library module
-optparse, with a few additional capabilities noted below\&. See the 
documentation for
-optparse
-for a thorough discussion of its option\-processing capabities\&.
+optparse, but with a few additional capabilities noted below\&. See the
+\m[blue]\fBoptparse documentation\fR\m[]\&\s-2\u[6]\d\s+2
+for a thorough discussion of its option\-processing capabities\&. All options 
added through
+\fBAddOption\fR
+are placed in a special "Local Options" option group\&.
 .sp
 In addition to the arguments and values supported by the
 optparse
@@ -8993,7 +8990,9 @@
 \fBAddOption\fR
 allows setting the
 \fInargs\fR
-keyword value to a string consisting of a question mark (\*(Aq?\*(Aq) to 
indicate that the option argument for that option string is optional\&. If the 
option string is present on the command line but has no matching option 
argument, the value of the
+keyword value to a string
+\*(Aq?\*(Aq
+(question mark) to indicate that the option argument for that option string 
may be omitted\&. If the option string is present on the command line but has 
no matching option argument, the value of the
 \fIconst\fR
 keyword argument is produced as the value of the option\&. If the option 
string is omitted from the command line, the value of the
 \fIdefault\fR
@@ -10239,47 +10238,50 @@
 .\}
 .RE
 .PP
-\fBDefaultEnvironment\fR(\fI[**kwargs]\fR)
+\fBDefaultEnvironment\fR(\fI[key=value, \&.\&.\&.]\fR)
 .RS 4
 Instantiates and returns the global
 construction environment
-object\&. This environment is used internally by SCons when it executes many 
of the global functions listed in this section (that is, those not called as 
methods of a specific
-construction environment)\&. The
-default environment
-is a singleton: the keyword arguments are used only on the first call; on 
subsequent calls the already\-constructed object is returned and any keyword 
arguments are silently ignored\&. The
-default environment
-can still be modified after instantiation in the same way as any other
-construction environment\&. The
-default environment
-is independent: modifying it has no effect on any other
-construction environment
-constructed by an
+object\&. The
+Default Environment
+is used internally by
+SCons
+when executing a global function or the global form of a Builder method that 
requires access to a
+construction environment\&.
+.sp
+On the first call, arguments are interpreted as for the
 \fBEnvironment\fR
-or
-\fBClone\fR
-call\&.
+function\&. The
+Default Environment
+is a singleton; subsequent calls to
+\fBDefaultEnvironment\fR
+return the already\-constructed object, and any keyword arguments are silently 
ignored\&.
 .sp
-It is not mandatory to call
-\fBDefaultEnvironment\fR: the
+The
+Default Environment
+can be modified after instantiation, similar to other
+construction environments, although some
+construction environment
+methods may be unavailable\&. Modifying the
+Default Environment
+has no effect on any other
+construction environment, either existing or newly constructed\&.
+.sp
+It is not necessary to explicitly call
+\fBDefaultEnvironment\fR\&.
+SCons
+instantiates the
 default environment
-is instantiated automatically when the build phase begins if this function has 
not been called; however calling it explicitly gives the opportunity to affect 
and examine the contents of the
-default environment\&. Instantiation happens even if no build instructions 
appar to use it, as there are internal uses\&. If there are no uses in the 
project
+automatically when the build phase begins, if has not already been done\&. 
However, calling it explicitly provides the opportunity to affect and examine 
its contents\&. Instantiation occurs even if nothing in the build system appars 
to use it, due to internal uses\&.
+.sp
+If the project
 SConscript
-files, a small performance gain may be seen by calling
+files do not use global functions or Builders, a small performance gain may be 
achieved by calling
 \fBDefaultEnvironment\fR
-with an empty tools list, thus avoiding that part of the initialization 
cost\&. This is mainly of interest in testing when
+with an empty tools list (\fBDefaultEnvironment(tools=[])\fR)\&. This avoids 
the tool initialization cost for the
+Default Environment, which is mainly of interest in the test suite where
 \fBscons\fR
-is launched repeatedly in a short time period:
-.sp
-.if n \{\
-.RS 4
-.\}
-.nf
-DefaultEnvironment(tools=[])
-.fi
-.if n \{\
-.RE
-.\}
+is launched repeatedly in a short time period\&.
 .RE
 .PP
 \fBDepends\fR(\fItarget, dependency\fR), \fIenv\fR\&.Depends(\fItarget, 
dependency\fR)
@@ -10375,34 +10377,39 @@
 Directory Nodes can be used anywhere you would supply a string as a directory 
name to a Builder method or function\&. Directory Nodes have attributes and 
methods that are useful in many situations; see manpage section "Filesystem 
Nodes" for more information\&.
 .RE
 .PP
-\fIenv\fR\&.Dump(\fI[key], [format]\fR)
+\fIenv\fR\&.Dump(\fI[key, \&.\&.\&.], [format=]\fR)
 .RS 4
 Serializes
 construction variables
+from the current
+construction environment
 to a string\&. The method supports the following formats specified by
-\fIformat\fR:
+\fIformat\fR, which must be used a a keyword argument:
 .PP
 pretty
 .RS 4
-Returns a pretty printed representation of the environment (if
-\fIformat\fR
-is not specified, this is the default)\&.
+Returns a pretty\-printed representation of the variables (this is the 
default)\&. The variables will be presented in
+Python
+dict form\&.
 .RE
 .PP
 json
 .RS 4
-Returns a JSON\-formatted string representation of the environment\&.
+Returns a JSON\-formatted string representation of the variables\&. The 
variables will be presented as a JSON object literal, the JSON equivalent of a
+Python
+dict\&.
 .RE
 .sp
-If
+If no
 \fIkey\fR
-is
-\fBNone\fR
-(the default) the entire dictionary of
+is supplied, all the
 construction variables
-is serialized\&. If supplied, it is taken as the name of a
-construction variable
-whose value is serialized\&.
+are serialized\&. If one or more keys are supplied, only those keys and their 
values are serialized\&.
+.sp
+
+\fIChanged in NEXT_VERSION\fR: More than one
+\fIkey\fR
+can be specified\&. The returned string always looks like a dict (or JSON 
equivalent); previously a single key serialized only the value, not the key 
with the value\&.
 .sp
 This SConstruct:
 .sp
@@ -10410,20 +10417,25 @@
 .RS 4
 .\}
 .nf
-env=Environment()
+env = Environment()
 print(env\&.Dump(\*(AqCCCOM\*(Aq))
+print(env\&.Dump(\*(AqCC\*(Aq, \*(AqCCFLAGS\*(Aq, format=\*(Aqjson\*(Aq))
 .fi
 .if n \{\
 .RE
 .\}
 .sp
-will print:
+will print something like:
 .sp
 .if n \{\
 .RS 4
 .\}
 .nf
-\*(Aq$CC \-c \-o $TARGET $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS 
$SOURCES\*(Aq
+{\*(AqCCCOM\*(Aq: \*(Aq$CC \-o $TARGET \-c $CFLAGS $CCFLAGS $_CCCOMCOM 
$SOURCES\*(Aq}
+{
+    "CC": "gcc",
+    "CCFLAGS": []
+}
 .fi
 .if n \{\
 .RE
@@ -10442,7 +10454,7 @@
 .RE
 .\}
 .sp
-will print:
+will print something like:
 .sp
 .if n \{\
 .RS 4
@@ -12884,7 +12896,7 @@
 \fB\-Q\fR
 T}:T{
 See
-    \&\s-2\u[6]\d\s+2
+    \&\s-2\u[7]\d\s+2
 T}
 T{
 \fInum_jobs\fR
@@ -13126,7 +13138,7 @@
 .\}
 .RE
 .PP
-\fBTool\fR(\fIname, [toolpath, **kwargs]\fR), \fIenv\fR\&.Tool(\fIname, 
[toolpath, **kwargs]\fR)
+\fBTool\fR(\fIname, [toolpath, key=value, \&.\&.\&.]\fR), 
\fIenv\fR\&.Tool(\fIname, [toolpath, key=value, \&.\&.\&.]\fR)
 .RS 4
 Locates the tool specification module
 \fIname\fR
@@ -17454,7 +17466,7 @@
 \fBLICENSE\fR
 .RS 4
 The abbreviated name, preferably the SPDX code, of the license under which 
this project is released (GPL\-3\&.0, LGPL\-2\&.1, BSD\-2\-Clause etc\&.)\&. See
-\m[blue]\fBhttp://www\&.opensource\&.org/licenses/alphabetical\fR\m[]\&\s-2\u[7]\d\s+2
+\m[blue]\fBhttp://www\&.opensource\&.org/licenses/alphabetical\fR\m[]\&\s-2\u[8]\d\s+2
 for a list of license names and SPDX codes\&.
 .sp
 See the
@@ -26165,7 +26177,7 @@
 is limited on Windows and on WebAssembly platforms, see the notes in the
 Python
 documentation for
-\m[blue]\fBos\&.chmod\fR\m[]\&\s-2\u[8]\d\s+2, which is the underlying 
function\&.
+\m[blue]\fBos\&.chmod\fR\m[]\&\s-2\u[9]\d\s+2, which is the underlying 
function\&.
 .RE
 .PP
 \fBCopy\fR(\fIdest, src\fR)
@@ -27671,7 +27683,7 @@
 .RS 4
 
     SCons source code
-    \m[blue]\fBon GitHub\fR\m[]\&\s-2\u[9]\d\s+2
+    \m[blue]\fBon GitHub\fR\m[]\&\s-2\u[10]\d\s+2
   
 .RE
 .RS 4
@@ -27724,6 +27736,11 @@
 
\%https://learn.microsoft.com/en-us/visualstudio/extensibility/internals/solution-dot-sln-file
 .RE
 .IP " 6." 4
+optparse documentation
+.RS 4
+\%https://docs.python.org/3/library/optparse.html
+.RE
+.IP " 7." 4
 If
 \fIno_progress\fR
 is set via
@@ -27734,17 +27751,17 @@
 SCons
 has to start reading them before it can see the
 \fBSetOption\fR.
-.IP " 7." 4
+.IP " 8." 4
 http://www.opensource.org/licenses/alphabetical
 .RS 4
 \%http://www.opensource.org/licenses/alphabetical
 .RE
-.IP " 8." 4
+.IP " 9." 4
 os.chmod
 .RS 4
 \%https://docs.python.org/3/library/os.html#os.chmod
 .RE
-.IP " 9." 4
+.IP "10." 4
 on GitHub
 .RS 4
 \%https://github.com/SCons/scons
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/scons-4.8.0/sconsign.1 new/scons-4.8.1/sconsign.1
--- old/scons-4.8.0/sconsign.1  2024-07-08 01:52:28.000000000 +0200
+++ new/scons-4.8.1/sconsign.1  2024-09-04 02:46:52.000000000 +0200
@@ -2,12 +2,12 @@
 .\"     Title: SCONSIGN
 .\"    Author: [see the "AUTHORS" section]
 .\" Generator: DocBook XSL Stylesheets v1.76.1 <http://docbook.sf.net/>
-.\"      Date: 07/07/2024
-.\"    Manual: SCons 4.8.0
-.\"    Source: SCons 4.8.0
+.\"      Date: 09/03/2024
+.\"    Manual: SCons 4.8.1
+.\"    Source: SCons 4.8.1
 .\"  Language: English
 .\"
-.TH "SCONSIGN" "1" "07/07/2024" "SCons 4\&.8\&.0" "SCons 4\&.8\&.0"
+.TH "SCONSIGN" "1" "09/03/2024" "SCons 4\&.8\&.1" "SCons 4\&.8\&.1"
 .\" -----------------------------------------------------------------
 .\" * Define some portability stuff
 .\" -----------------------------------------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/scons-4.8.0/setup.py new/scons-4.8.1/setup.py
--- old/scons-4.8.0/setup.py    2023-01-24 05:14:53.000000000 +0100
+++ new/scons-4.8.1/setup.py    2024-07-22 03:13:08.000000000 +0200
@@ -14,24 +14,16 @@
         return fp.read()
 
 
-def get_version(rel_path):
-    for line in read(rel_path).splitlines():
-        if line.startswith('__version__'):
-            delim = '"' if '"' in line else "'"
-            return line.split(delim)[1]
-    else:
-        raise RuntimeError("Unable to find version string.")
-
-
 exclude = ['*Tests']
 
 
 class build_py(build_py_orig):
 
     def find_package_modules(self, package, package_dir):
-        """
-        Custom module to find package modules.
-        It will strip out any modules which match the glob patters in exclude 
above
+        """Custom module to find package modules.
+
+        Will strip out any modules which match the glob patters in
+        *exclude* above
         """
         modules = super().find_package_modules(package, package_dir)
         return [(pkg, mod, file, ) for (pkg, mod, file, ) in modules
@@ -42,5 +34,4 @@
     cmdclass={
         'build_py': build_py,
     },
-    version=get_version('SCons/__init__.py'),
-)
\ No newline at end of file
+)

Reply via email to