I am proud to announce the first CMake 4.2 release candidate.
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
"CMAKECOMPILER_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”.