# CMake 4.5.0-rc1 is ready for testing

**URL:** https://discourse.cmake.org/t/cmake-4-5-0-rc1-is-ready-for-testing/15877
**Category:** Announcements
**Created:** [October 16, 2026, 3:52pm UTC](https://discourse.cmake.org/t/cmake-4-5-0-rc1-is-ready-for-testing/15877 "2026-10-16T15:52:33Z")
**Posts on this page:** 1
**Page:** 1

<div class="post-metadata">

### Author: ![johnwparent](https://discourse.cmake.org/user_avatar/discourse.cmake.org/johnwparent/32/2179_2.png) [@johnwparent](https://discourse.cmake.org/u/johnwparent)
#### Post date: [October 16, 2026, 3:52pm UTC](https://discourse.cmake.org/t/cmake-4-5-0-rc1-is-ready-for-testing/15877/1 "2026-10-16T15:52:33Z")

</div>

I am proud to announce the first CMake 4.5 release candidate.  
[https://cmake.org/download/](https://cmake.org/download/)

Documentation is available at:  
[https://cmake.org/cmake/help/v4.5](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](https://cmake.org/cmake/help/v4.5/release/4.5.html)

Release milestone is available at:  
[release milestone](https://gitlab.kitware.com/cmake/cmake/-/milestones/206)

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](http://cmake.org)” now requires  
macOS 11 or newer for command-line tools. The “cmake-gui(1)”  
application still requires macOS 12.
