CMake 4.1.0-rc1 is ready for testing

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

Documentation is available at:
https://cmake.org/cmake/help/v4.1

Release notes appear below and are also published at
https://cmake.org/cmake/help/v4.1/release/4.1.html

Release milestone is available at:
release milestone

Some of the most significant changes in CMake 4.1 are:

  • The “cmake-configure-log(7)” now reports events from
    “find_package()” (in “CONFIG” mode), “find_path()”, “find_file()”,
    “find_library()”, and “find_program()” commands when first invoked,
    when their results transition between “not found” and “found”, or
    when enabled explicitly by the “–debug-find” command-line option.

  • The “cmake_pkg_config()” command now supports the “IMPORT” and
    “POPULATE” subcommands for interfacing CMake targets with pkg-config
    based dependencies.

  • The “CMAKE_FIND_REQUIRED” variable was added to tell
    “find_package()”, “find_path()”, “find_file()”, “find_library()”,
    and “find_program()” to be “REQUIRED” by default. The commands also
    gained an “OPTIONAL” keyword to ignore the variable for a specific
    call.

  • The “FindBLAS” and “FindLAPACK” modules now support the NVIDIA
    Performance Libraries (NVPL).

  • The “string(REGEX MATCHALL)”, “string(REGEX REPLACE)”, and
    “list(TRANSFORM REPLACE)” commands now match the regular expression
    “^” anchor at most once in repeated searches, at the start of the
    input. See policy “CMP0186”.

  • The “TARGET_PROPERTY” generator expression now evaluates the
    “LINK_LIBRARIES” and “INTERFACE_LINK_LIBRARIES” target properties
    transitively. See policy “CMP0189”.
    CMake 4.1 Release Notes


Changes made since CMake 4.0 include the following.

New Features

File-Based API

  • The “cmake-file-api(7)” v1 now writes partial replies when
    buildsystem generation fails with an error. See the v1 Reply Error
    Index.

Generators

  • Makefile Generators and Ninja Generators gained support for adding a
    linker launcher with “Fortran”, “CUDA”, and “HIP”. See the
    “CMAKE_<LANG>_LINKER_LAUNCHER” variable and “<LANG>_LINKER_LAUNCHER”
    target property for details.

Command-Line

  • The cmake --build command-line tool, when used with the “Xcode”
    generator, now detects when a third-party tool has wrapped the
    generated “.xcodeproj” in a “.xcworkspace”, and drives the build
    through the workspace instead.

Configure Log

  • The “cmake-configure-log(7)” now reports events from
    “find_package()” (in “CONFIG” mode), “find_path()”, “find_file()”,
    “find_library()”, and “find_program()” commands when first invoked,
    when their results transition between “not found” and “found”, or
    when enabled explicitly by the “–debug-find” command-line option.
    See Event Kind find and Event Kind find_package. Logging may also
    be controlled by the “CMAKE_FIND_DEBUG_MODE” and
    “CMAKE_FIND_DEBUG_MODE_NO_IMPLICIT_CONFIGURE_LOG” variables.

Compilers

  • Diab compilers from Wind River Systems, versions 5.9.x+, are now
    supported with “compiler id” “Diab” for languages “ASM”, “C”, and
    “CXX”.

Commands

  • The “add_dependencies()” command may be called with no dependencies.

  • The “cmake_pkg_config()” command now supports the “IMPORT” and
    “POPULATE” subcommands for interfacing CMake targets with pkg-config
    based dependencies.

  • The “install(DIRECTORY)” command gained a new
    “EXCLUDE_EMPTY_DIRECTORIES” option to skip installation of empty
    directories.

  • The “project()” command now has experimental support for the
    “COMPAT_VERSION” keyword, gated by
    “CMAKE_EXPERIMENTAL_EXPORT_PACKAGE_INFO”.

Variables

  • The “CMAKE_FIND_REQUIRED” variable was added to tell
    “find_package()”, “find_path()”, “find_file()”, “find_library()”,
    and “find_program()” to be “REQUIRED” by default. The commands also
    gained an “OPTIONAL” keyword to ignore the variable for a specific
    call.

  • The “CMAKE_<LANG>_COMPILER_ARCHITECTURE_ID” variable is now
    populated for most compilers, and documented for public use.

  • The “CMAKE_<LANG>_ICSTAT” variable and corresponding “<LANG>_ICSTAT”
    target property were added to tell the Makefile Generators and the
    Ninja Generators to run the IAR “icstat” tool along with the
    compiler for “C” and “CXX” languages.

Environment Variables

  • The “CMAKE_<LANG>IMPLICIT_LINK_LIBRARIES_EXCLUDE" environment
    variable was added to optionally exclude specific libraries from the
    detected set of "CMAKE
    <LANG>_IMPLICIT_LINK_LIBRARIES”.

