I am proud to announce the first CMake 3.31 release candidate.
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 “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”.