Skip to content

SCons 4.4.0

Compare
Choose a tag to compare
@bdbaddog bdbaddog released this 30 Jul 21:59
· 1180 commits to master since this release

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.
  • 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