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

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


Here is a summary of the changes since 4.10.1:

DEPRECATED FUNCTIONALITY
------------------------

- Deprecated Python 3.7 & 3.8 support.
- Deprecated using signature-file-per-directory (aka old-style SConsign)
  via the SConsignFile(name=None) call.
- The legacy job scheduler, which was superseded by a new scheduler in
  SCons 4.7  but remained available as a fallback, is deprecated and
  will be removed in the next release. The --experimental feature flag
  to select the legacy scheduler is renamed to "legacy_sched_deprecated"
  to give a clear indication of the status change; the flag will also
  be removed in the next release.

REMOVED FUNCTIONALITY
---------------------

- The qt3 tool module, deprecated since version 4.3, is removed due to
  the general unavailability of the obsolete build-time Qt3 package.

CHANGED/ENHANCED EXISTING FUNCTIONALITY
---------------------------------------

- The tool search order now prefers clang over gcc on FreeBSD and OpenBSD.

FIXES
-----

- Fix --debug=includes for case of multiple source files.
- Adjust race protection for CacheDir - now uses a unique temporary
  directory for each writer before doing the move, instead of depending
  on a one-time uuid to make a path to the file.
- Fix handling of AddOption for option-arguments with spaces (when omitting
  the = sign or when an option takes multiple option-arguments). Arguments
  unknown at the time the first pass splits the command line into arguments
  and targets would put such arguments into targets, and they remained
  there even after the AddOption calls were seen.
- Fix CPPDEFINES test using pkg-config, which was failing on GH Actions.
- Fix -n / --no-exec support when using ninja tool

IMPROVEMENTS
------------

- Reduce unneeded computation of overrides. The Mkdir builder used an
  unknown argument ('explain') on creation, causing it to be considered
  an override. Also, if override dict is empty, don't even call the
  Override factory function.
- Subst: Multiple substitution optimizations providing up to 8-12% performance
  improvement on typical builds, with larger gains (up to 20-30%) on builds with
  many callable construction variables:
  * Consolidate dictionary merging operations to reduce unnecessary copies
  * Use functools.lru_cache for callable signature inspection with bounded
    memory (256 entries max, ~1MB)
  * Make Action classes (CommandAction, FunctionAction, ListAction) hashable
    to enable cache optimization
  * Fix for_signature logic bug in ListSubber.expand() for correct signature
    generation
  * Modernize string formatting to f-strings
  Also, separately, some code-style cleanups and docstring work in Subst.py.
- Test runner reworked to use Python logging; the portion of the test suite
  which tests the runner was adjusted to match.
- Used Gemini to refactor runtest.py to better organize the code and add docstrings.
- Simplified and sped up compilation database generation. No longer requires
  each entry to have a dedicated node that's always built; instead, the database
  *itself* is set to always build.
- Switch remaining "original style" docstring parameter listings to Google style.
- Additional small tweaks to Environment.py type hints, fold some overly
long function signature lines, and some linting-inspired cleanups.
- Test framework: tweak module docstrings
- Test suite: end to end tests don't use assert in result checks
- Don't duplicate the creation of Tool objects if "default" is part of
  the tool list.
- Test suite: add support for Python 3.15 in the Action unit tests.
- zip tool now uses zipfile module's "from_file" method to populate ZipInfo
  records, rather than doing manually.
- Add RequiredPackage to the LaTeX scanner for recursive scanning of custom
  LaTeX packages.
- Java tool recognizes all released versions, and no longer needs manual
  updating as new releases are made. Default is now latest LTS - v25.
- Clarify internal usage of zipimporter (not user-visible code)
- Handle missing/malformed manifest in mslink more gracefully (issue 4866).
- Change the way ldc D compiler specifies including libdruntime when
  making a shared object. ldc version 1.3 (2017) introduced shared
  druntime on some platforms, with an odd library naming scheme. SCons
  specification was "too precise" to work cross-platform with the new
  scheme, now let the linker pass pick. Adjust $SHDLINKFLAGS to change this,
  or choose other schemes, such as LTO libs.

