CMake 3.28.0-rc5 is ready for testing

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

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

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

Some of the more significant changes in CMake 3.28 are:

  • C++ 20 named modules are now supported by Ninja Generators and
    Visual Studio Generators for VS 2022 and newer, in combination with
    the MSVC 14.34 toolset (provided with VS 17.4) and newer, LLVM/Clang
    16.0 and newer, and GCC 14 (after the 2023-09-20 daily bump) and
    newer. See “cmake-cxxmodules(7)” for details.

  • “HIP” language code may now be compiled for NVIDIA GPUs using the
    NVIDIA CUDA Compiler (NVCC). See the “CMAKE_HIP_PLATFORM” variable.

  • On Apple platforms, “.xcframework” folders are now supported.

  • The “exec_program()” command, which has been deprecated since CMake
    3.0, has been removed by policy “CMP0153”. Use the
    “execute_process()” command instead.

  • Generated files, in targets using File Sets, are now considered
    private by default. Generated public headers must be specified
    using file sets. This allows Ninja Generators to produce more
    efficient build graphs. See policy “CMP0154”.

  • The “find_library()”, “find_path()”, and “find_file()” commands no
    longer search in installation prefixes derived from the “PATH”
    environment variable. This behavior was added in CMake 3.3 to
    support MSYS and MinGW (“MSYSTEM”) development environments on
    Windows, but it can search undesired prefixes that happen to be in
    the “PATH” for unrelated reasons. Users who keep some
    “/bin” directories in the “PATH” just for their tools do not
    necessarily want any corresponding “/lib” or
    “/include” directories searched. The behavior was reverted
    for non-Windows platforms by CMake 3.6. Now it has been reverted on
    Windows platforms too.

CMake 3.28 Release Notes


Changes made since CMake 3.27 include the following.

New Features

Languages

  • C++ 20 named modules are now supported by Ninja Generators and
    Visual Studio Generators for VS 2022 and newer, in combination with
    the MSVC 14.34 toolset (provided with VS 17.4) and newer, LLVM/Clang
    16.0 and newer, and GCC 14 (after the 2023-09-20 daily bump) and
    newer. See “cmake-cxxmodules(7)” for details.

  • “HIP” language code may now be compiled for NVIDIA GPUs using the
    NVIDIA CUDA Compiler (NVCC). See the “CMAKE_HIP_PLATFORM” variable.

Platforms

  • On Apple platforms, “.xcframework” folders are now supported:

    • The “find_library()” command now finds “.xcframework” folders.

    • The “target_link_libraries()” command now supports linking against
      a “.xcframework” folder.

    • The “IMPORTED_LOCATION” target property of an imported library
      target may now be the path to a “.xcframework” folder.

  • Apple visionOS and its “xros” and “xrsimulator” SDKs are now
    supported. Compiling for Apple visionOS can be requested by setting
    “CMAKE_SYSTEM_NAME” to “visionOS”. See Cross Compiling for iOS,
    tvOS, visionOS, or watchOS for more information.

Presets

  • “cmake-presets(7)” files now support schema version “8”. It adds
    support for a “$schema” field.

Compilers

  • Cray Clang-based compilers are now supported with “compiler id”
    “CrayClang”.

  • The OrangeC compiler is now supported with “compiler id” “OrangeC”.

Commands

  • The “add_custom_command()” and “add_custom_target()” commands gained
    a “JOB_SERVER_AWARE” option.

  • The “cmake_host_system_information()” command gained a
    “MSYSTEM_PREFIX” query for the installation prefix of a MSYS or
    MinGW development environment on Windows hosts.

  • The “set_property()” command “TEST” mode gained a “DIRECTORY” option
    to set properties on tests in other directories.

  • The “set_tests_properties()” command gained a “DIRECTORY” option to
    set properties on tests in other directories.

  • The “get_property()” command “TEST” mode gained a “DIRECTORY” option
    to get properties on tests in other directories.

  • The “get_test_property()” command gained a “DIRECTORY” option to get
    properties on tests in other directories.

Variables

  • The “CMAKE_CROSSCOMPILING_EMULATOR” environment variable was added
    to initialize the “CMAKE_CROSSCOMPILING_EMULATOR” cache variable.

  • The “CMAKE_HIP_PLATFORM” variable was added to specify the GPU
    platform for which HIP language sources are to be compiled (“amd” or
    “nvidia”).

Properties

  • On imported shared libraries, the “IMPORTED_IMPLIB” target property
    may now be used without “IMPORTED_LOCATION”. This can be used to
    represent a stub library whose location should not be added as a
    runtime search path to dependents that link it.

  • The “IMPORTED_LOCATION” property of a macOS framework may now be a
    path to the “.framework” folder itself.

  • The “XCODE_EMBED_RESOURCES” target property was added to tell the
    “Xcode” generator what targets to put in the “Embed Resources” build
    phase.

