CMake 3.29.0-rc4 is ready for testing

I am proud to announce the fourth CMake 3.29 release candidate.
https://cmake.org/download/

Documentation is available at:
https://cmake.org/cmake/help/v3.29

Release notes appear below and are also published at
https://cmake.org/cmake/help/v3.29/release/3.29.html

Release milestone is available at:
release milestone

Some of the more significant changes in CMake 3.29 are:

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

  • TI Clang-based compilers are now supported with compiler id
    “TIClang”.

  • 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 “CMAKE_LINKER_TYPE” variable and corresponding “LINKER_TYPE”
    target property were added to specify what linker to use with some
    toolchains.

  • 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.

  • 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.
    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.


Changes made since CMake 3.29.0-rc3:

Adrian Pop (1):

  • GET_RUNTIME_DEPENDENCIES: Allow more whitespace before objdump’s “DLL Name:”

Alexander Neumann (1):

  • ASM_MARMASM: Remove broken partial support for preprocessor defines

Ben Boeckel (1):

  • Tests/CXXModules: add a test using TARGET_OBJECTS from modules

Brad King (20):

  • Tests: Generalize ctest tests-from-file test cases
  • ctest: Exit with failure when tests-from-file input is missing
  • Tests: Make ctest tests-from-file expected output more precise
  • ctest: Honor tests-from-file options with empty input
  • ctest: Remove unnecessary and ambiguous tests-from-file comment syntax
  • Help: Improve ctest tests-from-file documentation wording and wrapping
  • Tests: Convert CTestTestSerialOrder to RunCMake.ctest_test case
  • Tests: Convert CTestTestSkipReturnCode to RunCMake.ctest_test case
  • Tests: Remove unnecessary parallel suppression from CTestCoverageCollectGCOV
  • cmCTestMultiProcessHandler: Modernize member initialization
  • ctest: Allow passing -j without value to choose a contextual default
  • install(EXPORT): Drop REQUIRED from exported find_dependency calls
  • Tests: Update RunCMake.CompileFeatures for Xcode 15.3
  • Tests: Update RunCMake.CheckCompilerFlag for Xcode 15.3
  • gitlab-ci: update macOS jobs to use Xcode 15.3
  • LinkerId: Update detection of linker tool for Xcode 15.3
  • EXPORT_PACKAGE_DEPENDENCIES: Add experimental feature gate
  • Autogen: Restore target-ordering dependencies in Makefiles with DEPFILE
  • cmQtAutoGenInitializer: De-duplicate autogen/timestamp target depend logic
  • CMake 3.29.0-rc4

Charlie Savage (2):

  • FindRuby: Add support for 3.3
  • FindRuby: Fix finding Ruby 3.1+ on Windows

Craig Scott (1):

  • FetchContent: Don’t leak temporary variable and restore var robustly

Marc Chevrier (4):

  • LINKER_TYPE: Document that linker tool should be in the PATH
  • LINKER_TYPE: fix spelling error in message
  • LINKER_TYPE: Support MOLD only on GCC versions that support it
  • Apple Text Based Stubs: should be usage in subdirectories

scivision (1):

  • Help: Convert http URLs to https