# CMake 3.29 Release Notes

Changes made since CMake 3.28 include the following.

## New Features

### Command-Line

- `cmake(1)` `-E cat` can now print the standard input by passing the `-` argument.

### Generators

- Visual Studio Generators now support selecting between the Intel oneAPI Fortran compiler (`ifx`) and the Intel classic Fortran compiler (`ifort`) using a `fortran=` field in `CMAKE_GENERATOR_TOOLSET`.

### File-Based API

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

- The `cmake-file-api(7)` "codemodel" version 2 "target" object gained a new "launchers" field.

### Compilers

- The LLVM/Clang GNU-like frontend on Windows (`clang++`) may now be used to compile `CUDA` language sources.

- Compilers targeting the GNU ABI on Windows (MinGW) may now be used to compile Objective C (`OBJC`) and Objective C++ (`OBJCXX`). These include GNU compilers (`gcc` and `g++`) and the LLVM/Clang GNU-like frontends (`clang` and `clang++`).

- TI Clang-based compilers are now supported with `compiler id` `TIClang`.

### Commands

- The add_custom_command(TARGET) signature now supports adding build events through Alias Targets.

- The `cmake_language(EXIT)` sub-command was added to terminate `cmake -P` scripts with a specified exit code.

- The `export(SETUP)` sub-command was added to configure export sets. Its `TARGET` option's `XCFRAMEWORK_LOCATION` setting specifies the location of a `.xcframework` that can be substituted for an installed target.

- The `if()` command gained new tests `IS_READABLE`, `IS_WRITABLE` and `IS_EXECUTABLE` to check file or directory permissions.

### Variables

- The `CMAKE_INSTALL_PREFIX` environment variable was added to provide a default value for the `CMAKE_INSTALL_PREFIX` variable.

- The `CMAKE_LINKER_TYPE` variable and corresponding `LINKER_TYPE` target property were added to specify what linker to use with some toolchains.

- The `CMAKE_<LANG>_COMPILER_LINKER`, `CMAKE_<LANG>_COMPILER_LINKER_ID`, `CMAKE_<LANG>_COMPILER_LINKER_VERSION` and `CMAKE_<LANG>_COMPILER_LINKER_FRONTEND_VARIANT` variables were added to describe the linker used by the language's link step.

- The `CMAKE_PROJECT_INCLUDE`, `CMAKE_PROJECT_INCLUDE_BEFORE`, `CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE`, and `CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE_BEFORE` variables learned to support a semicolon-separated list of CMake language files to be included sequentially. These variables can also reference module names to be found in `CMAKE_MODULE_PATH` or builtin to CMake.

- The `CMAKE_SKIP_TEST_ALL_DEPENDENCY` variable was added to control whether the `test` (or `RUN_TESTS`) buildsystem target depends on the `all` (or `ALL_BUILD`) target.

- A `CMAKE_TEST_LAUNCHER` variable and corresponding `TEST_LAUNCHER` target property were added to specify a launcher to be used by executable targets when invoked by tests added by the `add_test()` command.

### Properties

- The `CROSSCOMPILING_EMULATOR` target property now supports `generator expressions`.

- The `UNITY_BUILD` target property now supports the Objective C (`OBJC`) and Objective C++ (`OBJCXX`) languages.

- The `XCODE_EMBED_XPC_SERVICES` target property was added to tell the `Xcode` generator what targets to put in the `Embed XPC Resources` build phase.

### Modules

- The `CMakePackageConfigHelpers` module gained new `generate_apple_platform_selection_file()` and `generate_apple_architecture_selection_file()` functions, which can be used to generate a file that includes another Apple-platform-specific file or the includes an architecture-specific implementation of a package for an Apple platform, respectively.

- The `FindOpenGL` module learned to find a GLU include directory different than the GL include directory. A new `OPENGL_INCLUDE_DIRS` result variable provides all include directories.

### CTest

- `ctest(1)` gained a `--http-header` option to add custom headers on submission to CDash.

- `ctest(1)` gained the `--tests-from-file` and `--exclude-from-file` options to run or exclude tests named in a file.

- `ctest(1)` now supports job server integration on POSIX systems.

- The `ctest -j` option may now be given without a value to let ctest choose a default level of parallelism, or with `0` to let ctest use unbounded parallelism. The corresponding `CTEST_PARALLEL_LEVEL` environment variable, if set to the empty string, is now equivalent to passing `-j` with no value.

- The `ctest_test()` command gained options `INCLUDE_FROM_FILE` and `EXCLUDE_FROM_FILE` to run or exclude tests named in a file.

### CPack

- The `CPack DEB Generator` `CPACK_DEBIAN_FILE_NAME` variable may now be set without any suffix, and the `.deb` suffix will be added automatically.

- The `CPack RPM Generator` `CPACK_RPM_FILE_NAME` variable may now be set without any suffix, and the `.rpm` suffix will be added automatically.

- The `CPack WIX Generator` gained a new variable, `CPACK_WIX_INSTALL_SCOPE`, to control the `InstallScope` property of WiX MSI installers.

## Other Changes

- CMake learned to de-duplicate libraries on link lines based on linker capabilities. See policy `CMP0156`.

- The `add_test()` command now honors `CMAKE_CROSSCOMPILING_EMULATOR` only when cross-compiling. See policy `CMP0158`.

- On Windows, when targeting the MSVC ABI, the `find_library()` command now accepts `.a` file names after first considering `.lib`. This is symmetric with existing behavior when targeting the GNU ABI, in which the command accepts `.lib` file names after first considering `.a`.

- On Windows, when targeting the MSVC ABI, the `find_library()` command now considers `.dll.lib` file names before `.lib`. This is the default suffix for DLL import libraries created by Rust toolchains for the MSVC ABI.

- The `Ninja` and `NMake Makefiles` generators now use the `-external:I` flag for system includes when using IntelLLVM as of version 2021.4. The `-external:W0` flag is also used as of version 2022.2.

- The `create_test_sourcelist()` command now provides a full path to the generated driver source file.

- The `CPACK_PRODUCTBUILD_DOMAINS` variable now defaults to true. See policy `CMP0161`.

- The `CPack WIX Generator` now produces WiX MSI installers that create start menu and uninstall entries for all users by default, as documented by the `CPACK_WIX_INSTALL_SCOPE` variable `perMachine` value. Previously, without a custom WiX template, it produced installers that would only create start menu and uninstall entries for the current user, even though they install for all users.