| CMake 4.5 Release Notes |
| *********************** |
| |
| .. only:: html |
| |
| .. contents:: |
| |
| Changes made since CMake 4.4 include the following. |
| |
| New Features |
| ============ |
| |
| Diagnostics |
| ----------- |
| |
| * The :diagnostic:`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 |
| :option:`-Wnon-target-directive <cmake -W>` command-line option, |
| the ``nonTargetDirective`` field in a |
| :manual:`CMake Presets <cmake-presets(7)>` |
| :preset:`configurePresets.warnings` object, |
| or the :command:`cmake_diagnostic` command. |
| |
| * The :diagnostic:`CMD_STRICT` diagnostic category was added to control |
| diagnostics regarding allowed but discouraged usage as a group. |
| This diagnostic may be controlled with the :option:`-Wstrict <cmake -W>` |
| command-line option, the ``strict`` field in a |
| :manual:`CMake Presets <cmake-presets(7)>` |
| :preset:`configurePresets.warnings` object, |
| or the :command:`cmake_diagnostic` command. |
| |
| Presets |
| ------- |
| |
| * :manual:`cmake-presets(7)` files now support schema version 13. |
| |
| * :manual:`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 :manual:`cmake-file-api(7)` "codemodel" version 2 ``version`` field has |
| been updated to 2.12. |
| |
| * The :manual:`cmake-file-api(7)` "codemodel" version 2 "target" object gained |
| a new ``interfaceIncludes`` array field. |
| |
| Instrumentation |
| --------------- |
| |
| * The :manual:`cmake-instrumentation(7)` data version has been updated to 1.2. |
| |
| * :manual:`cmake-instrumentation(7)` now records an overall ``cmakeBuild`` |
| snippet even when a :option:`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. |
| |
| * :manual:`cmake-instrumentation(7)` now records an overall ``cmakeInstall`` |
| snippet, marked with the same ``interruptSignal`` field, when a |
| :option:`cmake --install` invocation is interrupted by the user. |
| |
| * :manual:`cmake-instrumentation(7)` now records an overall ``ctest`` snippet, |
| marked with the same ``interruptSignal`` field, when a :manual:`ctest(1)` |
| invocation is interrupted by the user. On interrupt CTest stops scheduling |
| further tests and preserves its checkpoint file so that a later |
| :option:`ctest -F` can resume the interrupted test set. |
| |
| Generators |
| ---------- |
| |
| * The :ref:`Ninja Generators`, :ref:`Makefile Generators`, and |
| :generator:`FASTBuild` generator now provide ``install_prep/all`` and |
| ``install_prep/<component>`` convenience build targets by default. The |
| :variable:`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 |
| :ref:`Install Preparation Targets`. |
| |
| * The :generator:`FASTBuild` generator and the :ref:`Makefile Generators` |
| now generate ``test_prep/<test-name>`` and ``test_prep/all`` convenience |
| build targets when the :variable:`CMAKE_TEST_BUILD_DEPENDS` variable is |
| enabled, matching the behavior of the :ref:`Ninja Generators`. These |
| targets build the dependencies of tests added by :command:`add_test`, |
| including those listed with the ``BUILD_DEPENDS`` keyword. |
| |
| * :ref:`Makefile Generators` and :ref:`Ninja Generators` gained support |
| for adding a linker launcher with ``CUDA`` and ``HIP``. |
| See the :variable:`CMAKE_<LANG>_LINKER_LAUNCHER` variable |
| and :prop_tgt:`<LANG>_LINKER_LAUNCHER` target property for details. |
| |
| Languages |
| --------- |
| |
| * ``import std`` is now available for all C++ 20 and later code with |
| :prop_tgt:`CXX_SCAN_FOR_MODULES` enabled. |
| |
| Compilers |
| --------- |
| |
| * The `open-source DPC++ compiler`_, version 7.0 and newer, is now supported |
| with :variable:`compiler id <CMAKE_<LANG>_COMPILER_ID>` ``DPClang`` for |
| languages ``C`` and ``CXX``. |
| |
| .. _`open-source DPC++ compiler`: https://github.com/intel/llvm |
| |
| Command-Line |
| ------------ |
| |
| * The :option:`cmake -E capabilities <cmake-E capabilities>` output now includes |
| an ``instrumentation`` object reporting the supported instrumentation API |
| version and the latest supported data version. |
| |
| * The :option:`cmake --list-presets <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 :option:`cmake --build --list-presets=defined |
| <cmake--build --list-presets>`, |
| :option:`ctest --list-presets=defined <ctest --list-presets>`, and |
| :option:`cpack --list-presets=defined <cpack --list-presets>` options were |
| added to list all defined build, test, and package presets, respectively. |
| |
| * The :option:`cmake --workflow --list-presets=defined |
| <cmake--workflow --list-presets>` option was added to provide the same |
| availability information for all defined workflow presets and their steps. |
| |
| Commands |
| -------- |
| |
| * The :command:`add_custom_rule` command was added to allow the definition of |
| pattern rules. |
| |
| * The :command:`add_dependencies` command now accepts :ref:`Alias Targets`. |
| Dependencies are added to the target the alias references. |
| |
| * The :command:`discover_tests` command gained a ``BUILD_DEPENDS`` argument to |
| support the :ctest-option:`--out-of-date` behavior of :manual:`ctest(1)`. |
| |
| * The :command:`cmake_language(PRINT_PROPERTIES)` command was added |
| to print CMake entities' properties in human-readable form for |
| debugging. |
| |
| * The :command:`cmake_language(PRINT_TARGETS)` command was added |
| to print the targets that currently exist in human-readable form |
| for debugging. |
| |
| * The :command:`cmake_language(PRINT_VARIABLES)` command was added |
| to print variables and their values in human-readable form for |
| debugging. |
| |
| * The :command:`file(ARCHIVE_CREATE)` command gained a ``PATTERNS_EXCLUDE`` |
| option to omit files and directories matching the given patterns from the |
| created archive. |
| |
| * The :command:`file(ARCHIVE_EXTRACT)` command gained a ``PATTERNS_EXCLUDE`` |
| option to omit archive entries matching the given patterns from being |
| extracted or listed. |
| |
| * The :command:`file(GET_RUNTIME_DEPENDENCIES)` command is now implemented |
| on FreeBSD. |
| |
| * The :command:`find_package` command now supports importing |CPS|_ |
| `executable` components. |
| |
| * The :command:`function` command now sets the ``ARGNC`` variable, which |
| holds the number of arguments past the last expected argument. |
| |
| * The :command:`if` command gained a ``PATH_IS_PREFIX`` operator to test |
| whether one path is a prefix of another without accessing the filesystem. |
| See policy :policy:`CMP0222`. |
| |
| * The :command:`if` command gained a ``RULE`` operator to check if a rule |
| exists. |
| |
| * The :command:`install` and :command:`export` commands now accept |
| :ref:`Alias Targets`. The commands operate on the underlying |
| aliased target. |
| |
| * The :command:`install(SBOM)` and :command:`export(SBOM)` commands were |
| added to generate Software Bill of Materials (SBOM) files. |
| |
| * The :command:`install(TARGETS)` command no longer requires a |
| ``LIBRARY DESTINATION`` for :ref:`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 :command:`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 :command:`file(GET_RUNTIME_DEPENDENCIES)`. |
| The option cannot be used with ``EXPORT`` and may only install runtime |
| artifacts. |
| |
| * The :command:`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 :ref:`Install Preparation Targets`. |
| |
| * The :command:`math` command gained new ``INCREMENT`` and ``DECREMENT`` modes. |
| |
| * The :command:`project` and :command:`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 :command:`block` and :command:`function` scopes. |
| See policy :policy:`CMP0220`. |
| |
| * The :command:`set_property` and :command:`get_property` commands now |
| support :ref:`RULE properties <Rule Properties>`. |
| |
| * The :command:`set_property` and :command:`set_target_properties` commands |
| now accept :ref:`Alias Targets`. Properties are set on the target which |
| the alias references. |
| |
| * The :command:`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 :command:`target_compile_definitions`, :command:`target_compile_features`, |
| :command:`target_compile_options`, :command:`target_include_directories`, |
| :command:`target_link_directories`, :command:`target_link_libraries`, |
| :command:`target_link_options`, :command:`target_precompile_headers`, |
| and :command:`target_sources` commands now accept :ref:`Alias Targets`. |
| The command operates on the target the alias references. |
| |
| File Sets |
| --------- |
| |
| * |CPS|_ import by :command:`find_package`, and export by |
| :command:`install(PACKAGE_INFO)` and :command:`export(PACKAGE_INFO)`, |
| now support header file sets. |
| |
| * The :command:`source_group` command gained support for file sets. |
| |
| * The :prop_tgt:`FILE_SET_TYPES`, :prop_tgt:`FILE_SETS_<TYPE>`, and |
| :prop_tgt:`INTERFACE_FILE_SETS_<TYPE>` target properties were added to get |
| information about file sets attached to the target. |
| |
| * The :prop_fs:`LANGUAGE` file set property was added to select the compile |
| language for members of a ``SOURCES`` file set without modifying their |
| :prop_sf:`LANGUAGE` source file property. |
| |
| * The :prop_fs:`SOURCE_GROUP` file set property and :prop_sf:`SOURCE_GROUP` |
| source file property were added to provide a fine grain control over the |
| grouping of sources. |
| |
| Variables |
| --------- |
| |
| * The :variable:`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 :variable:`CMAKE_INSTALL_SBOM_FORMATS` variable was added |
| to enable Software Bill of Materials (SBOM) generation. |
| |
| Environment Variables |
| --------------------- |
| |
| * The :envvar:`CMAKE_SYSTEM_ENVIRONMENT_ID` environment variable was added to |
| hint to :manual:`cmake(1)` when :cmake-option:`--fresh` may be necessary, |
| along with :envvar:`CMAKE_SYSTEM_ENVIRONMENT_ACTION` to control what happens |
| when :envvar:`CMAKE_SYSTEM_ENVIRONMENT_ID` changes. |
| |
| Properties |
| ---------- |
| |
| * The :prop_gbl:`CMAKE_COMPILE_WRAPPER_<NAME>` and |
| :prop_gbl:`CMAKE_LINK_WRAPPER_<NAME>` global properties were added alongside |
| the :prop_tgt:`COMPILE_WRAPPERS`, :prop_tgt:`LINK_WRAPPERS`, |
| :prop_tgt:`INTERFACE_COMPILE_WRAPPERS`, and |
| :prop_tgt:`INTERFACE_LINK_WRAPPERS` target properties. Together, for the |
| :ref:`Makefile Generators` and :ref:`Ninja Generators`, they support |
| wrapping compile and link commands for a given target or its consumers |
| with arbitrary command lines. |
| |
| * The :prop_dir:`CMAKE_TEST_BUILD_DEPENDS` directory property was added to |
| support directory-scoped build time dependencies for tests. |
| |
| * The :prop_tgt:`Fortran_BUILDING_INTRINSIC_MODULES` target property is now |
| honored by the :ref:`Ninja Generators`. Previously it was only honored |
| by the :ref:`Makefile Generators`. |
| |
| * The :prop_tgt:`Swift_MODULE_NAME` target property is now honored by the |
| :generator:`Xcode` generator. See policy :policy:`CMP0226`. |
| |
| * The :prop_dir:`TEST_INCLUDE_FILES` and :prop_dir:`TEST_INCLUDE_FILE` |
| directory properties now support :manual:`generator expressions |
| <cmake-generator-expressions(7)>` in the include path. On multi-config |
| generators a ``$<CONFIG>``-parameterized path can select a different script |
| per configuration. |
| |
| * The :prop_tgt:`XCODE_EMBED_<type>` target property now supports |
| :manual:`generator expressions <cmake-generator-expressions(7)>`. |
| 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 :module:`ExternalProject` module's :command:`ExternalProject_Add` |
| command now sets :variable:`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 :policy:`CMP0225`. |
| |
| * The :module:`FindCUDAToolkit` module now creates ``CUDAToolkit::`` |
| namespace targets and changes the existing ``CUDA::`` namespace targets |
| to be alias targets. |
| |
| * The :module:`FindDoxygen` module :command:`doxygen_add_docs` command |
| gained a ``USES_TERMINAL`` option to give the Doxygen command direct |
| access to the terminal during the build. |
| |
| * The :module:`FindPython`, :module:`FindPython2`, and :module:`FindPython3` |
| modules gained the possibility to override the |
| :variable:`CMAKE_CROSSCOMPILING_EMULATOR` variable by respectively, the |
| variables ``Python_CROSSCOMPILING_EMULATOR``, |
| ``Python2_CROSSCOMPILING_EMULATOR``, and ``Python3_CROSSCOMPILING_EMULATOR``. |
| |
| * The :module:`FindPython3` and :module:`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 :genex:`$<ARGS>` generator expression was added to convert a |
| :ref:`semicolon-separated list <CMake Language Lists>` into a comma-separated |
| list. |
| |
| * The :genex:`$<DIRECTORY_PROPERTY>` generator expression was added to query |
| directory properties. |
| |
| * The :genex:`$<GLOBAL_PROPERTY>` generator expression was added to query |
| global properties. |
| |
| * The :genex:`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 :genex:`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 :genex:`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 :genex:`$<LINK_LIBRARY:NEEDED_LIBRARY,...>` generator expression feature |
| is now supported on Linux with GNU-compatible linkers (GNU ld, gold, LLD, |
| MOLD). |
| |
| * The :genex:`RULE_PROPERTY` generator expression was added to query |
| properties of rules created by the :command:`add_custom_rule` command. |
| |
| Autogen |
| ------- |
| |
| * :prop_tgt:`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. |
| |
| * :prop_tgt:`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 |
| ----- |
| |
| * :manual:`ctest(1)` gained a :ctest-option:`--out-of-date` option to run |
| only tests whose recorded build dependencies are newer than the last time |
| the tests ran. |
| |
| * :manual:`ctest(1)` now supports :ref:`job server integration |
| <ctest-job-server-integration>` on Windows. |
| |
| * The :manual:`ctest(1)` :ctest-option:`--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 :command:`ctest_test` and :command:`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 :option:`ctest --label-regex` and |
| :option:`ctest --label-exclude` command-line options. |
| |
| * The :prop_test:`GENERATED_RESOURCE_SPEC_FILE` test property gained support |
| for relative paths. |
| |
| * The :prop_test:`FIXTURE_REPEAT_MODE` test property was added to select how |
| a test fixture behaves when :manual:`ctest(1)` repeats tests with its |
| :ctest-option:`--repeat` option. See policy :policy:`CMP0224`. |
| |
| * The :prop_test:`RESOURCE_ERROR_ACTION` test property and |
| :variable:`CTEST_RESOURCE_ERROR_ACTION` variable were added to |
| configure the test behavior in case of insufficient resources. |
| |
| CPack |
| ----- |
| |
| * The :cpack_gen:`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 |
| :variable:`CPACK_APK_MAVEN_DEPENDENCIES`. |
| |
| Deprecated and Removed Features |
| =============================== |
| |
| * The :generator:`Visual Studio 14 2015` generator has been removed. |
| |
| * The :module:`CMakePrintHelpers` module's :command:`cmake_print_properties` |
| command is now deprecated in favor of |
| :command:`cmake_language(PRINT_PROPERTIES)`. |
| |
| * The :module:`CMakePrintHelpers` module's :command:`cmake_print_variables` |
| command is now deprecated in favor of |
| :command:`cmake_language(PRINT_VARIABLES)`. |
| |
| * The :command:`install_files`, :command:`install_programs`, |
| :command:`install_targets`, :command:`make_directory`, :command:`remove`, |
| :command:`subdirs` and :command:`write_file` commands, which have been |
| deprecated since CMake 3.0, now emit deprecation diagnostics when used. |
| |
| Other Changes |
| ============= |
| |
| * The :option:`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 :option:`--parallel |
| <cmake--build --parallel>` or :envvar:`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 :option:`cmake --install` command now reports a non-zero exit code |
| when an install script fails. Previously, a parallel install (enabled by |
| the :prop_gbl:`INSTALL_PARALLEL` global property) always reported success, |
| and a serial install could lose the failure of an earlier component that |
| exited via :command:`cmake_language(EXIT) <cmake_language>` when a later |
| component succeeded. |
| |
| * The :command:`cmake_host_system_information` command's ``DISTRIB_*`` queries |
| now read the host os-release by default. See policy :policy:`CMP0221`. |
| A new ``FROM_SYSROOT <bool>`` option explicitly enables or disables reading |
| the target os-release from :variable:`CMAKE_SYSROOT`. |
| |
| * The :command:`cmake_path(IS_PREFIX)` command and the |
| :genex:`$<PATH:IS_PREFIX>` generator expression no longer treat |
| an empty path as a prefix of every path. The :command:`if` command's |
| ``PATH_IS_PREFIX`` operator follows the same rule. |
| See policy :policy:`CMP0223`. |
| |
| * When CTest build launchers are enabled (see the :module:`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 :prop_tgt:`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 :manual:`cmake-gui(1)` |
| application still requires macOS 12. |
| |
| .. _CPS: https://cps-org.github.io/cps/ |
| .. |CPS| replace:: Common Package Specification |