Releases: SCons/scons
SCons 4.8.1 Released
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
andPathVariable
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 theoem
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 ofisinstance
. Python 3.10 through 3.12
usesTypeGuard
, a less accurate implementation but still provides
usable type hinting. Python 3.9 and earlier simply returnsbool
, 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
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 nowlf
, with the exception of a few
Windows-only files usingcrlf
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
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
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 twoSConscript
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
ifkpsewhich 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 ...
4.5.2 Release
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 frompyproject.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
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
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...
SCons 4.4.0
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...
4.3.0 Release is available
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.
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