Properties

  • The “AUTOMOC_INCLUDE_DIRECTORIES” target property and associated
    “CMAKE_AUTOMOC_INCLUDE_DIRECTORIES” variable were added to override
    the automatic discovery of moc includes from a target’s transitive
    include directories.

  • The “MACOSX_PACKAGE_LOCATION” source file property now works when
    set on a source directory, and copies its entire tree into the
    bundle.

  • The “PDB_NAME” and “COMPILE_PDB_NAME” target properties now support
    “generator expressions”.

Modules

  • The “FindASPELL” module now provides a version variable, imported
    targets, and components to optionally select the Aspell library and
    executable separately.

  • The “FindBLAS” and “FindLAPACK” modules now support the NVIDIA
    Performance Libraries (NVPL).

  • The “FindProtobuf” module’s “protobuf_generate(DEPENDENCIES)”
    command argument now accepts multiple values.

  • The “FindProtobuf” module’s “protobuf_generate_cpp()” and
    “protobuf_generate_python()” commands, together with their
    “Protobuf_IMPORT_DIRS” and “PROTOBUF_GENERATE_CPP_APPEND_PATH” hint
    variables, are now deprecated in favor of the “protobuf_generate()”
    command.

Regular Expressions

  • The “string(REGEX MATCHALL)”, “string(REGEX REPLACE)”, and
    “list(TRANSFORM REPLACE)” commands now match the regular expression
    “^” anchor at most once in repeated searches, at the start of the
    input. See policy “CMP0186”.

  • The “string(REGEX REPLACE)” command now allows references to
    unmatched groups. They are replaced with empty strings.

  • The “string(REGEX MATCH)”, “string(REGEX MATCHALL)”, and
    “string(REGEX REPLACE)” commands now allow zero-length matches.

CTest

  • “ctest(1)” gained a “–schedule-random-seed” option to specify a
    numeric random seed to make “ctest --schedule-random” deterministic
    for reproduction.

CPack

  • The “CPack NuGet Generator” gained option
    “CPACK_NUGET_SYMBOL_PACKAGE” to generate NuGet symbol packages
    containing PDB files.

  • The “CPack RPM Generator” gained “CPACK_RPM_PACKAGE_ENHANCES”,
    “CPACK_RPM_PACKAGE_RECOMMENDS”, and “CPACK_RPM_PACKAGE_SUPPLEMENTS”
    variables to specify the corresponding RPM spec fields.

Deprecated and Removed Features

  • The “FindGTest” module’s result variables “GTEST_INCLUDE_DIRS”,
    “GTEST_LIBRARIES”, “GTEST_MAIN_LIBRARIES”, and
    “GTEST_BOTH_LIBRARIES” are now deprecated in favor of using
    “GTest::gtest” and “GTest::gtest_main” imported targets.

  • The “FindGCCXML” module has been deprecated via policy “CMP0188”.
    Port projects to CastXML instead.

  • The “FindCABLE” module has been deprecated via policy “CMP0191”.

  • The “CMakeDetermineVSServicePack” module has been deprecated via
    policy “CMP0196”. Port projects to the
    “CMAKE_<LANG>_COMPILER_VERSION” variable instead.

Other Changes

  • The “ExternalProject” module no longer checks the “URL” archive file
    extension. Any archive type that “cmake -E tar” can extract is now
    allowed.

  • Modules “FindPython3”, “FindPython2” and “FindPython” now enforce
    consistency of artifacts in cross-compiling mode. This prevents
    mixing host and target artifacts. See policy “CMP0190”.

  • The “GNUInstallDirs” module now prefers to default “SYSCONFDIR”,
    “LOCALSTATEDIR”, and “RUNSTATEDIR” to absolute paths when installing
    to special prefixes. See policy “CMP0192”.

  • The “GNUInstallDirs” module now caches “CMAKE_INSTALL_*” variables
    with their leading “usr/” for install prefix “/”. See policy
    “CMP0193”.

  • The “install(TARGETS)” command no longer ignores file sets which
    haven’t been defined at the point it is called. The ordering of
    “target_sources(FILE_SET)” and “install(TARGETS)” is no longer
    semantically relevant.

  • Enabling “ASM” no longer accidentally succeeds using “MSVC”'s “cl” C
    compiler as an assembler. See policy “CMP0194”.

  • The MSVC link “-machine:” flag is no longer added to the
    “CMAKE_*_LINKER_FLAGS” variables. See policy “CMP0197”.

  • The “TARGET_PROPERTY” generator expression now evaluates the
    “LINK_LIBRARIES” and “INTERFACE_LINK_LIBRARIES” target properties
    transitively. See policy “CMP0189”.

2 Likes