CMake 3.31.0 available for download

We are pleased to announce that CMake 3.31 is now available for download.
https://cmake.org/download/

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

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

Release milestone is available at:
release milestone

Some of the most significant changes in CMake 3.31 are:

  • “cmake-presets(7)” files may now include comments using the key
    “$comment” at any level within the JSON object to provide
    documentation.

  • The Ninja Generators and Makefile Generators now produce a “codegen”
    build target. See policy “CMP0171”. It drives a subset of the
    build graph sufficient to run custom commands created with
    “add_custom_command()”'s new “CODEGEN” option.

  • The “CMAKE_LINK_LIBRARIES_STRATEGY” variable and corresponding
    “LINK_LIBRARIES_STRATEGY” target property were added to optionally
    specify the strategy CMake uses to generate link lines.

  • The “CMAKE_AIX_SHARED_LIBRARY_ARCHIVE” variable and corresponding
    “AIX_SHARED_LIBRARY_ARCHIVE” target property were added to create
    shared libraries on AIX as shared library archives.

  • The “CMAKE_EXPORT_BUILD_DATABASE” variable, a corresponding
    “CMAKE_EXPORT_BUILD_DATABASE” environment variable, and an
    “EXPORT_BUILD_DATABASE” target property, were added to enable
    exporting C++ module compile commands. This is only supported with
    Ninja Generators.

  • The “CMAKE_<LANG>HOST_COMPILER_ID" and
    "CMAKE
    <LANG>HOST_COMPILER_VERSION" variables were added, where
    “<LANG>” is either “CUDA” or “HIP”. They are populated when
    "CMAKE
    <LANG>_COMPILER_ID” is “NVIDIA” to identify NVCC’s host
    compiler.

  • Compatibility with versions of CMake older than 3.10 is now
    deprecated and will be removed from a future version. Calls to
    “cmake_minimum_required()” or “cmake_policy()” that set the policy
    version to an older value now issue a deprecation diagnostic.

  • When static libraries on link lines are de-duplicated (by policy
    “CMP0156”), the first occurrence is now kept on all platforms. See
    policy “CMP0179”.

  • The “file(DOWNLOAD)” and “file(UPLOAD)” commands now verify TLS
    server certificates for connections to “https://” URLs by default.
    See the “CMAKE_TLS_VERIFY” variable for details. This change was
    made without a policy so that users are protected even when building
    projects that have not been updated. Users may set the
    “CMAKE_TLS_VERIFY” environment variable to “0” to restore the old
    default.

CMake 3.31 Release Notes


Changes made since CMake 3.30 include the following.

New Features

Presets

  • “cmake-presets(7)” files may now include comments using the key
    “$comment” at any level within the JSON object to provide
    documentation.

  • “cmake-presets(7)” files may now request graphviz output using the
    “graphviz” key in a configure preset.

Generators

  • The Ninja Generators and Makefile Generators now produce a “codegen”
    build target. See policy “CMP0171”. It drives a subset of the
    build graph sufficient to run custom commands created with
    “add_custom_command()”'s new “CODEGEN” option.

Command-Line

  • The “cmake --workflow” mode now accepts a preset name as the first
    argument, allowing the simpler command line “cmake --workflow
    <preset>”.

  • The “cmake -LR[A][H]” option was added to list cache entries whose
    names match a regular expression.

Compilers

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

Commands

  • The “add_custom_command()” command gained a “CODEGEN” option to mark
    a custom command’s outputs as dependencies of a “codegen” target.
    See policy “CMP0171”.

  • The “cmake_pkg_config()” command was added as an endpoint for using
    CMake’s native pkg-config format parser. The only supported option
    in this release is “EXTRACT”, which provides low-level access to the
    values produced by parsing a pkg-config file. For most users, this
    is not yet a suitable replacement for the “FindPkgConfig” module.

  • The “file(ARCHIVE_CREATE)” command gained a “WORKING_DIRECTORY”
    option to specify a working directory for the archiving process.

  • The “file(MAKE_DIRECTORY)” command gained a “RESULT” option to
    capture failure in a result variable.

  • The “install(FILES)” and “install(DIRECTORY)” commands’ “TYPE”
    argument gained support for a “LIBEXEC” type.

