Help/release/3.20.rst
CMake 3.20 Release Notes
.. only:: html
.. contents::
Changes made since CMake 3.19 include the following.
cmake-presets(7) gained support for build and test presets.Makefile Generators, for some toolchains, now use the compiler
to extract implicit dependencies while compiling source files.C++23 compiler modes may now be specified via the :prop_tgt:CXX_STANDARD,
:prop_tgt:CUDA_STANDARD, or :prop_tgt:OBJCXX_STANDARD target properties,
or via the :manual:Compile Features <cmake-compile-features(7)>
functionality's cxx_std_23 meta-feature.
CUDA language support now works when nvcc is a symbolic link,
for example due to a ccache or colornvcc wrapper script.
The :envvar:CUDAARCHS environment variable was added for initializing
:variable:CMAKE_CUDA_ARCHITECTURES. Useful in cases where the compiler
default is unsuitable for the machine's GPU.
The NVIDIA HPC SDK compilers are now supported with compiler id NVHPC.
The Intel oneAPI NextGen LLVM compilers are now supported with
compiler id IntelLLVM:
The icx/icpx C/C++ compilers on Linux, and the icx
C/C++ compiler on Windows, are fully supported as of oneAPI 2021.1.
The ifx Fortran compiler on Linux is supported as of oneAPI 2021.1.
The ifx Fortran compiler on Windows is not yet supported.
The Intel oneAPI Classic compilers (icc, icpc, and ifort)
continue to be supported with compiler id Intel.
Support was added for the IAR STM8 compiler.
CMake's support for :ref:Cross Compiling for Android
is now merged with the Android NDK's toolchain file.
They now have similar behavior, though some variable names differ.
User-facing changes include:
find_* functions will search NDK ABI / API specific paths by default.
The default :variable:CMAKE_BUILD_TYPE for Android is
now RelWithDebInfo.
The :variable:CMAKE_ANDROID_NDK_VERSION variable was added to
report the version of the NDK.
cmake-file-api(7) gained a new "toolchains" object
kind that describes the compiler used for each enabled language.:command:add_custom_command and :command:add_custom_target now
support :manual:generator expressions <cmake-generator-expressions(7)>
in their OUTPUT and BYPRODUCTS options.
Their COMMAND, WORKING_DIRECTORY, and DEPENDS options gained
support for new generator expressions :genex:$<COMMAND_CONFIG:...> and
:genex:$<OUTPUT_CONFIG:...> that control cross-config handling when using
the :generator:Ninja Multi-Config generator.
The :command:add_custom_command command gained DEPFILE support on
:ref:Makefile Generators.
The :command:add_library command previously prohibited imported object
libraries when using potentially multi-architecture configurations.
This mostly affected the :generator:Xcode generator, e.g. when targeting
iOS or one of the other device platforms. This restriction has now been
removed.
The :command:cmake_path command was added for operations on
filesystem paths.
The :command:configure_file command gained USE_SOURCE_PERMISSIONS
and FILE_PERMISSIONS options to support copying of permissions of the
source file and using specified permissions respectively.
The :command:file(GENERATE) command gained a NEWLINE_STYLE option to
specify how newlines are handled for the generated file.
The :command:file(GENERATE) command gained NO_SOURCE_PERMISSIONS,
USE_SOURCE_PERMISSIONS, and FILE_PERMISSIONS options for controlling
the permissions of the generated file.
The :command:install(FILES) command RENAME option learned to
support :manual:generator expressions <cmake-generator-expressions(7)>.
The :command:target_include_directories command gained a new option
AFTER.
The :command:target_sources command now supports targets created
by the :command:add_custom_target command.
The :command:try_run command gained a WORKING_DIRECTORY option to
set the working directory in which to run the compiled check executable.
The :variable:CMAKE_<LANG>_BYTE_ORDER variable was added to provide the
target architecture byte order detected from the toolchain.
The :variable:CMAKE_RUNTIME_OUTPUT_DIRECTORY,
:variable:CMAKE_LIBRARY_OUTPUT_DIRECTORY, and
:variable:CMAKE_ARCHIVE_OUTPUT_DIRECTORY variables now support
target-dependent generator expressions.
The :prop_tgt:<LANG>_CLANG_TIDY target property and the associated
:variable:CMAKE_<LANG>_CLANG_TIDY variable learned to support
the OBJC and OBJCXX languages.
The :prop_tgt:EXPORT_COMPILE_COMMANDS target property was added
for the associated :variable:CMAKE_EXPORT_COMPILE_COMMANDS variable
to allow for configuration of exporting compile commands per target.
Generated sources may be used across directories without manual marking.
Additionally, the :prop_sf:GENERATED source file property can no longer be
turned off once turned on, nor can it be set to other than boolean values.
See policy :policy:CMP0118.
The :prop_tgt:UNITY_BUILD_UNIQUE_ID target property
was added to support generation of an identifier that is
unique per source file in unity builds. It can help to
resolve duplicate symbol problems with anonymous namespaces.
The :prop_tgt:WIN32_EXECUTABLE target property now works with Clang
on Windows.
The :prop_tgt:XCODE_EMBED_FRAMEWORKS <XCODE_EMBED_<type>> target property
was added to tell the :generator:Xcode generator to embed frameworks.
Aspects of the embedding can be customized with the
:prop_tgt:XCODE_EMBED_FRAMEWORKS_PATH <XCODE_EMBED_<type>>,
:prop_tgt:XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY, and
:prop_tgt:XCODE_EMBED_FRAMEWORKS_REMOVE_HEADERS_ON_COPY target properties.
The :module:ExternalData module :command:ExternalData_Add_Target
function gained a SHOW_PROGRESS <bool> option for controlling whether
or not to show progress output during the build.
The :module:ExternalProject module :command:ExternalProject_Add function
gained a CONFIGURE_HANDLED_BY_BUILD option. This can be used to make
subsequent runs of the configure step be triggered by the build step when
an external project dependency rebuilds instead of always re-running the
configure step in such cases.
The :module:FindBoost module gained a Boost_NO_WARN_NEW_VERSIONS
option to silence the warning about unknown dependencies for new
Boost versions.
The :module:FindCUDAToolkit module gained support for finding CUDA
toolkits when nvcc is a symbolic link,
for example due to a ccache or colornvcc wrapper script.
The :module:FindGDAL module has been improved to document and mark as
advanced its cache variables. There is a new FindGDAL_SKIP_GDAL_CONFIG
variable which may be used to skip over the gdal-config-based search.
Users may also set GDAL_ADDITIONAL_LIBRARY_VERSIONS to add additional
versions to the library name search strategy.
The :module:FindIntl module now provides an imported target.
The :module:FindOpenSSL module learned to support a version range.
The :module:FindPython3, :module:FindPython2 and :module:FindPython
modules gained options controlling how unversioned interpreter names are
searched.
The :module:UseJava module add_jar() command's
GENERATE_NATIVE_HEADERS feature gained options to export the
generated target.
The :module:UseSWIG module gained the capability, for
:ref:Makefile <Makefile Generators> and :ref:Ninja <Ninja Generators>
generators, to use the swig tool to generate implicit dependencies.
Qt AUTOMOC feature now works with per-config sources.ctest(1) gained a :option:--test-dir <ctest --test-dir>
option to specify the directory in which to look for tests.:module:CPack gained the :variable:CPACK_THREADS variable to
control the number of threads used for parallelized operations,
such as compressing the installer package.
The :cpack_gen:CPack DEB Generator learned a new
:variable:CPACK_DEBIAN_PACKAGE_SHLIBDEPS_PRIVATE_DIRS
variable to specify additional search directories for
resolving private library dependencies when using
dpkg-shlibdeps.
The :cpack_gen:CPack IFW Generator gained a new
:variable:CPACK_IFW_PACKAGE_WIZARD_SHOW_PAGE_LIST variable to
control visibility of the widget listing installer pages on the left side
of the wizard. This feature available only since QtIFW 4.0.
The :cpack_gen:CPack NSIS Generator gained new
:variable:CPACK_NSIS_BRANDING_TEXT and
:variable:CPACK_NSIS_BRANDING_TEXT_TRIM_POSITION variables to change
the text at the bottom of the install window and change its trim position
The :cpack_gen:CPack NSIS Generator now correctly handles Unicode
characters. If you want to have a :variable:CPACK_RESOURCE_FILE_LICENSE
with UTF-8 characters, it needs to be encoded in UTF-8 BOM.
The :cpack_gen:CPack NuGet Generator gained options:
CPACK_NUGET_PACKAGE_ICON and
:variable:CPACK_NUGET_<compName>_PACKAGE_ICON
allow package icons to be specified by local files.CPACK_NUGET_PACKAGE_LICENSE_EXPRESSION and
:variable:CPACK_NUGET_<compName>_PACKAGE_LICENSE_EXPRESSION add
support for specifying licenses recognized by the
Software Package Data Exchange_ (SPDX).CPACK_NUGET_PACKAGE_LICENSE_FILE_NAME and
:variable:CPACK_NUGET_<compName>_PACKAGE_LICENSE_FILE_NAME allow
licenses to be specified by local files.CPACK_NUGET_PACKAGE_LANGUAGE and
:variable:CPACK_NUGET_<compName>_PACKAGE_LANGUAGE allow the locale
for a package to be specified, for example en_CA... _Software Package Data Exchange: https://spdx.dev/
The :manual:cmake-server(7) mode has been removed.
Clients should use the :manual:cmake-file-api(7) instead.
The :module:WriteCompilerDetectionHeader module has been deprecated
via policy :policy:CMP0120. Projects should be ported away from it.
The :module:TestBigEndian module has been deprecated in favor
of the :variable:CMAKE_<LANG>_BYTE_ORDER variable.
The :module:AddFileDependencies module is deprecated.
Port projects to use :command:set_property directly.
The :cpack_gen:CPack NuGet Generator deprecated some variables to reflect
changes in the NuGet specification:
CPACK_NUGET_PACKAGE_ICONURL and
:variable:CPACK_NUGET_<compName>_PACKAGE_ICONURL have been deprecated;
replace with a reference to a local icon file.CPACK_NUGET_PACKAGE_LICENSEURL and
:variable:CPACK_NUGET_<compName>_PACKAGE_LICENSEURL have been deprecated;
replace with a reference to the project's license file or SPDX
license expression.When running :manual:cmake(1) to :ref:Generate a Project Buildsystem,
unknown command-line arguments starting with a hyphen (-) are now
rejected with an error. Previously they were silently ignored.
Source file extensions must now be explicit.
See policy :policy:CMP0115 for details.
The :prop_sf:LANGUAGE source file property now forces compilation
as the specified language. See policy :policy:CMP0119.
On AIX, installation of XCOFF executables and shared libraries no longer requires relinking to change the runtime search path from the build-tree RPATH to the install-tree RPATH. CMake now edits the XCOFF binaries directly during installation, as has long been done on ELF platforms.
With MSVC-like compilers the value of
:variable:CMAKE_CXX_FLAGS <CMAKE_<LANG>_FLAGS> no longer contains
the /GR flag for runtime type information by default.
See policy :policy:CMP0117.
Ninja generators now transform the DEPFILE generated by an
:command:add_custom_command. See policy :policy:CMP0116 for details.
The precompiled Linux binaries provided on
cmake.org <https://cmake.org/download/>_ have changed their naming pattern
to cmake-$ver-linux-$arch, where $arch is either x86_64 or
aarch64.
The precompiled Windows binaries provided on
cmake.org <https://cmake.org/download/>_ have changed their naming pattern
to cmake-$ver-windows-$arch, where $arch is either x86_64 or
i386.
Changes made since CMake 3.20.0 include the following.
The :module:FindIntl module in CMake 3.20.0 added checks
Intl_HAVE_GETTEXT_BUILTIN, Intl_HAVE_DCGETTEXT_BUILTIN,
and Intl_IS_BUILTIN, but they were not implemented correctly.
These have been removed and replaced with a single Intl_IS_BUILT_IN
check, whose name is consistent with the :module:FindIconv module.
The -rpath linker flag is now specified as supported on all Apple
platforms, not just macOS. The install_name_dir used for
iOS, tvOS and watchOS should now default to @rpath instead of using
a full absolute path and failing at runtime when the library or framework
is embedded in an application bundle (see :prop_tgt:XCODE_EMBED_<type>).
The Intel Classic 2021 compiler version numbers are now detected correctly as having major version 2021. CMake 3.20.1 and below were not aware of a change to the identification macro version scheme made by Intel starting in version 2021, and detected the version as 20.2.
The Intel oneAPI Fortran compiler is now identified as IntelLLVM.
The oneAPI 2021.1 Fortran compiler is missing an identification macro,
so CMake 3.20.1 and below identified it as Intel. CMake now has
a special case to recognize oneAPI 2021.1 Fortran as IntelLLVM.
The oneAPI 2021.2 Fortran compiler defines the proper identification
macro and so is identified as IntelLLVM by all CMake 3.20 versions.
These versions made no changes to documented features or interfaces. Some implementation updates were made to support ecosystem changes and/or fix regressions.