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 environment to the msvc
environment. The OS and windir environment variables are used in the MSVC 6.0 batch file
and the SDK 6.0-7.1 SetEnv.cmd batch files. Inclusion of the OS and windir environment
variables eliminates some partial paths and warnings generated by the MSVC 6.0 and SDK
6.0-7.1 batch files when the variables are not defined.- Note: Attempting to run the SDK 6.0-7.1 batch files directly via MSVC_USE_SCRIPT can lead to
build failures and/or incomplete build environments. The SDK 6.0-7.1 batch files
require delayed expansion to be enabled which is currently not supported and is
typically not enabled by default on the host system. The batch files may also require
environment variables that are not included by default in the msvc environment.
- Note: Attempting to run the SDK 6.0-7.1 batch files directly via MSVC_USE_SCRIPT can lead to
-
An exception is raised when MSVC_UWP_APP is enabled for Visual Studio 2013 and earlier.
Previous behavior was to silently ignore MSVC_UWP_APP when enabled for Visual Studio 2013
and earlier. Refer to the documentation for additional requirements and validation details.
MSVC_UWP_APP was extended to accept True, False, and None in addition to '1' and '0'. -
Ninja: added option "--skip-ninja-regen" to enable skipping regeneration of the ninja file
if scons can determine the ninja file doesnot need to be regenerated, which will also
skip restarting the scons daemon. Note this option is could result in incorrect rebuilds
if scons Glob or scons generated files are used in ninja build target's command lines. -
Tool loading used to have a special case for Jython, it no longer does. This effectively
means SCons doesn't work with Jython, which has in reality been the case ever since
SCons dropped Python 2 support - there is still no timeline for Jython switching to
Python 3 compatibility.
FIXES
- Fix a number of Python ResourceWarnings which are issued when running SCons and/or it's tests
with python 3.9 (or higher) - Ninja: Fix issue where Configure files weren't being properly processed when build run
via ninja. - Fixed crash in C scanner's dictify_CPPDEFINES() function which happens if
AppendUnique is called on CPPPATH. (Issue #4108). - Added default values for source and target arguments to _defines() function. This
is used to expand CPPDEFINES (and others). Previous change added those arguments
with no defaults, so old usage where _defines() was called without source and target
arguments would yield an exception. This issue was found via qt4 and qt5 tools in
scons-contrib SCons/scons-contrib#45 - Fix issue where if you only had mingw installed on a Windows system and no MSVC compiler, and
did not explicitly request the mingw tool, mingw tool initialization would fail and set the
default compiler to MSVC which wasn't installed, yielding broken build.
Updated mingw tool so that the generate and exists methods use the same mingw search paths
(issue #4134). - Ninja: Added NINJA_GENERATED_SOURCE_ALIAS_NAME which allows user to specify an
Alias() which the ninja tool can use to determine which files are generated sources.
If this is not set by the user then the ninja tool will still dynamically determine
which files are generated sources based on NINJA_GENERATED_SOURCE_SUFFIXES, and create
a phony target _ninja_generated_sources. Generated sources will be built first by
ninja. This is needed because ninja cannot determine which generated sources are
required by other build targets. Code contributed by MongoDB. - Added special case for ninja scons daemon to work in win32 python3.6 environments.
This particular environment does a bad job managing popen standard file handles, so
some special workarounds are needed. - Added user configurable setting of ninja depfile format via NINJA_DEPFILE_PARSE_FORMAT.
Now setting NINJA_DEPFILE_PARSE_FORMAT to [msvc,gcc,clang] can force the ninja expected
format. Compiler tools will also configure the variable automatically. - Fix issue where Express versions of the MSVC compiler were not detected due to differences
in initial msvc detection and msvc batch file determination when configuring the build
environment. This could lead to build failures when only an MSVC Express instance is installed
and the MSVC version is not explicitly specified (issue #2668 and issue #2697). - Restore the ability of the content-timestamp decider to see that a
a source which is a symlink has changed if the file-system target of
that link has been modified (issue #3880) - Fix typo in ninja scons daemon startup which causes ConnectionRefusedError to not retry
to connect to the server during start up. - Fix incorrect Java classpath generation when a NodeList is used as part of any JAVA*PATH variables.
- The system environment variable names imported for MSVC 7.0 and 6.0 were updated to be
consistent with the variables names defined by their respective installers. This fixes an
error caused when bypassing MSVC detection by specifying the MSVC 7.0 batch file directly. - lex: Fixed an issue with the lex tool where file arguments specified to either "--header-file="
or "--tables-file=" which included a space in the path to the file would be processed incorrectly - Modify the MSCommon logger configuration to be independent of the root logger. This fixes an issue
when multiple loggers are created and the MSCommon logger added computed fields to the root logger
that are not present in other logging instances. - Modify the MSVC_USE_SCRIPT_ARGS test fixture to disable the msvc cache. This fixes an issue where
the MSVC_USE_SCRIPT_ARGS test for success relied on a debug log message that was not produced when
the msvc cache file exists and the test keys are already in the cache as the msvc script invocation
was bypassed. - Suppress issuing a warning when there are no installed Visual Studio instances for the default
tools configuration (issue #2813). When msvc is the default compiler because there are no
compilers installed, a build may fail due to the cl.exe command not being recognized. At
present, there is no easy way to detect during msvc initialization if the default environment
will be used later to build a program and/or library. There is no error/warning issued for the
default tools as there are legitimate SCons uses that do not require a c compiler.
IMPROVEMENTS
- Verify that a user specified msvc script (via MSVC_USE_SCRIPT) exists and raise an
exception immediately when the user specified msvc script does not exist. - Add cache-debug messages for push failures.
- Ninja: Added ninja mingw support and improved ninja CommandGeneratorAction support.
- Command-line help is now sensitive to the size of the terminal window: the
width of the help text will scale for terminals other than 80 chars wide. - Refactor the msvc code so that the same data structures are used during initial msvc detection
and msvc batch file determination when configuring the build environment. Simplify the msvc
code by eliminating special case handling primarily due to the differences between the full
versions and express versions of visual studio. - Small refactor of scons daemons using a shared StateInfo class for communication
between the scons interactive thread and the http server thread. Added error handling
for scons interactive failing to startup. - Ninja: Updated ninja scons daemon scripts to output errors to stderr as well as the daemon log.
- Ninja: Ensure that all targets set as default via Default() in SConstruct/SConscripts are
default targets in the generated ninja.build file.
PACKAGING
- Added project_url for mailing lists and Discord
- Updated setup.cfg to remove Python 3.5 and add Python 3.10
Thanks to the following contributors listed below for their contributions to this release.
.. code-block:: text
git shortlog --no-merges -ns 4.3.0..HEAD
174 Joseph Brill
126 Mats Wichmann
93 William Deegan
64 Daniel Moody
4 SergBobrovsky
2 dependabot[bot]
1 djh
1 Ivan Kravets
1 Vishwajith-K
1 Zhichang Yu
.. _page: http://sourceforge.net/projects/scons/files/scons/4.4.0/
.. _ChangeLog: https://raw.githubusercontent.com/SCons/scons/rel_4.4.0/CHANGES.txt