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.