Variables

  • The “CMAKE_AIX_SHARED_LIBRARY_ARCHIVE” variable and corresponding
    “AIX_SHARED_LIBRARY_ARCHIVE” target property were added to create
    shared libraries on AIX as shared library archives.

  • The “CMAKE_EXPORT_BUILD_DATABASE” variable, a corresponding
    “CMAKE_EXPORT_BUILD_DATABASE” environment variable, and an
    “EXPORT_BUILD_DATABASE” target property, were added to enable
    exporting C++ module compile commands. This is only supported with
    Ninja Generators.

  • The “CMAKE_HOST_EXECUTABLE_SUFFIX” variable was added to provide the
    suffix for executable names on the host platform.

  • The “CMAKE_<LANG>HOST_COMPILER_ID" and
    "CMAKE
    <LANG>HOST_COMPILER_VERSION" variables were added, where
    “<LANG>” is either “CUDA” or “HIP”. They are populated when
    "CMAKE
    <LANG>_COMPILER_ID” is “NVIDIA” to identify NVCC’s host
    compiler.

  • The “CMAKE_<LANG>_STANDARD_LINK_DIRECTORIES” variable was added.
    Toolchain files can set this variable to control which link library
    directory paths are always passed to the compiler for the specified
    language.

  • The “CMAKE_LINK_LIBRARIES_STRATEGY” variable and corresponding
    “LINK_LIBRARIES_STRATEGY” target property were added to optionally
    specify the strategy CMake uses to generate link lines.

Properties

  • The “MACOSX_FRAMEWORK_BUNDLE_NAME” target property was added to set
    the “CFBundleName” key in an Apple “FRAMEWORK”'s “Info.plist” file.

  • The “UNITY_BUILD” target property now supports the “CUDA” language.

  • The “VS_FRAMEWORK_REFERENCES” target property was added to tell
    Visual Studio Generators to add framework references.

Modules

  • Check modules now support a “CMAKE_REQUIRED_LINK_DIRECTORIES”
    variable. The following modules gained this support:

    • “CMakePushCheckState”

    • “CheckCCompilerFlag”

    • “CheckCSourceCompiles”

    • “CheckCSourceRuns”

    • “CheckCXXCompilerFlag”

    • “CheckCXXSourceCompiles”

    • “CheckCXXSourceRuns”

    • “CheckCXXSymbolExists”

    • “CheckCompilerFlag”

    • “CheckFortranCompilerFlag”

    • “CheckFortranFunctionExists”

    • “CheckFortranSourceCompiles”

    • “CheckFortranSourceRuns”

    • “CheckFunctionExists”

    • “CheckIncludeFile”

    • “CheckIncludeFileCXX”

    • “CheckIncludeFiles”

    • “CheckOBJCCompilerFlag”

    • “CheckLibraryExists”

    • “CheckOBJCCompilerFlag”

    • “CheckOBJCSourceCompiles”

    • “CheckOBJCSourceRuns”

    • “CheckOBJCXXCompilerFlag”

    • “CheckOBJCXXSourceCompiles”

    • “CheckOBJCXXSourceRuns”

    • “CheckPrototypeDefinition”

    • “CheckSourceCompiles”

    • “CheckSourceRuns”

    • “CheckStructHasMember”

    • “CheckSymbolExists”

    • “CheckTypeSize”

    • “CheckVariableExists”

  • The “CMakePackageConfigHelpers” module’s
    “generate_apple_platform_selection_file()” function gained support
    for iOS Mac Catalyst.

  • The “GoogleTest” module “gtest_discover_tests()” command gained a
    new “DISCOVERY_EXTRA_ARGS” keyword. It allows extra arguments to be
    appended to the command line when querying for the list of tests.

  • The “FindCUDAToolkit” module now provides a “CUDA::nvml_static”
    target.

  • The “FindOpenMP” module gained support for the “CUDA” language.

CTest

  • The “ctest_submit()” command and “ctest -T Submit” step now verify
    TLS server certificates for connections to “https://” URLs by
    default. See the “CTEST_TLS_VERIFY” variable for details.

  • The “ctest_submit()” command and “ctest -T Submit” step now require
    TLS 1.2 or higher for connections to “https://” URLs by default.
    See the “CTEST_TLS_VERSION” variable for details.

CPack

  • The “CPack DEB Generator” gained a “CPACK_DEBIAN_PACKAGE_MULTIARCH”
    option to support multi-arch packages.

  • The “CPack IFW Generator” gained the new
    “CPACK_IFW_PACKAGE_PRODUCT_IMAGE_URLS” variable to specify images
    associated with entries of “CPACK_IFW_PACKAGE_PRODUCT_IMAGES”. This
    feature is available for QtIFW 4.0 and newer.

  • The “CPack RPM Generator” gained support for “zstd” as a
    “CPACK_RPM_COMPRESSION_TYPE” value.

  • The “CPack” module enables per-machine installation by default in
    the “CPack WIX Generator”. See policy “CMP0172” and the
    “CPACK_WIX_INSTALL_SCOPE” variable.

