CMake 4.2.0-rc1 is ready for testing

I am proud to announce the first CMake 4.2 release candidate.

https://cmake.org/download/

Documentation is available at:

https://cmake.org/cmake/help/v4.2

Release notes appear below and are also published at

https://cmake.org/cmake/help/v4.2/release/4.2.html

Release milestone is available at:
release milestone

Some of the most significant changes in CMake 4.2 are:

  • The “Visual Studio 18 2026” generator was added. This is
    experimental and based on “Visual Studio 2026 Insiders” because this
    version of VS has not been released.

  • The “FASTBuild” generator was added.

  • CMake now supports Cross Compiling for Emscripten with simple
    toolchain files.

  • The “set(CACHE{})” and “unset(CACHE{})” commands
    were added to explicitly set and unset cache entries.

  • The “INSTALL_OBJECT_NAME” source file property was added to control
    names of installed object files for specific compiled sources.

  • Nearly all find modules now provide a “_VERSION” result
    variable matching the casing of its module name. Existing variants
    such as “_VERSION_STRING” and uppercased
    “_VERSION” are deprecated. See documentation of each
    find module for details.

  • The “ExternalProject” module’s “ExternalProject_Add()” and
    “ExternalProject_Add_Step()” commands now provide options to set
    environment variables on the configure, build, install, and test
    steps.

  • The “Visual Studio 14 2015” generator is now deprecated and will be
    removed in a future version of CMake.

CMake 4.2 Release Notes


Changes made since CMake 4.1 include the following.

New Features

File-Based API

  • The “cmake-file-api(7)” “codemodel” version 2 “version” field has
    been updated to 2.9.

  • The “cmake-file-api(7)” “codemodel” version 2 “target” and
    “directory” objects gained a new “codemodelVersion” field.

  • The “cmake-file-api(7)” “codemodel” version 2 now includes imported
    targets and all interface library targets in its replies.
    Previously, imported targets were omitted, and only those interface
    targets that participated in the build system were included. The
    following changes support these new additions:

    • The “target” object gained “imported”, “local”, and “abstract”
      fields.

    • The “target” object’s “type” field can now also hold the value
      “UNKNOWN_LIBRARY”.

    • The “codemodel” object’s “configurations” entries gained a new
      “abstractTargets” array.

    • Entries in the “directories” and “projects” arrays of the
      “codemodel” object’s “configurations” entries gained a new
      “abstractTargetIndexes” array.

  • The “cmake-file-api(7)” “codemodel” version 2 “target” object gained
    new “linkLibraries”, “interfaceLinkLibraries”,
    “compileDependencies”, “interfaceCompileDependencies”,
    “objectDependencies”, and “orderDependencies” fields.

Generators

  • The “Visual Studio 18 2026” generator was added. This is
    experimental and based on “Visual Studio 2026 Insiders” because this
    version of VS has not been released.

  • The “FASTBuild” generator was added.

Platforms

  • CMake now supports Cross Compiling for Emscripten with simple
    toolchain files.

Command-Line

  • The “cmake(1)” command-line tool now supports “cmake -E
    copy_if_newer” and “cmake -E copy_directory_if_newer” subcommands to
    copy files based on timestamp comparison instead of content
    comparison. These commands copy files only if the source is newer
    than the destination, providing better performance for build systems
    compared to “copy_if_different” which compares file contents.

Commands

  • The “cmake_language(TRACE)” command was added to enable or disable
    tracing during script execution.

  • The “set(CACHE{})” and “unset(CACHE{})” commands
    were added to explicitly set and unset cache entries.

  • The “string(REGEX QUOTE)” command was added to generate a regular
    expression exactly matching a string.

Variables

  • The “CMAKE_CXX_STDLIB_MODULES_JSON” variable was added to set the
    path to the “import std” metadata file for the standard library
    rather than using the compiler to discover its location.

  • The “CMAKE_INTERMEDIATE_DIR_STRATEGY” variable and corresponding
    “CMAKE_INTERMEDIATE_DIR_STRATEGY” environment variable were added to
    change the strategy used to name intermediate directories used for
    object files and other associated target metadata.

  • The “CMAKE_AUTOGEN_INTERMEDIATE_DIR_STRATEGY” variable and
    corresponding “CMAKE_AUTOGEN_INTERMEDIATE_DIR_STRATEGY” environment
    variable were added to change the strategy used to name intermediate
    directories used for “Qt Autogen” files.

  • The “CMAKE_SKIP_LINTING” variable and corresponding “SKIP_LINTING”
    target property were added to tell the Command-Line Build Tool
    Generators to skip linting all sources in a target.

Properties

  • The “INSTALL_OBJECT_NAME” source file property was added to control
    names of installed object files for specific compiled sources.

  • The “INSTALL_OBJECT_NAME_STRATEGY” target property was added to
    control the naming strategy for installed object files.

  • The “INSTALL_OBJECT_ONLY_USE_DESTINATION” target property was added
    to more precisely control the installation path for object files.

  • The “JOB_POOL_COMPILE” source file property was added to assign
    individual source compilations to “JOB_POOLS”.

  • The “OBJECT_NAME” source file property was added to control object
    names of compiled source files.

  • The “UNITY_BUILD_FILENAME_PREFIX” target property was added to
    control names of source files generated by “UNITY_BUILD”.

