Skip to content

Releases: SCons/scons

SCons 4.8.1 Released

04 Sep 01:22
Compare
Choose a tag to compare

A new SCons release, 4.8.1, is now available on the SCons download page:

https://scons.org/pages/download.html

Here is a summary of the changes since 4.8.0:

CHANGED/ENHANCED EXISTING FUNCTIONALITY

  • env.Dump() previously accepted a single optional "key" argument.
    It now accepts any number of optional "key" arguments; any supplied
    keys will be serialized with their values in a Python dict style.
    As a result there is a small change in behavior: if a single key
    argument is given, where it previously would return a string containing
    just the value, now it will return a string that looks like a dictionary
    including the key. For example, from "'gcc'" to "{'CC': 'gcc'}".
    This should not have any impact as the result of calling Dump is
    intended for diagnostic output, not for use by other interfaces.

FIXES

  • SCons 4.8.0 added an __all__ specifier at the top of the Variables
    module (Variables/__init__.py) to control what is made available in
    a star import. However, there was existing usage of doing
    from SCons.Variables import * which expected the variable types
    to be avaiable. BoolVariable, EnumVariable, ListVariable,
    PackageVariable and PathVariable are added to __all__,
    so this form of import should now work again.

  • 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 (issue #4585).

  • On win32 platform, SCons 4.7.0 modified the determination
    of the output encoding of piped processes. Instead of using the default
    encoding, it relied on the encoding attribute of the output stream.
    If the encoding attribute of the output stream was set to None,
    it was triggering an invalid argument exception. This was the case with
    streams of type io.StringIO for example.
    This has been changed to always use the oem encoding which should be the
    encoding in the shell where the command was spawned.

DOCUMENTATION

  • Improve wording of manpage "Functions and Environment Methods" section.
  • Make doc function signature style more consistent - tweaks to AddOption,
    DefaultEnvironment and Tool,.

DEVELOPMENT

  • sctypes is_* functions given explicit return types. Python 3.13+ uses
    TypeIs for a near-equivalent of isinstance. Python 3.10 through 3.12
    uses TypeGuard, a less accurate implementation but still provides
    usable type hinting. Python 3.9 and earlier simply returns bool, same
    as before.

Thanks to the following contributors listed below for their contributions to this release.

.. code-block:: text

git shortlog --no-merges -ns 4.8.0..HEAD

 9  Mats Wichmann
 8  William Deegan
 1  SIEGRIST Anthony
 1  Thaddeus Crews
 1  siegria

SCons 4.8.0 Released

08 Jul 00:16
Compare
Choose a tag to compare

A new SCons release, 4.8.0, is now available on the SCons download page:

https://scons.org/pages/download.html

Here is a summary of the changes since 4.7.0:

NEW FUNCTIONALITY

  • GetSConsVersion() added to retrieve the SCons version.

DEPRECATED FUNCTIONALITY

  • Mark Python 3.6 support as deprecated. Use --warn=no-python-version
    to quiet the warning.

CHANGED/ENHANCED EXISTING FUNCTIONALITY

  • Dump() with json format selected now recognizes additional compound types
    (UserDict and UserList), which improves the detail of the display.
    json output is also sorted, to match the default display.
  • Python 3.13 changes the behavior of isabs() on Windows. Adjust SCons
    usage of this in NodeInfo classes to avoid test problems.
  • Drop duplicated getstate and setstate methods in AliasNodeInfo,
    FileNodeInfo and ValueNodeInfo classes, as they are identical to the
    ones in parent NodeInfoBase and can just be inherited.
  • All exceptions during the execution of an Action are now returned by value
    rather than by raising an exception, for more consistent behavior.
    NOTE: With this change, user created Actions should now catch and handle
    expected exceptions (whereas previously many of these were silently caught
    and suppressed by the SCons Action exection code).
  • ParseFlags now sorts a --stdlib=libname argument into CXXFLAGS instead
    of CCFLAGS; the latter variable could cause a compiler warning.
  • The implementation of Variables was slightly refactored, there should
    not be user-visible changes.
  • MSVC: For msvc version specifications without an 'Exp' suffix, an express
    installation is used when no other edition is detected for the msvc version.
    This was the behavior for Visual Studio 2008 (9.0) through Visual Studio 2015
    (14.0). This behavior was extended to Visual Studio 2017 (14.1) and Visual
    Studio 2008 (8.0). An express installation of the IDE binary is used when no
    other IDE edition is detected.
  • The vswhere executable locations for the WinGet and Scoop package managers were
    added to the default vswhere executable search list after the Chocolatey
    installation location.
  • SCons.Environment.is_valid_construction_var() now returns a boolean to
    match the convention that functions beginning with "is" have yes/no
    answers (previously returned either None or an re.match object).
    Now matches the annotation and docstring (which were prematurely
    updated in 4.6). All SCons usage except unit test was already fully
    consistent with a bool.
  • The Variables object Add method now accepts a subst keyword argument
    (defaults to True) which can be set to inhibit substitution prior to
    calling the variable's converter and validator.
  • AddOption and the internal add_local_option which AddOption calls now
    recognize a "settable" keyword argument to indicate a project-added
    option can also be modified using SetOption.
    NOTE: If you were using ninja and using SetOption() for ninja options
    in your SConscripts prior to loading the ninja tool, you will now
    see an error. The fix is to move the SetOption() to after you've loaded
    the ninja tool.
  • ListVariable now has a separate validator, with the functionality
    that was previously part of the converter. The main effect is to
    allow a developer to supply a custom validator, which previously
    could be inhibited by the converter failing before the validator
    is reached.
  • When debugging (--debug=pdb), the filename SCsub is now recognized when
    manipulating breakpoints.

FIXES

  • OSErrors are now no longer hidden during the execution of Actions.
  • Improved the conversion of a "foreign" exception from an action
    into BuildError by making sure our defaults get applied even in
    corner cases. Fixes Issue #4530
  • MSVC: Visual Studio 2010 (10.0) could be inadvertently detected due to an
    sdk-only install of Windows SDK 7.1. An sdk-only install of Visual Studio
    2010 is ignored as the msvc batch files will fail. The installed files are
    intended to be used in conjunction with the SDK batch file. Similar protection
    was added for Visual Studio 2008 (9.0).
  • MSVC: For Visual Studio 2005 (8.0) to Visual Studio 2015 (14.0), detection of
    installed files was expanded to include the primary msvc batch file, dependent
    msvc batch file, and compiler executable. In certain installations, the
    dependent msvc batch file may not exist while the compiler executable does exist
    resulting in a build failure.
  • MSVC: Visual Studio 2008 (9.0) Visual C++ For Python was not detected when
    installed using the ALLUSERS command-line option: msiexec /i VCForPython27.msi ALLUSERS=1
    When installed for all users, Visual Studio 2008 (9.0) Visual C++ For Python is
    now correctly detected.
  • MSVC: For Visual Studio 2008 (9.0), a full development edition (e.g., Professional)
    is now selected before a Visual C++ For Python edition. Prior to this change,
    Visual C++ For Python was selected before a full development edition when both
    editions are installed.
  • The vswhere executable is frozen upon initial detection. Specifying a different
    vswhere executable via the construction variable VSWHERE after the initial
    detection now results in an exception. Multiple bugs in the implementation of
    specifying a vswhere executable via the construction variable VSWHERE have been
    fixed. Previously, when a user specified vswhere executable detects new msvc
    installations after the initial detection, the internal msvc installation cache
    and the default msvc version based on the initial detection are no longer valid.
    For example, when no vswhere executable is found for the initial detection
    and then later an environment is constructed with a user specified vswhere
    executable that detects new msvc installations.
  • MSVC: Visual Studio 2022 v143 BuildTools now supports msvc toolset versions from
    14.30 to 14.4X. Fixes Issue #4543.
  • The Clone() method now respects the variables argument (fixes #3590)

IMPROVEMENTS

  • Make the testing framework a little more resilient: the temporary
    directory for tests now includes a component named "scons" which can
    be given to antivirus software to exclude.
  • Performance tweak: the setitem method of an Environment, used for
    setting construction variables, now uses the string method isidentifier
    to validate the name (updated from microbenchmark results).
  • MSVC: Visual Studio 2015 Express (14.0Exp) does not support the sdk version
    argument. Visual Studio 2015 Express does not support the store argument for
    target architectures other than x86. Script argument validation now takes into
    account these restrictions.
  • MSVC: Visual Studio 2015 BuildTools (14.0) does not support the sdk version
    argument and does not support the store argument. Script argument validation now
    takes into account these restrictions.
  • MSVC: The registry detection of VS2015 (14.0), and earlier, is now cached at runtime
    and is only evaluated once for each msvc version.
  • MSVC: The vswhere detection of VS2017 (14.1), and later, is now cached at runtime and
    is only evaluated once using a single vswhere invocation for all msvc versions.

PACKAGING

  • setup.cfg logic now handled via pyproject.toml; consequently, setup.cfg
    was removed.

DOCUMENTATION

  • Updated Value Node docs.
  • Update manpage for Tools, and for the TOOL variable.
  • Update manpage and user guide for Variables usage.
  • Restructured API Docs build so main package contents are listed
    before contents of package submodules.
  • Updated manpage description of Command "builder" and function.
  • Updated the notes about reproducible builds with SCons and the example.
  • Regularized header (copyright, licens) at top of documentation files using SPDX.
  • Updated introductory section of manual page.

DEVELOPMENT

  • Documentation build now properly passes through skipping the PDF
    (and EPUB) builds of manpage and user guide; this can also be done
    manually if directly calling doc/man/SConstruct and doc/user/SConstruct
    by adding SKIP_PDF=1. This should help with distro packaging of SCons,
    which now does not need "fop" and other tools to be set up in order to
    build pdf versions which are then ignored.
  • .gitattributes has been setup to mirror .editorconfig's eol settings.
    The repo-wide line-ending is now lf, with the exception of a few
    Windows-only files using crlf instead. Any files not already fitting
    this format have been explicitly converted.
  • Repository linter/formatter changed from flake8/black to ruff, as the
    latter grants an insane speed boost without compromising functionality.
    Existing settings were migrated 1-to-1 where possible.
  • The test runner now recognizes the unittest module's return code of 5,
    which means no tests were run. SCons/Script/MainTests.py currently
    has no tests, so this particular error code is expected - should not
    cause runtest to give up with an "unknown error code".
  • is_valid_construction_var() (not part of the public API) moved from
    SCons.Environment to SCons.Util to avoid the chance of import loops. Variables
    and Environment both use the routine and Environment() uses a Variables()
    object so better to move to a safer location.

Thanks to the following contributors listed below for their contributions to this release.

.. code-block:: text

git shortlog --no-merges -ns 4.7.0..HEAD
    70  Mats Wichmann
    35  Joseph Brill
    26  William Deegan
     7  Raymond Li
     7  Thaddeus Crews

SCons 4.7.0 Released

18 Mar 00:55
Compare
Choose a tag to compare

A new SCons release, 4.7.0, is now available on the SCons download page:

https://scons.org/pages/download.html

Here is a summary of the changes since 4.6.0:

NEW FUNCTIONALITY

  • Method unlink_files was added to the TestCmd class that unlinks a list of files
    from a specified directory. An attempt to unlink a file is made only when the
    file exists; otherwise, the file is ignored.

CHANGED/ENHANCED EXISTING FUNCTIONALITY

  • Add an optional argument list string to configure's CheckFunc method so
    that the generated function argument list matches the function's
    prototype when including a header file. Fixes GH Issue #4320
  • Now supports pre-release Python 3.13
  • Support for Python versions without support for the threading package has been removed
  • Dropped three unused warning classes: DeprecatedSourceCodeWarning,
    TaskmasterNeedsExecuteWarning, DeprecatedMissingSConscriptWarning.
  • Two warning classes that are actually used were added to manpage section on
    enabling warnings (cache-cleanup-error, future-reserved-variable).

FIXES

  • Fix of the --debug=sconscript option to return exist statements when using return
    statement with stop flag enabled
  • MSVS: prevent overwriting the SCons environment variable SCONS_HOME with the OS
    environment value of SCONS_HOME in the msvs tool.
  • MSVC: Fix the detection of Visual Studio 2015 Express ('14.0Exp') by adding a
    registry key definition and updating the installation root-relative registry value
    at runtime for the location of the VC folder.
  • MSVS: Fix the msvs project generation test for MSVS 6.0 to use the correct name of
    the generated project file.
  • MSVS: Fix the msvs project generation test scripts so that "false positive" tests
    results are not possible when the initial build is successful and the command-line
    build of the project file fails.
  • On Windows platform, when collecting command output (Configure checks),
    make sure decoding of bytes doesn't fail.
  • Documentation indicated that both Pseudo() and env.Pseudo() were usable,
    but Pseudo() did not work; is now enabled.
  • Improve handling of file data that SCons itself processes - as in
    scanners - try harder to decode non-UTF-8 text.
  • PyPackageDir no longer fails if passed a module name which cannot be found,
    now returns None.
  • Add locking around creation of CacheDir config file. Fixes issue #4489.

IMPROVEMENTS

  • Use of NotImplemented instead of NotImplementedError for special methods
    of _ListVariable class
  • The NewParallel scheduler is now the default, the tm_v2 flag is removed,
    and the old scheduler is opt-in under --experimental=legacy_sched. Additionally,
    the new scheduler is now used for -j1 builds as well.
    NOTE: This should significantly improve SCons performance for larger parallel builds
    (Larger -j values)
  • CacheDir writes no longer happen within the taskmaster critical section, and therefore
    can run in parallel with both other CacheDir writes and the taskmaster DAG walk.
  • The NewParallel scheduler now only adds threads as new work requiring execution
    is discovered, up to the limit set by -j. This should reduce resource utilization
    when the achievable parallelism in the DAG is less than the -j limit.
  • Dumping an environment with json formatting will now explicitly specify if a given
    value cannot be serialized.

PACKAGING

  • Remove unnecessary dependencies on pypi packages from setup.cfg
  • SCons documentation build can now be controlled through SKIP_DOC
    variable - rather than just true/false can now specify
    skip none, skip all, skip pdf docs, skip api docs.

DOCUMENTATION

  • Fixed the Scanner examples in the User Guide to be runnable and added
    some more explanation. Clarified discussion of the scanner function in
    the Scanner Objects section of the manpage.
  • The manpage entry for Pseudo was clarified.
  • The manpage entry for SharedLibrary was clarified.
  • Update API docs for Warnings framework; add two warns to manpage
    enable/disable control.
  • More consistent use of &Python; in the manpage. A few links added.
    A warning about overwriting env['ENV'] and one about Configure
    checks possibly not running in in no-exec mode also added.
  • Clarify how SCons finds the project top directory, and what that is used for.
  • Clarify MergeFlags usage of a dict argument.

DEVELOPMENT

  • Fix sphinx config to handle SCons versions with post such as: 4.6.0.post1
  • Created SCons.Util.sctyping to contain complex type information, allowing
    for repo-wide type hinting without causing cyclical dependencies.

Thanks to the following contributors listed below for their contributions to this release.

.. code-block:: text

git shortlog --no-merges -ns 4.6.0..HEAD
26  Andrew Morrow
24  Mats Wichmann
14  William Deegan
 7  Joseph Brill
 6  StenGruener
 3  Prabhu S. Khalsa
 3  Thaddeus Crews
 2  fazledyn-or
 1  Michał Górny
 1  Piotr Siupa

SCons 4.6.0

20 Nov 02:03
Compare
Choose a tag to compare

A new SCons release, 4.6.0, is now available on the SCons download page:

https://scons.org/pages/download.html

Here is a summary of the changes since 4.5.2:

NEW FUNCTIONALITY

  • D compilers : added support for generation of .di interface files.
    New variables DI_FILE_DIR, DI_FILE_DIR_PREFIX, DI_FILE_DIR_SUFFIX,
    DI_FILE_SUFFIX.
  • MSVC: If available, native arm64 tools will be used on arm64 hosts for VS2022.
  • MSVC: If necessary, automatically define VSCMD_SKIP_SENDTELEMETRY for VS2019 and later
    on arm64 hosts when using an arm (32-bit) build of python to prevent a powershell
    error pop-up window (powershell dll not found).
  • Add a LIBLITERALPREFIX variable which can be set to the linker's
    prefix for considering a library argument unmodified (e.g. for the
    GNU linker, the ':' in '-l:libfoo.a'). Fixes Github issue #3951.

CHANGED/ENHANCED EXISTING FUNCTIONALITY

  • When debugging (--debug=pdb), the filenames SConstruct and SConscript
    are now recognized when manipulating breakpoints. Previously,
    only a full pathname to an sconscript file worked, as pdb requires
    a .py extension to open a file that is not an absolute path.
  • Three unused non-public methods of the Environment Base class
    were dropped: get_src_sig_type, get_tgt_sig_type, _changed_source.
    These were unused remnants of the previously removed SourceSignatures
    and TargetSignatures features (dropped in 3.1.2).
  • The --debug flag now has a 'json' option which will write information
    generated by --debug={count, memory, time, action-timestamps} and about
    the build.
  • Obsoleted YACCVCGFILESUFFIX, it's being replaced by YACC_GRAPH_FILE_SUFFIX.
    If YACC_GRAPH_FILE_SUFFIX is not set, it will respect YACCVCGFILESUFFIX.
  • The yacc tool now understands the bison behavior of --header, --defines
    and --graph being called without an option-argument as being synonyms
    for -d (first two) and -g. -H also recognized as a synonym for -d.
    Default value for $YACC_GRAPH_FILE_SUFFIX changed to '.gv' to match
    current bison default (since bison 3.8). Set this variable to '.dot'
    if using byacc. Fixes #4326 and #4327.
  • MSVC: When trying to find a valid msvc batch file, the existence of the msvc compiler
    executable is verified for VS6 to VS2015 to avoid executing the msvc batch file when
    the host/target tool is known not to be present. Always check that the msvc compiler
    executable is found on the msvc script environment path after running the msvc batch
    file. This is predominately needed for recent versions of Visual Studio where the msvc
    batch file exists but an individual msvc toolset may not support the host/target
    architecture combination. For example, when using VS2022 on arm64, the arm64 native
    tools are only installed for the 14.3x toolsets.
  • MSVC: When the msvc compiler executable is not found during setup of the msvc
    environment, the warning message issued takes into account whether or not a
    possibly erroneous compiler executable was already present in the scons environment
    path. See CHANGES.txt for details.
  • Extend range of recognized Java versions to 20.
  • Builder calls (like Program()) now accept pathlib objects in source lists.
  • The Help() function now takes an additional keyword argument keep_local:
    when starting to build a help message, you can now retain help from AddOption
    calls (options added for the project_, but omit help for SCons' own cmdline
    options with "Help(newtext, append=True, local_only=True)".
  • Calling SConscript() with a nonexistent file is now an error.
    Previously this succeeded - prior to SCons 3.0, silently; since 3.0, with
    a warning. Developers can still instruct such an SConscript() call not
    to fail by being explicit: pass keyword argument "must_exist=False".
    The "--warn=missing-sconscript" commandline option is no longer available
    as the warning was part of the transitional phase.
  • Add missing directories to searched paths for mingw installs
  • SCons.Util.types renamed to to SCons.Util.sctypes to avoid any possible
    confusion with the Python stdlib "types" module. Note that it was briefly
    (for 4.5.x only) possible to import directly from SCons.Util.types,
    although the preferred usage remains to import from SCons.Util only.
    Any code that did the direct import will have to change to import from
    SCons.Util.sctypes.
  • Add JDK 21 LTS support
  • The newly added --debug=sconscript option (new) will output notices when
    entering an exiting each SConscript as they are processed.

FIXES

  • Fixed: when using the mingw tool, if an msys2 Python is used (os.sep
    is '/' rather than the Windows default ''), certain Configure checks
    could fail due to the construction of the path to run the compiled check.
  • C scanner's dictifyCPPDEFINES routine did not understand the possible
    combinations of CPPDEFINES - not aware of a "name=value" string either
    embedded in a sequence, or by itself. The conditional C scanner thus
    did not always properly apply the defines. The regular C scanner does
    not use these, so was not affected. [fixes #4193]
  • MSVC: The installed msvc list is calculated once and cached. There was an indirect
    dependency on the target architecture when determining if each version of msvc
    was installed based on the initial invocation. It was possible that an msvc instance
    would not be considered installed due to the tools for the requested target
    architecture not being installed. The initial call to construct the installed msvc
    list now uses an undefined target architecture to evaluate all potential host/target
    combinations when evaluating if the msvc tools are installed for a given Visual Studio
    installation.
  • MSVC: Erroneous construction of the installed msvc list (as described above) caused an
    index error in the msvc support code. An explicit check was added to prevent indexing
    into an empty list. Fixes #4312.
  • MSVC: The search for the msvc compiler executable (cl.exe) no longer inspects the
    OS system path in certain situations when setting up the msvc environment.
  • MSCommon: Test SConfTests.py would fail when mscommon debugging was enabled via the
    MSVC_MSCOMMON_DEBUG environment variable. The mscommon logging filter class registered
    with the python logging module was refactored to prevent test failure.
  • MSVS: Add arm64 to the MSVS supported architectures list for VS2017 and later to be
    consistent with the current documentation of MSVS_ARCH.
  • FORTRAN: Fix gfortran tool initialization. Defaults to using binary named gfortran
    as would be expected, and properly set's SHFORTRAN flags to include -fPIC
    where previously it was only doing so for the other fortran versions (F77,..)
  • MSCommon: Added more error handling while reading msvc config cache.
    (Enabled/specified by SCONS_CACHE_MSVC_CONFIG).
    The existing cache will be discarded if there's a decode error reading it.
    It's possible there's a race condition creating this issue it in certain CI builds.
  • Fixed: race condition in Mkdir which can happen when two SConscript
    are processed simultaneously by two separate build commands.

IMPROVEMENTS

  • Now tries to find mingw if it comes from Chocolatey install of msys2.
  • MSVC: Module imports were changed from a relative import to a top-level
    absolute import in the following Microsoft tools: midl, mslib, mslink, mssdk, msvc,
    msvs. Moving any of these tools that used relative imports to the scons site tools
    folder would fail on import (i.e., the relative import paths become invalid when
    moved).

PACKAGING

  • The build of scons now matches the help text displayed - the targets
    listed there can all now be given as a target to build (except for
    the two full source balls; the source tar.gz is currently generated directly
    by the GitHub release process).

DOCUMENTATION

  • Aligned manpage signature for Alias function to match implementation -
    if the previous targets parameter had been used as a keyword argument,
    the results would be incorrect (does not apply to positional argument
    usage, which had no problem).
  • Changed the message about scons -H to clarify it shows built-in options only.
  • Cachedir description updated.
  • Updated the first two chapters on building with SCons in the User Guide.
  • Clarify that exported variables are shared - if mutable, changes made in
    an SConscript are visible everywhere that takes a refereence to that object.
  • Update PCH builder docs with some usage notes.

DEVELOPMENT

  • SCons test runner now uses pathlib to normalize and compare paths
    to test files, which allows test lists, exclude lists, and tests on
    the command line to "not care" about the OS convention for pathname
    separators.
  • Class ActionBase is now an abstract base class to more accurately
    reflect its usage. Derived _ActionAction inherits the ABC, so it
    now declares (actually raises NotImplementedError) two methods it
    doesn't use so it can be instantiated by unittests and others.
  • Added more type annotations to internal routines.
  • Cleaned up dblite module (checker warnings, etc.).
  • TeX tests: skip tests that use makeindex or epstopdf not installed, or
    if kpsewhich glossaries.sty fails.

Thanks to the following contributors listed below for their contributions to this release.

.. code-block:: text

git shortlog --no-merges -ns 4.5.2..HEAD
    97  Mats Wichmann
    39  William Deegan
    20  Joseph Brill
    12  Alex Burton
     4  StenGruener
     2  Jonathon Reinhart
     2  LiuYinCarl
     2  Max Bachmann
     1  Kenshin
     1  Shohei YOSHIDA
     1  ...
Read more

4.5.2 Release

21 Mar 16:25
Compare
Choose a tag to compare

A new SCons release, 4.5.2, is now available on the SCons download page:

https://scons.org/pages/download.html

Here is a summary of the changes since 4.5.1:

FIXES

  • Fix a problem (#4321) in 4.5.0/4.5.1 where ParseConfig could cause an
    exception in MergeFlags when the result would be to add preprocessor
    defines to existing CPPDEFINES. The following code illustrates the
    circumstances that could trigger this:
    env=Environment(CPPDEFINES=['a'])
    env.Append(CPPDEFINES=['b'])
    env.MergeFlags({'CPPDEFINES': 'c'})

PACKAGING

  • Remove the redundant wheel dependency from pyproject.toml,
    as it is added automatically by the setuptools PEP517 backend.

Thanks to the following contributors listed below for their contributions to this release.

.. code-block:: text

git shortlog --no-merges -ns 4.5.1..HEAD
 3  Mats Wichmann
 2  William Deegan
 1  Michał Górny

4.5.1 Release

07 Mar 04:54
Compare
Choose a tag to compare

A new SCons release, 4.5.1, is now available on the SCons download page:

https://scons.org/pages/download.html

Here is a summary of the changes since 4.5.0:

FIXES

  • Fix a problem in 4.5.0 where using something like the following code
    will cause a Clone()'d environment to share the CPPDEFINES with the
    original Environment() which was cloned. Causing leakage of changes
    to CPPDEFINES when they should be completely independent after the Clone.
    env=Environment(CPPDEFINES=['a'])
    env.Append(CPPDEFINES=['b']) (or AppendUnique,Prepend,PrependUnique)
    env1=env.Clone()
    env1.Append(CPPDEFINES=['c']) (or any other modification, but not overwriting CPPDEFINES)
    Now env['CPPDEFINES'] will contain 'c' when it should not.

Thanks to the following contributors listed below for their contributions to this release.

git shortlog --no-merges -ns 4.5.0..HEAD

     3  William Deegan
     1  Mats Wichmann

4.5.0 Release

05 Mar 22:21
Compare
Choose a tag to compare

A new SCons release, 4.5.0, is now available on the SCons download page:

https://scons.org/pages/download.html

Here is a summary of the changes since 4.4.0:

NOTE: If you build with Python 3.10.0 and then rebuild with 3.10.1 (or higher), you may
see unexpected rebuilds. This is due to Python internals changing which changed
the signature of a Python Action Function.

NOTE: If you use a dictionary to specify your CPPDEFINES, you may see an unexpected rebuild.
The insertion order of dictionary keys is now preserved when generating the command line.
Previously these were sorted alphabecially. This change to the command line,
while generating identical set of CPPDEFINES can change order and cause a rebuild.

NEW FUNCTIONALITY

  • Added ValidateOptions() which will check that all command line options are in either
    those specified by SCons itself, or by AddOption() in SConstruct/SConscript. It should
    not be called until all AddOption() calls are completed. Resolves Issue #4187
  • Added --experimental=tm_v2, which enables Andrew Morrow's NewParallel Job implementation.
    This should scale much better for highly parallel builds. You can also enable this via SetOption().
  • Added FILE_ENCODING, to allow explicitly setting the text encoding for files
    written by the Textfile() and Substfile() builders. If not specified, Textfile() and Substfile() builders
    will write files as UTF-8.

DEPRECATED FUNCTIONALITY

  • The qt tool has been renamed qt3.

CHANGED/ENHANCED EXISTING FUNCTIONALITY

  • Added -fsanitize support to ParseFlags(). This will propagate to CCFLAGS and LINKFLAGS.
  • Calling EnsureSConsVersion() and EnsurePythonVersion() won't initialize
    DefaultEnvironment anymore.
  • The console message from the Chmod() action function now displays
    octal modes using the modern Python syntax (0o755 rather than 0755).
  • Migrated logging logic for --taskmastertrace to use Python's logging module. Added logging
    to NewParallel Job class (Andrew Morrow's new parallel job implementation)
  • Preliminary support for Python 3.12.
  • Run LaTeX after biber/bibtex only if necessary
  • Configure context methods CheckLib and CheckLibWithHeader now expose
    two additional keyword arguments: 'append', which controls whether to append
    (the default) or prepend discovered libraries to $LIBS, and 'unique',
    which controls whether to add the library if it is already in the $LIBS
    list. This brings the library-adding functionality in Configure in line
    with the regular Append, AppendUnique, Prepend and PrependUnique methods.
  • CPPDEFINES values added via a dictionary type are longer sorted by
    key. This used to be required to maintain a consistent order of
    commandline arguments between SCons runs, but meant macros were not
    always emitted in the order entered. Sorting is no longer required
    after Python interpreter improvements. There might be a one-time
    rebuild of targets that involved such sorted keys in their actions.
  • Renamed the 'qt' tools to 'qt3' since the logic in that tool is only for QT version 3.
    Renamed all env vars which affect qt3 from QT_ to QT3_. If you are still using SCons
    to build QT 3 code, you'll need to update your SConscripts. Note that using 'qt' tool
    has been deprecated for some time.

FIXES

  • Added missing newline to generated compilation database (compile_commands.json)
  • A list argument as the source to the Copy() action function is now handled.
    Both the implementation and the strfunction which prints the progress
    message were adjusted.
  • The Java Scanner processing of JAVACLASSPATH for dependencies (behavior
    that was introduced in SCons 4.4.0) is adjusted to split on the system's
    search path separator instead of on a space. The previous behavior meant
    that a path containing spaces (e.g. r"C:\somepath\My Classes") would
    lead to unexpected errors. If the split-on-space behavior is desired,
    pre-split the value: instead of: env["JAVACLASSPATH"] = "foo bar baz"
    use: env["JAVACLASSPATH"] = env.Split("foo bar baz")
    There is no change in how JAVACLASSPATH gets turned into the -classpath
    argument passed to the JDK tools.
  • Ninja: Fix execution environment sanitation for launching ninja. Previously if you set an
    execution environment variable set to a python list it would crash. Now it
    will create a string joining the list with os.pathsep
  • Fixed command line argument --diskcheck: previously a value of 'none' was ignored.
    SetOption('diskcheck','none') is unaffected, as it did not have the problem.
  • Fixed Issue #4275 - when outputting compilation db and TEMPFILE was in use, the compilation db would have
    command lines using the generated tempfile for long command lines, instead of the full command line for
    the compilation step for the source/target pair.
  • A refactor in the caching logic for version 4.4.0 left Java inner classes
    failing with an exception when a CacheDir was enabled. This is now corrected.
  • When using the gfortran tool (the default on most platforms as long as a GNU
    toolchain is installed), the user setting of the "dialect" compilers
    (F77, F90, F03 and F09, as well as the shared-library equivalents SHF77,
    SHF90, SHF03, SHF09) is now honored; previously the tool overwrote the
    settings to 'gfortran', which made it difficult reference a cross-compile
    version for dialects.
  • Fix issue #2757, where Configure checks that perform a check which reads a modified source
    (including program, source or header file(s)) would incorrectly mark that file "up to date" so the
    actual build would not see the file as modified. Leading to incorrect incremental builds.
    Now configure checks now clear node info for non conftest nodes, so they will be re-evaluated for
    the real taskmaster run when the build commences.
  • Inconsistent behavior of adding values to the CPPDEFINES construction
    variable has been cleaned up (described in issue #4254). Now a tuple,
    whether provided by itself or as a member of a list, is consistently
    interpreted as a macro with replacement value. When adding a list,
    individual members are added in sequence without interpretation.
    A string value containing spaces is split if it is the initial value or
    added, but not if it is given as a member of an added list. Detection
    of duplicate macros now works for both valued and unvalued forms.
  • Handling of CPPDEFINES macros via Prepend and PrependUnique now works
    (previously this was special-cased only for Append and AppendUnique).

IMPROVEMENTS

  • Changed the Taskmaster trace logic to use python's logging module.
  • Add cache-debug messages for push failures.
  • Added error message to handle the case when SCons attempts to retrieve all the targets
    for a specified builder from the CacheDir, fails to do so, and then runs into an error
    when deleting the files which were retrieved. Previously if this happened there were no
    errors or warnings.

PACKAGING

  • SCons now has three requirements files: requirements.txt describes
    requirements to run scons; requirements-dev.txt requirements to
    develop it - mainly things needed to run the testsuite;
    requirements_pkg.txt are the requirements to do a full build
    (including docs build) with an intent to create the packages.
  • Moved rpm and debian directories under packaging
  • Added logic to help packagers enable reproducible builds into packaging/etc/.
    Please read packaging/etc/README.txt if you are interested.
  • A zipapp of scons-local is now also built.

DOCUMENTATION

  • Updated the --hash-format manpage entry.
  • EnsureSConsVersion, EnsurePythonVersion, Exit, GetLaunchDir and
    SConscriptChdir are now listed as Global functions only.
  • Updated the docs for Glob.
  • Updated SHELL_ENV_GENERATORS description and added versionadded indicator.
  • JAVABOOTCLASSPATH, JAVACLASSPATH and JAVASOURCEPATH better document the
    acceptable syntax for values, and how they will be interpreted,
    including that JAVACLASSPATH will be scanned for dependencies.
    Added note on the possibly surprising feature that SCons always passes
    -sourcepath when calling javac, which affects how the class path is
    used when finding sources.
  • Updated the User Guide chapter on installation: modernized the notes
    on Python installs, SCons installs, and having multiple SCons versions
    present on a single system.
  • Updated the User Guide chapter on variant directories with more
    explanation, and the introduction of terms like "out of tree" that
    may help in forming a mental model.
  • Additional explanations for MSVSProject and MSVSSolution builders.
  • Updated MSVC documentation - adds "version added" annotations on recently
    added construction variables and provides a version-mapping table.
  • Added further details in the documentation of Append and related methods
    on the special handling of CPPDEFINES.

DEVELOPMENT

  • Refactored SCons/Taskmaster into a package. Moved SCons/Jobs.py into that package.
    NOTE: If you hook into SCons.Jobs, you'll have to change that to use SCons.Taskmaster.Jobs
  • Refactored SCons.Util, which had grown quite large, to be a package,
    not a single-file module. Change should be transparent: the same import
    of SCons.Util and public symbols from it will continue to work, however
    code which reaches directly in to grab private symbols (starting with
    underscore) which moved to a submodule, that code will have to be adjusted,
    as those are not imported to the package level (new SCons.Util.hashes has
    some of these, which are used by existing unit tests).
  • Added overrides argument to SCons.Subst.scons_subst(), subst_list(), subst(), and Action's process(),
    strfunction(). This...
Read more

SCons 4.4.0

30 Jul 21:59
Compare
Choose a tag to compare

A new SCons release, 4.4.0, is now available
on the SCons download page:

  https://scons.org/pages/download.html

Here is a summary of the changes since 4.3.0:

NOTE: If you build with Python 3.10.0 and then rebuild with 3.10.1 (or higher), you may
see unexpected rebuilds. This is due to Python internals changing which changed
the signature of a Python Action Function.

NEW FUNCTIONALITY

  • Added MSVC_USE_SCRIPT_ARGS Environment variable which specifies command line arguments
    to pass to the script specified by MSVC_USE_SCRIPT.
  • Added Configure.CheckMember() checker to check if struct/class has the specified member.
  • Added SHELL_ENV_GENERATORS construction variable. This variable should be set to a list
    (or an iterable) which contains functions to be called in order
    when constructing the execution environment (Generally this is the shell environment
    variables). This allows the user to customize how (for example) PATH is constructed.
    Note that these are called for every build command run by SCons. It could have considerable
    performance impact if not used carefully.
  • Added MSVC_USE_SETTINGS construction variable to pass a dictionary to configure the msvc compiler
    system environment as an alternative to bypassing Visual Studio autodetection entirely.
  • Added MSVC_SDK_VERSION construction variable which allows building with a specific Microsoft
    SDK version. This variable is used with the msvc batch file determined via autodetection. Refer
    to the documentation for additional requirements and validation details.
  • Added MSVC_TOOLSET_VERSION construction variable which allows building with a specific toolset
    version. This variable is used with the msvc batch file determined via autodetection. This
    variable does not affect the autodetection and selection of msvc instances. The toolset version
    is applied after an msvc instance is selected. This could be the default version of msvc. Refer
    to the documentation for additional requirements and validation details. Addresses issue #3265,
    issue #3664, and pull request #4149.
  • Added MSVC_SPECTRE_LIBS construction variable which allows building with spectre-mitigated
    Visual C++ libraries. This variable is used with the msvc batch file determined via autodetection.
    Refer to the documentation for additional requirements and validation details.
  • Added MSVC_SCRIPT_ARGS construction variable which specifies command line arguments that are
    passed to the msvc batch file determined via autodetection. Refer to the documentation for
    additional requirements and validation details. Addresses enhancement issue #4106.
  • Ninja: Added new alias "shutdown-ninja-scons-daemon" to allow ninja to shutdown the daemon.
    Also added cleanup to test framework to kill ninja scons daemons and clean ip daemon logs.
    NOTE: Test for this requires python psutil module. It will be skipped if not present.
  • Ninja: Added command line variable NINJA_CMD_ARGS that allows to pass through ninja command line args.
    This can also be set in your Environment().
  • Added a global policy setting and an environment construction variable for specifying the
    action to be taken when an msvc request cannot be satisfied. The available options are "error",
    "exception", "warning", "warn", "ignore", and "suppress". The global policy variable may be
    set and retrieved via the functions msvc_set_notfound_policy and msvc_get_notfound_policy,
    respectively. These two methods may be imported from SCons.Tool.MSCommon. The environment
    construction variable is MSVC_NOTFOUND_POLICY. When defined, the environment construction
    variable overrides the global policy setting for a given environment. When the active policy
    is "error" or "exception", an MSVCVersionNotFound exception is raised. When the active policy
    is "warning" or "warn", a VisualCMissingWarning warning is issued and the constructed
    environment is likely incomplete. When the active policy is "ignore" or "suppress", no action
    is taken and the constructed environment is likely incomplete. As implemented, the default
    global policy is "warning". The ability to set the global policy via an SCons command-line
    option may be added in a future enhancement.
  • Added a global policy setting and an environment construction variable for specifying the
    action to be taken when msvc script errors are detected. The available options are "error",
    "exception", "warning", "warn", "ignore", and "suppress". The global policy variable may be
    set and retrieved via the functions msvc_set_scripterror_policy and msvc_get_scripterror_policy,
    respectively. These two methods may be imported from SCons.Tool.MSCommon. The environment
    construction variable is MSVC_SCRIPTERROR_POLICY. When defined, the environment construction
    variable overrides the global policy setting for a given environment. When the active policy
    is "error" or "exception", an MSVCScriptExecutionError exception is raised when msvc batch file
    errors are detected. When the active policy is "warning" or "warn", an MSVCScriptExecutionWarning
    warning is issued when msvc batch file errors are detected. When the active policy is "ignore" or
    "suppress", msvc batch error messages are suppressed. As implemented, the default global policy
    is "ignore". The ability to set the global policy via an SCons command-line option may be added
    in a future enhancement.
  • Added experimental function msvc_query_version_toolset to SCons.Tool.MSCommon. Given a version
    specification, this function will return an msvc version and an msvc toolset version. The msvc
    toolset version may be None. The msvc version and msvc toolset version can be used in the
    environment construction variables MSVC_VERSION and MSVC_TOOLSET_VERSION, respectively. The
    version specification may be an msvc version or an msvc toolset version. This is a proxy for
    using an msvc toolset version to select an msvc instance. This function may be removed when an
    msvc toolset version is used during msvc instance selection.
  • Fortran: a new construction variable FORTRANCOMMONFLAGS is added which is
    applied to all Fortran dialects, to enable global (all-dialect) settings.
  • lex: two new construction variables are introduced (LEX_HEADER_ILE
    and LEX_TABLES_FILE) as the preferred way of specifying extra files that
    the tool can generate.
  • yacc: two new construction variables are introduced (YACC_HEADER_FILE
    and YACC_GRAPH_FILE) as the preferred way of specifying extra files that
    the tool can generate (applies only when using GNU flex and GNU bison).

CHANGED/ENHANCED EXISTING FUNCTIONALITY

  • On Windows, %AllUsersProfile%\scons\site_scons is now the default "system"
    location for a site_scons directory.
    %AllUsersProfile%\Application Data\scons\site_scons will continue to work.
    There does not seem to be any existing convention to use an
    "Application Data" subdirectory here.
  • Action._subproc() can now be used as a python context manager to ensure that the
    POpen object is properly closed.
  • SCons help (-H) no longer prints the "ignored for compatibility" options,
    which are still listed in the manpage.
  • Help is now sensitive to the size of the terminal window: the width of the
    help text will scale to wider (or narrower) terminals than 80 characters.
  • Ninja: Changed generated build.ninja file to run SCons only build Actions via
    a SCons Deamon. Added logic for starting and connecting to SCons daemon (currently
    only used for ninja)
  • The change to "content" and "content-timestamp" Decider names is reflected
    in the User Guide as well, since the hash function may be other than md5
    (tidying up from earlier change)
  • If the (experimental) SCONS_CACHE_MSVC_CONFIG feature is used, it will now
    attempt a sanity check for the cached compiler information, and regenerate
    it if needed. Previously, this cache would fail if a compiler upgrade caused
    a change to internal paths (e.g. upgrading from 17.1 to 17.2 causes
    a necessary path component in some of the cached vars to need to 14.32.31326
    instead of 14.31.31103), and the cache file needed to be manually removed.
    The default cachefile name is now "scons_msvc_cache.json" rather than
    ".scons_msvc_cache" so there should be no transition problem if using the
    default; if using a custom cache file name, the cache should still be
    manually removed if there are problems to transition to the new style.
  • Ninja: Update ninja file generation to only create response files for build commands
    which exceed MAXLINELENGTH
  • Update the debug output written to stdout for MSVC initialization which is enabled
    by setting SCONS_MSCOMMON_DEBUG=- to use the logging module. Also changed the debug
    output format written to stdout to include more information about the source for each
    message of MSVC initialization debugging output. A single space was added before the
    message for all debugging output records written to stdout and to files.
  • Ninja: Made ninja tool force the ninja file as the only target. Also improved the default
    targets setup and made sure there is always a default target for
    the ninja file, which excludes targets that start and stop the daemon.
  • Ninja: Update ninja tool so targets passed to SCons are propgated to ninja when scons
    automatically executes ninja.
  • Add JavaScanner to include JAVACLASSPATH as a dependency when using the Java tool.
  • The build argument (i.e., x86) is no longer passed to the MSVC 6.0 to 7.1 batch
    files. This may improve the effectiveness of the internal msvc cache when using
    MSVC detection and when bypassing MSVC detection as the MSVC 6.0 to 7.1 batch files
    do not expect any arguments.
  • Propagate the OS and windir environment variables from the system en...
Read more

4.3.0 Release is available

15 Feb 17:54
Compare
Choose a tag to compare

A new SCons release, 4.3.0, is now available
on the SCons download page:

  https://scons.org/pages/download.html

NOTE: 4.3.0 now requires Python 3.6.0 and above. Python 3.5.x is no longer supported

Here is a summary of the changes since 4.2.0:

NEW FUNCTIONALITY

  • Ninja - Added ninja API 'NINJA_FORCE_SCONS_BUILD' to force a node to callback to scons.
  • Add support for Visual Studio 2022.

DEPRECATED FUNCTIONALITY

  • The qt tool, which targets Qt version 3, is deprecated. Qt3 has been unsupported by
    upstream for many years. Qt4 and Qt5 tools are available from scons-contrib.

CHANGED/ENHANCED EXISTING FUNCTIONALITY

  • Ninja - Expanded ninja Mkdir to also support Mkdir actions.
  • Further PCH updates. It's now recommended that env['PCH'] should always be a File node.
    Either via return value from env.PCH() or by explicitly using File('StdAfx.pch').
  • Change SCons.Platform.win32.get_architecture() to return platform.platform() when run in an
    environment where neither: PROCESSOR_ARCHITEW6432 nor PROCESSOR_ARCHITECTURE is set.
    This should fix platform tests which started failing when HOST_OS/HOST_ARCH changes
    introduced by Aaron Franke (listed below) were merged.
  • The Java tool now accepts more versions (up to 17.0), and is better
    able to detect the many builds of OpenJDK available since it became
    designated the reference Java implementation.

FIXES

  • Fix reproducible builds. Restore logic respecting SOURCE_DATE_EPOCH when set.
  • Small fix to ensure CLVar default value is an empty list.
    See MongoDB bug report: https://jira.mongodb.org/browse/SERVER-59656
    Code contributed by MongoDB.
  • Ninja - Fix ninja tool to never use for_sig substitution because ninja does not use signatures. This
    issue affected CommandGeneratorAction function actions specifically.
  • Fix PCH not being evaluated by subst() where necessary.
  • Fix issue #4021. Change the way subst() is used in Textfile() to not evaluate '$$(' -> '$',
    but instead it should yield '$('.
  • Ninja - Fix command line escaping for ninja dollar sign escape. Without escaping ninja properly,
  • Fix MSVS tests (vs-N.N-exec.py) for MSVS 6.0, 7.0, and 7.1 (import missing module).
  • Fix command line escaping for ninja dollar sign escape. Without escaping ninja properly,
    the ninja file scons regenerate and callback invocations will lose the $ characters used in
    the scons command line which ninja uses itself for escaping. For Example:
    scons BUILD=xyz OTHERVAR=$BUILD
    Prior to this fix, it would cause ninja to fail to escape the dollar sign, leading to the
    single dollar sign being used as a ninja escape character in the ninja file.
  • Ninja - Fixed an issue where if you control-c and/or killed ninja while it was running scons to regenerate
    build.ninja you would end up with no build.ninja file and have to rerun scons from scratch.
    Code contributed by MongoDB.

DEVELOPMENT

  • Added --no-ignore-skips to runtest.py. Changed default to ignore skips when setting
    runtest.py's exit status. Previously would exit 2 if any tests were skipped.
    Now will only exit 2 if user specifies --no-ignore-skips and some tests were skipped.

Thanks to the following contributors listed below for their contributions to this release.

.. code-block:: text

git shortlog --no-merges -ns 4.2.0..HEAD
47  Mats Wichmann
46  William Deegan
14  Jacob Cassagnol
11  Daniel Moody
 8  Ryan Egesdahl
 5  Joseph Brill
 4  Omar Polo
 2  Brian Quistorff
 1  Aaron Franke

4.2.0 Release is available.

05 Aug 19:31
Compare
Choose a tag to compare

A new SCons release, 4.2.0, is now available
on the SCons download page:

  https://scons.org/pages/download.html

Here is a summary of the changes since 4.1.0:

NOTE: The 4.2.0 Release of SCons will deprecate Python 3.5 Support. Python 3.5 support will be dropped in the next major release.

NEW FUNCTIONALITY

- Add support for the (TARGET,SOURCE,TARGETS,SOURCES,CHANGED_TARGETS,CHANGED_SOURCES}.relpath property.
  This will provide a path relative to the top of the build tree (where the SConstruct is located)
  Fixes #396
- Added --experimental flag, to enable various experimental features/tools.  You can specify
  'all', 'none', or any combination of available experimental features.
- Added affect_signature flag to  _concat function.  If set to False, it will prepend and append $( and $).
  That way the various Environment variables can use that rather than "$( _concat(...) $)".

DEPRECATED FUNCTIONALITY

- Deprecate Python 3.5 as a supported version.

CHANGED/ENHANCED EXISTING FUNCTIONALITY

- SCons now supports the command-line parameter `--hash-format` to override the default
  hash format that SCons uses. It can also be set via `SetOption('hash_format')`. Supported
  values are: `md5`, `sha1`, and `sha256`. For all hash formats other than
  the default of `md5`, the SConsign database will include the name of the hash format.
  For example, `--hash-format=sha256` will create a SConsign with name
  `.sconsign_sha256.dblite.`.
- Improve Subst()'s logic to check for proper callable function or class's argument list.
  It will now allow callables with expected args, and any extra args as long as they
  have default arguments. Additionally functions with no defaults for extra arguments
  as long as they are set using functools.partial to create a new callable which set them.
- Internal has_key methods removed from SCons' dictionary-like objects
  SubstitutionEnvironment and OverrideEnvironment - in other words,
  an env - to match Python 3 which no longer has dict.has_key.
- Removed long-deprecated construction variables PDFCOM, WIN32_INSERT_DEF,
  WIN32DEFPREFIX, WIN32DEFSUFFIX, WIN32EXPPREFIX, WIN32EXPSUFFIX.
  All have been replaced by other names since at least 1.0.
- Added CACHEDIR_CLASS construction variable and expanded CacheDir method args
  to support SCons invoking CacheDir derived classes for CacheDir customization.
  Moved copy_from_cache attribute from the Environment class to CacheDir class.
  Code contributed by MongoDB.
- Update BuildTask to pass all targets to the progress object fixing an issue
  where multi-target build nodes only got the first target passed to the progress
  object.
- Change SConscript() missing SConscript behavior - if must_exist=False,
  the warning is suppressed.

FIXES

- The command-line parameter `--md5-chunksize` is now deprecated. Use `--hash-chunksize`
  instead.
- Fix Issue #3906 - `IMPLICIT_COMMAND_DEPENDENCIES` was not properly disabled when
  set to any string value (For example ['none','false','no','off'])
  Also previously 'All' wouldn't have the desired affect.
- DocbookXslt tool: The XSLT stylesheet file is now initialized to an env.File() Node, 
  such that dependencies work correctly in hierarchical builds (eg when using 
  DocbookXslt in SConscript('subdir/SConscript') context.
- The Install builder will now set the writable mode on the file(s) it
  copies. This restores the (previously undocumented) SCons behavior
  that regressed as of 4.0.0.
- Fix issue #3790: Generators in CPPDEFINES now have access to populated source
  and target lists
- Fix a potential race condition in shared cache environments where the permissions are
  not writeable for a moment after the file has been renamed and other builds (users) will copy
  it out of the cacheSmall reorganization of logic to copy files from cachedir. Moved CacheDir 
  writeable permission code for copy to cache behind the atomic rename operation.
- Fixed intermediate and and multi target nodes generated from SConf tests not being marked
  as is_conftest().

Thanks to the following contributors listed below for their contributions to this release.

.. code-block:: text

git shortlog --no-merges -ns 4.1.0..HEAD
   177  William Deegan
   101  Daniel Moody
    95  Mats Wichmann
    25  Adam Gross
     4  greenbender
     4  Daniel
     4  Henrik Maier
     4  Mathew Robinson
     3  Andrew Morrow
     3  Ivan Kravets
     3  Dillan Mills
     1  WholesomeIsland
     1  dependabot[bot]
     1  djh
     1  Joseph Brill