CMake 3.26 Release Notes — CMake 4.0.1-dirty Documentation

# CMake 3.26 Release Notes

Changes made since CMake 3.25 include the following.

## New Features

### Languages

- The `ASM_MARMASM` language was added to support the Microsoft ARM assembler language.

### Command-Line

- The `cmake -E copy` command-line tool now supports a `-t` argument.

- The `cmake -E copy_directory_if_different` command-line tool was added.

### Configure Log

- CMake now writes a YAML log of configure-time checks to `CMakeFiles/CMakeConfigureLog.yaml` under the top of the build tree. See the `cmake-configure-log(7)` manual.

### File-Based API

- The `cmake-file-api(7)` "codemodel" version 2 `version` field has been updated to 2.5.

- The `cmake-file-api(7)` "codemodel" version 2 "target" object gained a new `fileSets` field and associated `fileSetIndex` field to `sources` objects.

- The `cmake-file-api(7)` gained a new "configureLog" object kind that enables stable access to the `cmake-configure-log(7)`.

### Commands

- The `add_custom_command()` and `add_custom_target()` commands now support `generator expressions` in their `COMMENT` option.

- The `message()` command gained a `CONFIGURE_LOG` mode to record an entry in the `cmake-configure-log(7)`.

- The `string(TIMESTAMP)` and `file(TIMESTAMP)` commands now support the `%z` and `%Z` specifiers for the time zone.

- The `try_compile()` and `try_run()` commands gained a `LOG_DESCRIPTION` option specifying text to be recorded in the `cmake-configure-log(7)`.

- The `try_compile()` and `try_run()` commands gained a `NO_LOG` option to skip recording a `cmake-configure-log(7)` entry.

### Variables

- The `CMAKE_<LANG>_COMPILER_FRONTEND_VARIANT` variable is now set for `GNU`, `MSVC`, and `AppleClang` compilers that have only one frontend variant.

- A `CMAKE_VS_VERSION_BUILD_NUMBER` variable is now set by Visual Studio Generators for VS 2017 and above to report the four-component Visual Studio version number.

### Properties

- The `<LANG>_CLANG_TIDY_EXPORT_FIXES_DIR` target property was added to allow the `clang-tidy` tool to export its suggested fixes to a set of `.yaml` files. A new `CMAKE_<LANG>_CLANG_TIDY_EXPORT_FIXES_DIR` variable was created to initialize this property.

- The `XCODE_EMBED_EXTENSIONKIT_EXTENSIONS` target property was added to tell the `Xcode` generator to embed ExtensionKit-based extensions such as extensions using the Background Assets framework. Aspects of the embedding can be customized with:

  - `XCODE_EMBED_EXTENSIONKIT_EXTENSIONS_PATH`

  - `XCODE_EMBED_EXTENSIONKIT_EXTENSIONS_CODE_SIGN_ON_COPY`

  - `XCODE_EMBED_EXTENSIONKIT_EXTENSIONS_REMOVE_HEADERS_ON_COPY`

### Modules

- The `ExternalProject` module's `ExternalProject_Add()` command gained an `INSTALL_BYPRODUCTS` option to specify files generated by the `install` step.

- The `FindCUDAToolkit` module:

  - gained support for the `sbsa-linux` cross compilation target, and

  - now provides an imported target for `nvrtc_static`, if found.

- The `FindImageMagick` module now provides imported targets.

- The `FindPython3` and `FindPython` modules gained support for the Stable Application Binary Interface.

- The `UseSWIG` module gained support for the `perl5` language.

### Generator Expressions

- The `$<BUILD_LOCAL_INTERFACE:...>` generator expression was added to prevent usage requirements from being exported to dependent projects.

### CTest

- The `CTEST_NO_TESTS_ACTION` environment variable was added to provide a default value for the `--no-tests=<action>` command line argument of `ctest(1)`.

## Deprecated and Removed Features

- The `CMakeFiles/CMakeOutput.log` and `CMakeFiles/CMakeError.log` files are no longer populated by CMake's built-in modules. `cmake(1)` no longer suggests looking at them after a `CMake Error` occurs. Information previously logged to those files is instead logged to the `cmake-configure-log(7)`.

- On CYGWIN, the undocumented `CMAKE_LEGACY_CYGWIN_WIN32` mode for compatibility with CMake versions older than 2.8.4 has been removed.

## Other Changes

- Language Standard Flags, such as `-std=c++11`, when generated due to `target_compile_features()` or `CMAKE_<LANG>_STANDARD`, are now placed before flags added by `target_compile_options()`, rather than after them.

- For all `COMPILE_DEFINITIONS` properties, any leading `-D` on an item is removed whether or not it was specified by a generator expression.

- The `compile_commands.json` database enabled by `CMAKE_EXPORT_COMPILE_COMMANDS` now provides the `output` field in the compile commands objects. This allows multi-config generators, such as the `Ninja Multi-Config` generator, to provide the compile commands for all configurations.

- The `USE_FOLDERS` global property is treated as `ON` by default. See policy `CMP0143`.

- The top-level `project()` call will now emit an author warning if the documented command order in relation to `cmake_minimum_required()` is not respected.

- The `cmake --trace` option now follows `try_compile()` and `try_run()` invocations.

## Updates

Changes made since CMake 3.26.0 include the following.

### 3.26.1, 3.26.2, 3.26.3, 3.26.4, 3.26.5

- These versions made no changes to documented features or interfaces. Some implementation updates were made to support ecosystem changes and/or fix regressions.

### 3.26.6

- The `cmake-file-api(7)` "codemodel" version 2 "target" object `fileSets` field was introduced by CMake 3.26.0 with entries of its `baseDirectories` member incorrectly expressed as absolute paths even if they are inside the top-level source directory. This has been fixed. Clients must be updated to expect relative paths under the top-level source directory.