CMake 4.5.0-rc1 is ready for testing
I am proud to announce the first CMake 4.5 release candidate.
https://cmake.org/download/
Documentation is available at:
https://cmake.org/cmake/help/v4.5
Release notes appear below and are also published at
https://cmake.org/cmake/help/v4.5/release/4.5.html
Release milestone is available at:
release milestone
Some of the most significant changes in CMake 4.5 are:
-
“import std” is now available for all C++ 20 and later code with
“CXX_SCAN_FOR_MODULES” enabled. -
The “CMAKE_INSTALL_SBOM_FORMATS” variable was added to enable
Software Bill of Materials (SBOM) generation. -
The “install(SBOM)” and “export(SBOM)” commands were added to
generate Software Bill of Materials (SBOM) files. -
The “CMD_NON_TARGET_DIRECTIVE” diagnostic category was added to
diagnose commands that affect the directory scope when comparable
target-specific commands exist. -
The Ninja Generators, Makefile Generators, and “FASTBuild” generator
now provide “install_prep/all” and “install_prep/<component>”
convenience build targets by default. -
The “FASTBuild” generator, Ninja Generators, and the Makefile Generators
now provide “test_prep/<test-name>” and “test_prep/all” convenience build
targets by default. -
The “add_custom_rule()” command was added to allow the definition of
pattern rules. -
The “cmake_language(PRINT_PROPERTIES)”, “cmake_language(PRINT_TARGETS)”
and “cmake_language(PRINT_VARIABLES)” commands were added to print
CMake system information in human-readable form for debugging. -
Many commands now accept Alias Targets. The commands operate on
the underlying aliased target. See Release Notes for the commands
that now supports Alias Targets. -
The “ExternalProject” module’s “ExternalProject_Add()” command now
sets “CMAKE_INSTALL_PREFIX” to the external project’s “INSTALL_DIR”
in its default configure command, so a CMake external project
installs into the prefix the module reserves for it rather than the
built-in default (e.g. “/usr/local”). A caller-supplied prefix still
takes precedence. See policy “CMP0225”. -
The “FindPython3” and “FindPython” modules gained, respectively, the
variable “Python3_SOSABI_PLATFORM” and “Python_SOSABI_PLATFORM”
which gives, on some platforms, for the Stable Application Binary
Interface, the extension including the platform triplet. -
“ctest(1)” gained a “–out-of-date” option to run only tests whose
recorded build dependencies are newer than the last time the tests
ran.
CMake 4.5 Release Notes
***********************
Changes made since CMake 4.4 include the following.
New Features
============
Diagnostics
-----------
* The "CMD_NON_TARGET_DIRECTIVE" diagnostic category was added to
diagnose commands that affect the directory scope when comparable
target-specific commands exist. The use of such directives is
discouraged. This diagnostic may be controlled with the "-Wnon-
target-directive" command-line option, the "nonTargetDirective"
field in a "CMake Presets" "warnings" object, or the
"cmake_diagnostic()" command.
* The "CMD_STRICT" diagnostic category was added to control
diagnostics regarding allowed but discouraged usage as a group. This
diagnostic may be controlled with the "-Wstrict" command-line
option, the "strict" field in a "CMake Presets" "warnings" object,
or the "cmake_diagnostic()" command.
Presets
-------
* "cmake-presets(7)" files now support schema version 13.
* "cmake-presets(7)" gained the "${configurePresetName}" macro to
expand to the name of the configure preset associated with the
preset being evaluated. It is available for configure, build, test,
and package presets, but not for workflow presets.
File-Based API
--------------
* The "cmake-file-api(7)" "codemodel" version 2 "version" field has
been updated to 2.12.
* The "cmake-file-api(7)" "codemodel" version 2 "target" object gained
a new "interfaceIncludes" array field.
Instrumentation
---------------
* The "cmake-instrumentation(7)" data version has been updated to 1.2.
* "cmake-instrumentation(7)" now records an overall "cmakeBuild"
snippet even when a "cmake --build" invocation is interrupted by the
user (for example with Ctrl+C). The snippet includes a new
"interruptSignal" field, recording the signal that interrupted the
build, so that consumers can distinguish an interrupted build from
one that ran to completion.
* "cmake-instrumentation(7)" now records an overall "cmakeInstall"
snippet, marked with the same "interruptSignal" field, when a "cmake
--install" invocation is interrupted by the user.
* "cmake-instrumentation(7)" now records an overall "ctest" snippet,
marked with the same "interruptSignal" field, when a "ctest(1)"
invocation is interrupted by the user. On interrupt CTest stops
scheduling further tests and preserves its checkpoint file so that a
later "ctest -F" can resume the interrupted test set.
Generators
----------
* The Ninja Generators, Makefile Generators, and "FASTBuild" generator
now provide "install_prep/all" and "install_prep/<component>"
convenience build targets by default. The
"CMAKE_SKIP_INSTALL_PREP_TARGETS" variable may be enabled to skip
generating them. These targets build all known build dependencies
for an installation that does not select a component, or for the
named install component, respectively. This includes targets that
produce installed C++ module BMIs, module export metadata, or
generated files. See Install Preparation Targets.
* The "FASTBuild" generator and the Makefile Generators now provide
"test_prep/<test-name>" and "test_prep/all" convenience build
targets by default. The "CMAKE_SKIP_TEST_PREP_TARGETS" variable may
be enabled to skip generating them. These targets build the
dependencies of tests added by "add_test()", including those listed
with the "BUILD_DEPENDS" keyword. See Test Preparation Targets.
* The Ninja Generators now provide "test_prep/<test-name>" and
"test_prep/all" convenience build targets build targets by default.
The "CMAKE_SKIP_TEST_PREP_TARGETS" variable may be enabled to skip
generating them. These targets were previously generated only if
"CMAKE_TEST_BUILD_DEPENDS" was enabled. See Test Preparation
Targets.
* Makefile Generators and Ninja Generators gained support for adding a
linker launcher with "CUDA" and "HIP". See the
"CMAKE_<LANG>_LINKER_LAUNCHER" variable and "<LANG>_LINKER_LAUNCHER"
target property for details.
Languages
---------
* "import std" is now available for all C++ 20 and later code with
"CXX_SCAN_FOR_MODULES" enabled.
Compilers
---------
* The open-source DPC++ compiler, version 7.0 and newer, is now
supported with "compiler id" "DPClang" for languages "C" and "CXX".
Command-Line
------------
* The "cmake -E capabilities" output now includes an "instrumentation"
object reporting the supported instrumentation API version and the
latest supported data version.
* The "cmake --list-presets" option gained "*-defined" values that
list all non-hidden presets of the corresponding type and explain
why unavailable presets cannot be used. The "defined" value is an
alias for "configure-defined", while "all-defined" selects every
type. Build, test, and package presets whose configure preset is
unavailable are now considered unavailable too.
* The "cmake --build --list-presets=defined", "ctest --list-
presets=defined", and "cpack --list-presets=defined" options were
added to list all defined build, test, and package presets,
respectively.
* The "cmake --workflow --list-presets=defined" option was added to
provide the same availability information for all defined workflow
presets and their steps.
Commands
--------
* The "add_custom_rule()" command was added to allow the definition of
pattern rules.
* The "add_dependencies()" command now accepts Alias Targets.
Dependencies are added to the target the alias references.
* The "discover_tests()" command gained a "BUILD_DEPENDS" argument to
support the "--out-of-date" behavior of "ctest(1)".
* The "cmake_language(PRINT_PROPERTIES)" command was added to print
CMake entities' properties in human-readable form for debugging.
* The "cmake_language(PRINT_TARGETS)" command was added to print the
targets that currently exist in human-readable form for debugging.
* The "cmake_language(PRINT_VARIABLES)" command was added to print
variables and their values in human-readable form for debugging.
* The "file(ARCHIVE_CREATE)" command gained a "PATTERNS_EXCLUDE"
option to omit files and directories matching the given patterns
from the created archive.
* The "file(ARCHIVE_EXTRACT)" command gained a "PATTERNS_EXCLUDE"
option to omit archive entries matching the given patterns from
being extracted or listed.
* The "file(GET_RUNTIME_DEPENDENCIES)" command is now implemented on
FreeBSD.
* The "find_package()" command now supports importing Common Package
Specification *executable* components.
* The "function()" command now sets the "ARGNC" variable, which holds
the number of arguments past the last expected argument.
* The "if()" command gained a "PATH_IS_PREFIX" operator to test
whether one path is a prefix of another without accessing the
filesystem. See policy "CMP0222".
* The "if()" command gained a "RULE" operator to check if a rule
exists.
* The "install()" and "export()" commands now accept Alias Targets.
The commands operate on the underlying aliased target.
* The "install(SBOM)" and "export(SBOM)" commands were added to
generate Software Bill of Materials (SBOM) files.
* The "install(TARGETS)" command no longer requires a "LIBRARY
DESTINATION" for Module Libraries. When no destination is given, a
module library is installed to the default "RUNTIME" destination on
DLL platforms and to the default "LIBRARY" destination on other
platforms.
* The "install(TARGETS)" command gained a "RUNTIME_DEPENDENCY_TARGETS"
option to install runtime artifacts of non-imported shared libraries
from the same build that the named targets link to. Unlike
"RUNTIME_DEPENDENCIES", this uses CMake target graph information
rather than "file(GET_RUNTIME_DEPENDENCIES)". The option cannot be
used with "EXPORT" and may only install runtime artifacts.
* The "install()" command's "FILES", "PROGRAMS", "DIRECTORY",
"SCRIPT", and "CODE" signatures gained a "BUILD_DEPENDS" option to
specify targets or files needed to prepare files or run installation
code. See Install Preparation Targets.
* The "math()" command gained new "INCREMENT" and "DECREMENT" modes.
* The "project()" and "enable_language()" commands, when called in
subdirectories, now propagate support for enabled languages to all
ancestor scopes up to the top-level directory, including through
enclosing "block()" and "function()" scopes. See policy "CMP0220".
* The "set_property()" and "get_property()" commands now support RULE
properties.
* The "set_property()" and "set_target_properties()" commands now
accept Alias Targets. Properties are set on the target which the
alias references.
* The "string(JSON)" command gained an "ARRAY_SPLIT" mode that splits
a JSON array into a list of its elements with a single parse,
enabling linear-time array iteration instead of re-parsing the whole
JSON string for each element.
* The "target_compile_definitions()", "target_compile_features()",
"target_compile_options()", "target_include_directories()",
"target_link_directories()", "target_link_libraries()",
"target_link_options()", "target_precompile_headers()", and
"target_sources()" commands now accept Alias Targets. The command
operates on the target the alias references.
File Sets
---------
* Common Package Specification import by "find_package()", and export
by "install(PACKAGE_INFO)" and "export(PACKAGE_INFO)", now support
header file sets.
* The "source_group()" command gained support for file sets.
* The "FILE_SET_TYPES", "FILE_SETS_<TYPE>", and
"INTERFACE_FILE_SETS_<TYPE>" target properties were added to get
information about file sets attached to the target.
* The "LANGUAGE" file set property was added to select the compile
language for members of a "SOURCES" file set without modifying their
"LANGUAGE" source file property.
* The "SOURCE_GROUP" file set property and "SOURCE_GROUP" source file
property were added to provide a fine grain control over the
grouping of sources.
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_INSTALL_SBOM_FORMATS" variable was added to enable
Software Bill of Materials (SBOM) generation.
* The "CMAKE_TEST_BUILD_DEPENDS" variable is no longer honored. Test
preparation targets are now enabled by default. The
"CMAKE_SKIP_TEST_PREP_TARGETS" variable may be enabled to skip
generating them.
Environment Variables
---------------------
* The "CMAKE_SYSTEM_ENVIRONMENT_ID" environment variable was added to
hint to "cmake(1)" when "--fresh" may be necessary, along with
"CMAKE_SYSTEM_ENVIRONMENT_ACTION" to control what happens when
"CMAKE_SYSTEM_ENVIRONMENT_ID" changes.
Properties
----------
* The "CMAKE_COMPILE_WRAPPER_<NAME>" and "CMAKE_LINK_WRAPPER_<NAME>"
global properties were added alongside the "COMPILE_WRAPPERS",
"LINK_WRAPPERS", "INTERFACE_COMPILE_WRAPPERS", and
"INTERFACE_LINK_WRAPPERS" target properties. Together, for the
Makefile Generators and Ninja Generators, they support wrapping
compile and link commands for a given target or its consumers with
arbitrary command lines.
* The "CMAKE_TEST_BUILD_DEPENDS" directory property was added to
support directory-scoped build time dependencies for tests.
* The "Fortran_BUILDING_INTRINSIC_MODULES" target property is now
honored by the Ninja Generators. Previously it was only honored by
the Makefile Generators.
* The "Swift_MODULE_NAME" target property is now honored by the
"Xcode" generator. See policy "CMP0226".
* The "TEST_INCLUDE_FILES" and "TEST_INCLUDE_FILE" directory
properties now support "generator expressions" in the include path.
On multi-config generators a "$<CONFIG>"-parameterized path can
select a different script per configuration.
* The "XCODE_EMBED_<type>" target property now supports "generator
expressions". Because Xcode shares one copy-files build phase across
all configurations, an expression whose result depends on the
configuration is rejected with an error.
Modules
-------
* The "ExternalProject" module's "ExternalProject_Add()" command now
sets "CMAKE_INSTALL_PREFIX" to the external project's "INSTALL_DIR"
in its default configure command, so a CMake external project
installs into the prefix the module reserves for it rather than the
built-in default (e.g. "/usr/local"). A caller-supplied prefix still
takes precedence. See policy "CMP0225".
* The "FindCUDAToolkit" module now creates "CUDAToolkit::" namespace
targets and changes the existing "CUDA::" namespace targets to be
alias targets.
* The "FindDoxygen" module "doxygen_add_docs()" command gained a
"USES_TERMINAL" option to give the Doxygen command direct access to
the terminal during the build.
* The "FindPython", "FindPython2", and "FindPython3" modules gained
the possibility to override the "CMAKE_CROSSCOMPILING_EMULATOR"
variable by respectively, the variables
"Python_CROSSCOMPILING_EMULATOR", "Python2_CROSSCOMPILING_EMULATOR",
and "Python3_CROSSCOMPILING_EMULATOR".
* The "FindPython3" and "FindPython" modules gained, respectively, the
variable "Python3_SOSABI_PLATFORM" and "Python_SOSABI_PLATFORM"
which gives, on some platforms, for the Stable Application Binary
Interface, the extension including the platform triplet.
Generator Expressions
---------------------
* The "$<ARGS>" generator expression was added to convert a semicolon-
separated list into a comma-separated list.
* The "$<DIRECTORY_PROPERTY>" generator expression was added to query
directory properties.
* The "$<GLOBAL_PROPERTY>" generator expression was added to query
global properties.
* The "LIST" generator expression's "FILTER" and "TRANSFORM"
operations gained a "PREDICATE" keyword that selects items by
evaluating an arbitrary generator expression once per item, with
"$<_0>" referring to the current item. "FILTER" also gained an
explicit "REGEX" keyword.
* The "LIST" generator expression's "SORT" operation gained a
"COMPARATOR" option that orders items using an arbitrary generator
expression evaluated once per comparison, with "$<_0>" and "$<_1>"
referring to the two items being compared.
* The "LIST" generator expression's "TRANSFORM" operation gained an
"APPLY" action that evaluates an arbitrary generator expression for
each element, with "$<_0>" referring to the current element.
* The "$<LINK_LIBRARY:NEEDED_LIBRARY,...>" generator expression
feature is now supported on Linux with GNU-compatible linkers (GNU
ld, gold, LLD, MOLD).
* The "RULE_PROPERTY" generator expression was added to query
properties of rules created by the "add_custom_rule()" command.
Autogen
-------
* "AUTOMOC" now processes C++ module interface and partition units
that are members of a "FILE_SET" of type "CXX_MODULES". "moc" is run
on such units and its generated output is compiled as a module
implementation unit of the same module. This requires Qt 6.13 or
newer, whose "moc" supports C++ module units.
* "AUTOMOC" now has its generated "mocs_compilation.cpp" scanned for
C++ module dependencies under the same conditions as the target's
own sources. A header that imports a module may now be processed by
"moc".
CTest
-----
* "ctest(1)" gained a "--out-of-date" option to run only tests whose
recorded build dependencies are newer than the last time the tests
ran.
* "ctest(1)" now supports job server integration on Windows.
* The "ctest(1)" "--show-only" option gained a "json-v1-raw" format in
which the "value" for each test property is the original unparsed
string value specified in CMake.
* The "ctest_test()" and "ctest_memcheck()" commands gained the
ability to accept more than one value for their "INCLUDE_LABEL" and
"EXCLUDE_LABEL" options. When multiple regular expressions are
given, a test is selected only if each expression matches at least
one of the test's labels (i.e. the expressions form an "AND"
relationship), matching the behavior of repeating the "ctest
--label-regex" and "ctest --label-exclude" command-line options.
* The "GENERATED_RESOURCE_SPEC_FILE" test property gained support for
relative paths.
* The "FIXTURE_REPEAT_MODE" test property was added to select how a
test fixture behaves when "ctest(1)" repeats tests with its "--
repeat" option. See policy "CMP0224".
* The "RESOURCE_ERROR_ACTION" test property and
"CTEST_RESOURCE_ERROR_ACTION" variable were added to configure the
test behavior in case of insufficient resources.
CPack
-----
* The "CPack APK Generator" was added to package Android applications
as APK files. It drives the Android SDK build tools directly and
does not require Gradle. Maven dependencies, such as the AndroidX
libraries, can be downloaded with "CPACK_APK_MAVEN_DEPENDENCIES".
Deprecated and Removed Features
===============================
* The "Visual Studio 14 2015" generator has been removed.
* The "CMakePrintHelpers" module's "cmake_print_properties()" command
is now deprecated in favor of "cmake_language(PRINT_PROPERTIES)".
* The "CMakePrintHelpers" module's "cmake_print_variables()" command
is now deprecated in favor of "cmake_language(PRINT_VARIABLES)".
* The "install_files()", "install_programs()", "install_targets()",
"make_directory()", "remove()", "subdirs()" and "write_file()"
commands, which have been deprecated since CMake 3.0, now emit
deprecation diagnostics when used.
Other Changes
=============
* The "cmake --build" command now groups the output of each recipe in
a parallel build so that concurrent jobs do not interleave, when
CMake is the one passing the parallel flag to the build tool (via "
--parallel" or "CMAKE_BUILD_PARALLEL_LEVEL") and that tool is GNU
Make 4.0 or newer. Request parallelism natively, e.g. "cmake
--build . -- -j", to opt out and stream output as it is produced.
* The "cmake --install" command now reports a non-zero exit code when
an install script fails. Previously, a parallel install (enabled by
the "INSTALL_PARALLEL" global property) always reported success, and
a serial install could lose the failure of an earlier component that
exited via "cmake_language(EXIT)" when a later component succeeded.
* The "cmake_host_system_information()" command's "DISTRIB_*" queries
now read the host os-release by default. See policy "CMP0221". A
new "FROM_SYSROOT <bool>" option explicitly enables or disables
reading the target os-release from "CMAKE_SYSROOT".
* The "cmake_path(IS_PREFIX)" command and the "$<PATH:IS_PREFIX>"
generator expression no longer treat an empty path as a prefix of
every path. The "if()" command's "PATH_IS_PREFIX" operator follows
the same rule. See policy "CMP0223".
* When CTest build launchers are enabled (see the "CTestUseLaunchers"
module), a build rule that is terminated by a signal is now reported
as a build failure. Previously such a rule was reported as success,
so a crashed compiler, linker, or custom command could be recorded
as a passing build on the dashboard.
* The "ALIASED_TARGET" target property is now read-only.
* The Qt Help (".qch") rendition of the documentation now carries its
own color scheme. Previously it was rendered with layout rules
only, because the "qthelp" builder does not generate the color
scheme that the HTML documentation uses. A dark variant is shipped
alongside it, which help viewers such as Qt Creator use when their
own theme is dark.
* The precompiled macOS binary provided on "cmake.org" now requires
macOS 11 or newer for command-line tools. The "cmake-gui(1)"
application still requires macOS 12.