PACKAGING
---------

- Added script for release process to find all contributors in a release and highlight
  new contributors. (Using Gemini AI)

DOCUMENTATION
-------------

- Fix SCons Docbook schema to work with lxml > 5
- More clarifications in manpage Builder Methods section.
- Handle the default (unset) ProgressObject differently for the sole
  purpose of avoiding Sphinx 9.0+ blowing up on it (it's been giving
  a warning for years, but now it's a fatal error). Affects only the
  API doc build.
- Improve coverage of "API doc" build by ignoring any setting of
  __all__ in a package and not showing inherited members from optparse.
  Add a trick to make sure build sees PathListCache while generating
  docs (in normal operation, it's removed so was not visible).
- All functions/classes/non-dunder methods in Environment now have docstrings.
- Add possible build failure when targeting 32-bit arm using Visual
  Studio 2022 with Windows SDK version 10.0.26100.0 or later installed
  to the known issues in SCons/Tool/MSCommon/README.rst.
- Clarify VariantDir behavior when switching to not duplicate sources
  and tweak wording a bit.
- Update documentation of the three file-finding functions in the API
  (FindFile, FindInstalledFiles, FindSourceFiles) as well as FindPathDirs.
- Update documentation for linking-related construction variables.
  Add a few more live links.
- Update documentation for CacheDir and related option flags
- Drop old example section from manpage. This has been commented out since
  release 4.0, when the content was used to populate the new SCons Cookbook.
- Update documentation for IMPLICIT_COMMAND_DEPENDENCIES construction variable.
- Fix typo in preface
- Remove word "below" when content is not actually located below
- Fix typos in preface, Chapter 6, Chapter 9 and Chapter 10 of User Guide
- Fix broken links in Chapter 1 of User Guide
- Add info on the type of an option variable to GetOption and SetOption.
- Tighten up the doc for Variables-Add() and add a note on file contents
  not being preserved to Variables-Save()
- Tweak the wording for $PRINT_CMD_LINE_FUNC.
- Fixed an old problem in PDF doc generation where the path to an
  image file ended up with a "not found" error.
- Fixed PDF doc build problems relating to illegal margin widths ("")
  and table column alignment.

DEVELOPMENT
-----------

- Introduce some unit tests for the file locking utility routines
- Purge vim/emac local variable bloat.
- Implement type hints for Node subclasses.
- Ruff: Handle F401 exclusions more granularly, remove per-file exclusions.
- Update pyproject.toml to support Python 3.14 and remove restrictions on lxml version install
- Unify internal "_null" sentinel usage.
- Docbook tests: improve skip message, more clearly indicate which test
  needs actual installed system programs (add -live suffix).
- Implement type hints for Environment and environment utilities.
- MSVC: Added a host/target batch file configuration table for Visual
  Studio 2026.  Visual Studio 2026 removed support for 32-bit arm targets.
- Modernized GitHub Actions test runner. This consolidates the logic of
  existing test environments into a single package. Adjusted AppVeyor to
  only run for targets unsupported by GitHub runners.
- Fix Appveyor scripting to install unavailable python versions when needed and use them
  for testing.
- Split `SCons.Util.UtilTests.py` to individual packages where appropriate.
- Add 'bsd' platform definition.

Thanks to the following contributors listed below for their contributions to this release.
==========================================================================================
.. code-block:: text

    git shortlog --no-merges -ns 4.10.1..HEAD
        87  William Deegan
        74  Mats Wichmann
        14  Thaddeus Crews
        10  Prabhu Singh Khalsa
         5  Joseph Brill
         4  Keith F. Prussing
         4  Prabhu S. Khalsa
         1  Cornelii Sandberg
         1  Paul Movall
         1  Vassili Tchersky