Deprecated and Removed Features

  • Compatibility with versions of CMake older than 3.10 is now
    deprecated and will be removed from a future version. Calls to
    “cmake_minimum_required()” or “cmake_policy()” that set the policy
    version to an older value now issue a deprecation diagnostic.

  • The “CMakeFindFrameworks” module has been deprecated via “CMP0173”.
    Projects should use “find_library()” instead.

  • The “Visual Studio 12 2013” generator has been removed.

Other Changes

  • When static libraries on link lines are de-duplicated (by policy
    “CMP0156”), the first occurrence is now kept on all platforms. See
    policy “CMP0179”.

  • Empty list elements in the “TEST_LAUNCHER” and
    “CROSSCOMPILING_EMULATOR” target properties are now preserved by:

    • The “add_test()” command.

    • The “ExternalData_Add_Test()” command from the “ExternalData”
      module.

    • The “gtest_add_tests()” and “gtest_discover_tests()” commands from
      the “GoogleTest” module. Empty list elements after the
      “EXTRA_ARGS” keyword of these two commands are also now preserved.

    See policy “CMP0178”.

  • The “execute_process()” command’s “ENCODING” option, meaningful on
    Windows, now defaults to “UTF-8”. See policy “CMP0176”.

  • The “file(DOWNLOAD)” and “file(UPLOAD)” commands now verify TLS
    server certificates for connections to “https://” URLs by default.
    See the “CMAKE_TLS_VERIFY” variable for details. This change was
    made without a policy so that users are protected even when building
    projects that have not been updated. Users may set the
    “CMAKE_TLS_VERIFY” environment variable to “0” to restore the old
    default.

  • The “file(DOWNLOAD)” and “file(UPLOAD)” commands now require TLS 1.2
    or higher for connections to “https://” URLs by default. See the
    “CMAKE_TLS_VERSION” variable for details.

  • The “file(GET_RUNTIME_DEPENDENCIES)” command was updated to more
    closely match the dynamic loader’s behavior on Linux.

  • The “install()” command’s “DESTINATION” arguments are now
    normalized, with the exception of “INCLUDES DESTINATION” arguments
    in “install(TARGETS)”. See policy “CMP0177”.

  • The “project()” command now always sets “<PROJECT-NAME>_SOURCE_DIR”,
    “<PROJECT-NAME>_BINARY_DIR”, and “<PROJECT-NAME>_IS_TOP_LEVEL” as
    both normal variables and cache entries. See policy “CMP0180”.

  • The “cmake_parse_arguments(PARSE_ARGV)” command now defines a
    variable for an empty string after a single-value keyword. See
    policy “CMP0174”.


Changes made since CMake 3.31.0-rc3:

Ben Boeckel (2):

  • ci: use JSON to transfer environment variables
  • gitlab-ci: remove dependencies from jobs

Brad King (1):

  • CMake 3.31.0

Isn’t 3.31.0 is the latest public release?
In Github repository, 3.30.5 is still the latest release.

If 3.31.0 is the latest, could you update it?

Funny.
I didn’t even know CMake was on Github🤔.
I just knew about its GitLab Repo, though I always download it from cmake.org/download :sweat_smile:.

There seem to be an official mirror: GitHub - Kitware/CMake: Mirror of CMake upstream repository.

The code itself is up-to-date, but the releases are not.

Oh, I see. There’s the 3.31.0 release tag, but GH still shows 3.30.5 as being the latest release.

It could be a GitHub issue, maybe

I don’t think it’s a GitHub issue. One has to create a release from a tag explicitly. Just tagging a commit does not create a release.

Thank you all for informing us of this oversight, it has since been addressed, the 3.31 release is now designated “latest” on Github.

I didn’t even know CMake was on Github🤔.

As @fenrir kindly pointed out, this is our downstream mirror! We provide this as an additional endpoint to acquire CMake and check out the source.

One has to create a release from a tag explicitly. Just tagging a commit does not create a release.

This is correct as well, our release process has been updated to ensure oversights like this are avoided in the future, thanks to all again for bringing this to our attention!

1 Like