Modules

  • Nearly all find modules now provide a “_VERSION” result
    variable matching the casing of its module name. Existing variants
    such as “_VERSION_STRING” and uppercased
    “_VERSION” are deprecated. See documentation of each
    find module for details.

  • The “CheckTypeSize” module’s “check_type_size()” command gained a
    new “RESULT_VARIABLE” keyword to customize the result variable name
    instead of the default “HAVE_”.

  • The “ExternalProject” module’s “ExternalProject_Add()” and
    “ExternalProject_Add_Step()” commands now provide options to set
    environment variables on the configure, build, install, and test
    steps.

  • The “FindPython3”, “FindPython2”, and “FindPython” modules no longer
    make “NumPy” depend on “Development.Module”. See policy “CMP0201”.

  • The “GoogleTest” module’s “gtest_discover_tests()” command now sets
    the “DEF_SOURCE_LINE” test property for each discovered test if
    gtest supports the “–gtest_output=json” option. This test property
    is used by some IDEs to locate the source for each test.

  • The “UseSWIG” module’s “swig_add_library()” command gained a
    “DEBUG_POSTFIX” option to control the “DEBUG_POSTFIX” target
    property.

Generator Expressions

  • The “_COMPILER_LINKER_ID” and
    COMPILER_LINKER_FRONTEND_VARIANT" families of generator
    expressions were added to access the value of the associated
    "CMAKE
    COMPILER_LINKER_ID" and
    "CMAKE
    _COMPILER_LINKER_FRONTEND_VARIANT” variables.

  • The “TARGET_FILE_BASE_NAME”, “TARGET_IMPORT_FILE_BASE_NAME”,
    “TARGET_LINKER_FILE_BASE_NAME”,
    “TARGET_LINKER_LIBRARY_FILE_BASE_NAME”,
    “TARGET_LINKER_IMPORT_FILE_BASE_NAME”, and
    “TARGET_PDB_FILE_BASE_NAME” generator expressions gained a “POSTFIX”
    option to control the inclusion of the “_POSTFIX” target
    property as part of the base names of the corresponding files.

  • The “TARGET_INTERMEDIATE_DIR” generator expression was added to
    refer to a target’s intermediate files directory in the build tree.

CPack

  • The “CPACK_PACKAGE_CHECKSUM” variable now supports multiple values.

  • The “CPack NSIS Generator” gained a “CPACK_NSIS_CRC_CHECK” variable
    for setting the “CRCCheck” attribute.

  • The “CPack WIX Generator” gained a “CPACK_WIX_CAB_PER_COMPONENT”
    variable to enable one “.cab” per component.

Deprecated and Removed Features

  • All find modules now provide a “_FOUND” result variable
    matching the casing of its module name. Existing variants, such as
    the uppercased “_FOUND”, are deprecated where
    appropriate. See documentation of each find module for details.

  • The “FindwxWidgets” module’s result variable “wxWidgets_USE_FILE” is
    now deprecated in favor of including the “UsewxWidgets” module
    directly.

  • The “Visual Studio 14 2015” generator is now deprecated and will be
    removed in a future version of CMake.

Other Changes

  • The “$CONFIG:cfgs” generator expression no longer matches multiple
    configurations. See policy “CMP0199”.

  • Selection of configuration and location of imported targets is now
    more consistent. See policy “CMP0200”.

  • The “CMAKE_PARENT_LIST_FILE” variable is no longer defined when
    processing a “CMakeLists.txt” file. See policy “CMP0198”.

  • For builds targeting the MSVC ABI, all generators now add the
    “_MBCS” preprocessor definition when compiling sources unless
    “_UNICODE” or “_SBCS” is found. See policy “CMP0204”.

  • For builds targeting the MSVC ABI, all generators now add the
    “_WINDLL” preprocessor definition when compiling sources in shared
    libraries. See policy “CMP0203”.

Thanks to everyone involved for your work! I have some questions/comments:

If I have something like the following in my CMakePresets.json, do I need to (or might I want to) change anything about it once I’m using CMake 4.2?

{
	"name": "tool:emscripten",
	"hidden": true,
	"description": "available if you set/export EMSDK environment variable. good for IDEs which are hard to configure to use `emcmake cmake`.",
	"condition": {"type": "notEquals", "lhs": "$env{EMSDK}", "rhs": ""},
	"toolchainFile": "$env{EMSDK}/upstream/emscripten/cmake/Modules/Platform/Emscripten.cmake",

If I have an external project that also uses CMake, and the main project gets environment variables from a CMake preset (and I rely on build, install, test, etc. to inherit from the configure preset), what would I need to do to have the external project get the same environment variables? Do I just do nothing, or do I need to manually forward the values for each of configure, build, install, and test?


Some escaping here is missing :slight_smile: and I got a minor scare before reading what the actual change is in https://cmake.org/cmake/help/latest/policy/CMP0199.html. Much narrower than it sounds here and in the release notes. Maybe a little bit of elaboration could save some other readers from a similar scare?


Out of curiosity, is there an anticipated non-rc release date for CMake 4.2?

Not sure if I’m doing something wrong, but I followed the instructions at https://apt.kitware.com/ to subscribe to release candidates for noble, but I don’t see 4.2 after `apt update`.