CMake 4.5.0-rc1 is ready for testing

October 15, 2026

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.

Leave a Reply