Modules

  • The “ExternalProject” module now includes the
    “BUILD_JOB_SERVER_AWARE” option for the “ExternalProject_Add()”
    command. This option enables the integration of the GNU Make job
    server when using an explicit “BUILD_COMMAND” with certain Makefile
    Generators. Additionally, the “ExternalProject_Add_Step()” command
    has been updated to support the new “JOB_SERVER_AWARE” option.

  • The “ExternalProject” module now declares “BYPRODUCTS” for the
    downloaded file for generated “download” steps. Previously, if
    multiple external projects downloaded to the same file, hash
    verification could fail. Now, when using the Ninja Generators, this
    scenario is detected and Ninja will raise an error stating that
    multiple rules generate the same file.

  • The “FetchContent” module’s “FetchContent_Declare()” command gained
    an “EXCLUDE_FROM_ALL” option, which propagates through to the
    “add_subdirectory()” call made by “FetchContent_MakeAvailable()” for
    the dependency.

  • The “FindCURL” module gained a “CURL_USE_STATIC_LIBS” hint to select
    static libraries.

  • The “FindEXPAT” module gained an “EXPAT_USE_STATIC_LIBS” hint to
    select static libraries.

  • The “FindPkgConfig” module “pkg_get_variable()” command gained a
    “DEFINE_VARIABLES” option to pass variables to “pkg-config”.

Generator Expressions

  • The “generator expressions” $<IF:...>, $<AND:...>, and
    $<OR:...> short-circuit to avoid unnecessary evaluation of
    parameters.

CTest

  • CTest may now take a dynamically-generated resource spec file, which
    can be specified by the “GENERATED_RESOURCE_SPEC_FILE” test
    property.

Deprecated and Removed Features

  • The “exec_program()” command, which has been deprecated since CMake
    3.0, has been removed by policy “CMP0153”. Use the
    “execute_process()” command instead.

  • The “Visual Studio 11 2012” generator has been removed.

  • The “Visual Studio 12 2013” generator is now deprecated and will be
    removed in a future version of CMake.

  • The “IOS_INSTALL_COMBINED” target property and corresponding
    “CMAKE_IOS_INSTALL_COMBINED” variable have been deprecated. Their
    functionality does not make sense on Apple Silicon hosts.

  • The “Xcode” generator will now issue a fatal error if the Legacy
    Build System has been selected for Xcode 14 and newer. Those Xcode
    versions dropped support for the Legacy Build System and expect the
    project to be set-up for their current Build System.

Other Changes

  • Generated files, in targets using File Sets, are now considered
    private by default. Generated public headers must be specified
    using file sets. This allows Ninja Generators to produce more
    efficient build graphs. See policy “CMP0154”.

  • The “find_library()”, “find_path()”, and “find_file()” commands no
    longer search in installation prefixes derived from the “PATH”
    environment variable. This behavior was added in CMake 3.3 to
    support MSYS and MinGW (“MSYSTEM”) development environments on
    Windows, but it can search undesired prefixes that happen to be in
    the “PATH” for unrelated reasons. Users who keep some
    “/bin” directories in the “PATH” just for their tools do not
    necessarily want any corresponding “/lib” or
    “/include” directories searched. The behavior was reverted
    for non-Windows platforms by CMake 3.6. Now it has been reverted on
    Windows platforms too.

    One may set the “CMAKE_PREFIX_PATH” environment variable with a
    semicolon-separated list of prefixes that are to be searched.

  • When using MinGW tools in a “MSYSTEM” environment on Windows, the
    “$MSYSTEM_PREFIX/local” and “$MSYSTEM_PREFIX” prefixes are now added
    to “CMAKE_SYSTEM_PREFIX_PATH”.

  • The precompiled Linux “x86_64” binaries provided on cmake.org now
    require GLIBC 2.17 or higher.


Changes made since CMake 3.28.0-rc4:

Brad King (9):

  • Tests: Avoid compiling call to dap::optional<dap::string>(nullptr)
  • cmList: Avoid using operator-> on input iterator
  • cmCTestBuildCommand: Avoid requiring complete cmGlobalGenerator type publicly
  • cmGlobalGeneratorFactory: Provide complete cmGlobalGenerator to deleter
  • cmCommonTargetGenerator: Factor out GetLinkedTargetDirectories loop body
  • cmComputeLinkInformation: Track targets named by TARGET_OBJECTS sources
  • cmComputeLinkInformation: Simplify recording OBJECT libraries as link items
  • cmCommonTargetGenerator: Drop unused local variable
  • CMake 3.28.0-rc5

Christoph Reiter (1):

  • FindOpenMP: Add support for openmp 5.1 (llvm 17) and 5.2

Kyle Edwards (1):

  • Xcode: Fix linking against .xcframework from static libraries

Martin Duffy (1):

  • cmGeneratorExpressionNode: Fix short-circuit logic

Robert Maynard (1):

  • FindCUDAToolkit: Search for cufile library name being lowercase
1 Like

A post was split to a new topic: CMake 3.28.0-rc5: xros is not an visionOS SDK

Visual Studio 2022 Preview supports an external CMake executable now.
I have project using CMake/Ninja (multiconfig) and C++20 modules. The project compiles with the built-in CMake 3.27 if I am compiling with VS2022 preview but fails if I use an extarnal CMake 3.28-RC3. The project also compiles if I use the Visual Studio 17 2022 generator.
If I use VSCode with the C++ extensions, the compilation also fails. It seems Ninja is failing to find the Windows SDK headers. I decided to wait for the final CMake 3.28 release before I try again. Could it be an regression with CMake 3.28 or is it a fault of the Visual Studios’ CMake integration?