[ANNOUNCE] CMake 3.20.0-rc2 is ready for testing

Tom Osika tom.osika at kitware.com
Wed Feb 24 19:22:22 GMT 2021


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

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

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

Some of the more significant changes in CMake 3.20 are:

* "cmake-presets(7)" gained support for build and test presets.

* C++23 compiler modes may now be specified via the "CXX_STANDARD",
  "CUDA_STANDARD", or "OBJCXX_STANDARD" target properties, or via the
  "Compile Features" functionality’s "cxx_std_23" meta-feature.

* The NVIDIA HPC SDK compilers are now supported with compiler id
  "NVHPC".

* CMake’s support for 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 "CMAKE_BUILD_TYPE" for Android is now
    "RelWithDebInfo".

* The "cmake-file-api(7)" gained a new “toolchains” object kind that
  describes the compiler used for each enabled language.

* "add_custom_command()" and "add_custom_target()" now support
  "generator expressions" in their "OUTPUT" and "BYPRODUCTS" options.

  Their "COMMAND", "WORKING_DIRECTORY", and "DEPENDS" options gained
  support for new generator expressions "$<COMMAND_CONFIG:...>" and
  "$<OUTPUT_CONFIG:...>" that control cross-config handling when using
  the "Ninja Multi-Config" generator.

* The "cmake_path()" command was added for operations on filesystem
  paths.

* The "target_sources()" command now supports targets created by the
  "add_custom_target()" command.

* The "ExternalProject" module "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.

* "ctest(1)" gained a "--test-dir" option to specify the directory in
  which to look for tests.

* The "cmake-server(7)" mode has been removed. Clients should use the
  "cmake-file-api(7)" instead.

* The "WriteCompilerDetectionHeader" module has been deprecated via
  policy "CMP0120".  Projects should be ported away from it.

* The "AddFileDependencies" module is deprecated. Port projects to use
  "set_property()" directly.


CMake 3.20 Release Notes
************************

Changes made since CMake 3.19 include the following.


New Features
============


Presets
-------

* "cmake-presets(7)" gained support for build and test presets.


Generators
----------

* Makefile Generators, for some toolchains, now use the compiler to
  extract implicit dependencies while compiling source files.


Languages
---------

* C++23 compiler modes may now be specified via the "CXX_STANDARD",
  "CUDA_STANDARD", or "OBJCXX_STANDARD" target properties, or via the
  "Compile Features" 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 "CUDAARCHS" environment variable was added for initializing
  "CMAKE_CUDA_ARCHITECTURES". Useful in cases where the compiler
  default is unsuitable for the machine’s GPU.


Compilers
---------

* 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 partially supported. As of
    oneAPI 2021.1, "ifx" does not define several identification
    macros, so CMake identifies it as the classic "Intel" compiler.
    This works in many cases because "ifx" accepts the same command
    line parameters as "ifort".  A future version of oneAPI may fix
    this.

  * 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.


Platforms
---------

* CMake’s support for 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 "CMAKE_BUILD_TYPE" for Android is now
    "RelWithDebInfo".


File-Based API
--------------

* The "cmake-file-api(7)" gained a new “toolchains” object kind that
  describes the compiler used for each enabled language.


Commands
--------

* "add_custom_command()" and "add_custom_target()" now support
  "generator expressions" in their "OUTPUT" and "BYPRODUCTS" options.

  Their "COMMAND", "WORKING_DIRECTORY", and "DEPENDS" options gained
  support for new generator expressions "$<COMMAND_CONFIG:...>" and
  "$<OUTPUT_CONFIG:...>" that control cross-config handling when using
  the "Ninja Multi-Config" generator.

* The "add_custom_command()" command gained "DEPFILE" support on
  Makefile Generators.

* The "add_library()" command previously prohibited imported object
  libraries when using potentially multi-architecture configurations.
  This mostly affected the "Xcode" generator, e.g. when targeting iOS
  or one of the other device platforms.  This restriction has now been
  removed.

* The "cmake_path()" command was added for operations on filesystem
  paths.

* The "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 "file(GENERATE)" command gained a "NEWLINE_STYLE" option to
  specify how newlines are handled for the generated file.

* The "file(GENERATE)" command gained "NO_SOURCE_PERMISSIONS",
  "USE_SOURCE_PERMISSIONS", and "FILE_PERMISSIONS" options for
  controlling the permissions of the generated file.

* The "install(FILES)" command "RENAME" option learned to support
  "generator expressions".

* The "target_include_directories()" command gained a new option
  "AFTER".

* The "target_sources()" command now supports targets created by the
  "add_custom_target()" command.

* The "try_run()" command gained a "WORKING_DIRECTORY" option to set
  the working directory in which to run the compiled check executable.


Variables
---------

* The "CMAKE_<LANG>_BYTE_ORDER" variable was added to provide the
  target architecture byte order detected from the toolchain.

* The "CMAKE_RUNTIME_OUTPUT_DIRECTORY",
  "CMAKE_LIBRARY_OUTPUT_DIRECTORY", and
  "CMAKE_ARCHIVE_OUTPUT_DIRECTORY" variables now support target-
  dependent generator expressions.


Properties
----------

* The "<LANG>_CLANG_TIDY" target property and the associated
  "CMAKE_<LANG>_CLANG_TIDY" variable learned to support the "OBJC" and
  "OBJCXX" languages.

* The "EXPORT_COMPILE_COMMANDS" target property was added for the
  associated "CMAKE_EXPORT_COMPILE_COMMANDS" variable to allow for
  configuration of exporting compile commands per target.

* The "GENERATED" source-file property is now visible from any
  directory scope, regardless of the scope in which it is set. See
  policy "CMP0118".

* The "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 "WIN32_EXECUTABLE" target property now works with Clang on
  Windows.

* The "XCODE_EMBED_FRAMEWORKS" target property was added to tell the
  "Xcode" generator to embed frameworks. Aspects of the embedding can
  be customized with the "XCODE_EMBED_FRAMEWORKS_PATH",
  "XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY", and
  "XCODE_EMBED_FRAMEWORKS_REMOVE_HEADERS_ON_COPY" target properties.


Modules
-------

* The "ExternalData" module "ExternalData_Add_Target()" function
  gained a "SHOW_PROGRESS <bool>" option for controlling whether or
  not to show progress output during the build.

* The "ExternalProject" module "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 "FindBoost" module gained a "Boost_NO_WARN_NEW_VERSIONS" option
  to silence the warning about unknown dependencies for new Boost
  versions.

* The "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 "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 "FindIntl" module now provides an imported target.

* The "FindOpenSSL" module learned to support a version range.

* The "FindPython3", "FindPython2" and "FindPython" modules gained
  options controlling how unversioned interpreter names are searched.

* The "UseJava" module "add_jar()" command’s "GENERATE_NATIVE_HEADERS"
  feature gained options to export the generated target.

* The "UseSWIG" module gained the capability, for Makefile and Ninja
  generators, to use the "swig" tool to generate implicit
  dependencies.


Autogen
-------

* The AUTOMOC feature now works with per-config sources.


CTest
-----

* "ctest(1)" gained a "--test-dir" option to specify the directory in
  which to look for tests.


CPack
-----

* "CPack" gained the "CPACK_THREADS" variable to control the number of
  threads used for parallelized operations, such as compressing the
  installer package.

* The "CPack DEB Generator" learned a new
  "CPACK_DEBIAN_PACKAGE_SHLIBDEPS_PRIVATE_DIRS" variable to specify
  additional search directories for resolving private library
  dependencies when using "dpkg-shlibdeps".

* The "CPack IFW Generator" gained a new
  "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 NSIS Generator" gained new "CPACK_NSIS_BRANDING_TEXT" and
  "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 NSIS Generator" now correctly handles Unicode characters.
  If you want to have a "CPACK_RESOURCE_FILE_LICENSE" with UTF-8
  characters, it needs to be encoded in UTF-8 BOM.

* The "CPack NuGet Generator" gained options:

  * "CPACK_NUGET_PACKAGE_ICON" and
    "CPACK_NUGET_<compName>_PACKAGE_ICON" allow package icons to be
    specified by local files.

  * "CPACK_NUGET_PACKAGE_LICENSE_EXPRESSION" and
    "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
    "CPACK_NUGET_<compName>_PACKAGE_LICENSE_FILE_NAME" allow licenses
    to be specified by local files.

  * "CPACK_NUGET_PACKAGE_LANGUAGE" and
    "CPACK_NUGET_<compName>_PACKAGE_LANGUAGE" allow the locale for a
    package to be specified, for example "en_CA".


Deprecated and Removed Features
===============================

* The "cmake-server(7)" mode has been removed. Clients should use the
  "cmake-file-api(7)" instead.

* The "WriteCompilerDetectionHeader" module has been deprecated via
  policy "CMP0120".  Projects should be ported away from it.

* The "TestBigEndian" module has been deprecated in favor of the
  "CMAKE_<LANG>_BYTE_ORDER" variable.

* The "AddFileDependencies" module is deprecated. Port projects to use
  "set_property()" directly.

* The "CPack NuGet Generator" deprecated some variables to reflect
  changes in the NuGet specification:

  * "CPACK_NUGET_PACKAGE_ICONURL" and
    "CPACK_NUGET_<compName>_PACKAGE_ICONURL" have been deprecated;
    replace with a reference to a local icon file.

  * "CPACK_NUGET_PACKAGE_LICENSEURL" and
    "CPACK_NUGET_<compName>_PACKAGE_LICENSEURL" have been deprecated;
    replace with a reference to the project’s license file or SPDX
    license expression.


Other Changes
=============

* Source file extensions must now be explicit. See policy "CMP0115"
  for details.

* The "LANGUAGE" source file property now forces compilation as the
  specified language.  See 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 "CMAKE_CXX_FLAGS" no longer
  contains the "/GR" flag for runtime type information by default. See
  policy "CMP0117".

* Ninja generators now transform the "DEPFILE" generated by an
  "add_custom_command()". See policy "CMP0116" for details.

* The implementation of the "ExternalProject" module was significantly
  refactored.  The patch step gained support for using the terminal
  with a new "USES_TERMINAL_PATCH" keyword as a by-product of that
  work.

* The "FetchContent" module no longer creates a separate sub-build to
  implement the content population.  It now invokes the step scripts
  directly from within the main project’s configure stage.  This
  significantly speeds up the configure phase when the required
  content is already populated and up-to-date.

* The precompiled Linux binaries provided on cmake.org 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 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-rc1:

Brad King (25):
  Intel: Make explicit Fortran preprocessing under Ninja more robust
  IntelLLVM: Make explicit Fortran preprocessing under Ninja more robust
  bindexplib: remove stray debugging output when using llvm-nm
  Utilities/Sphinx: Avoid converting -- to an en-dash
  Help: Mention version 2 in cmake-presets(7)
  Help: Link to tool-specific preset arguments from cmake-presets(7)
  Help: Clarify role of binaryDir inheritance in cmake-presets(7)
  Help: Fix CPACK_DEBIAN_PACKAGE_SHLIBDEPS_PRIVATE_DIRS documentation
  cmVisualStudio10TargetGenerator: Refactor per-source PCH logic
  VS: Restore support for PCH in CXX but not C within once target
  NAG: Fix using Fortran modules from their output directory
  Tests: Clarify internal project name in RunCMake.GoogleTest cases
  Tests: Remove explicit no-signing marks from BundleTest
  Tests: Fix CTestTestCrash expected output on macOS arm64
  Tests: Suppress failures on macOS arm64 due to separate Xcode signing phase
  cmake: Document '--preset <preset>' form of the argument
  cmake: Add support for '--build --prefix=<prefix>' form of the argument
  ctest: Add support for '--prefix=<prefix>' form of the argument
  ci: Use Qt macOS 10.13+ package for macOS build and test jobs
  ci: update to sccache 0.2.15 on linux builds
  Tests: Update for upstream ninja change to write status on stderr
  ci: add sccache 0.2.15 custom build for aarch64-apple-darwin
  gitlab-ci: rename macos build and test jobs to macos-x86_64
  gitlab-ci: Add macos-arm64 jobs for Ninja and Xcode
  CMake 3.20.0-rc2

Craig Scott (5):
  FetchContent: Restore patch command support
  CPackIFWInstaller: Avoid potential null pointer dereference
  Autogen: Don't change the order of HEADERS array in AutogenInfo.json
  ExternalProject: Fix misuse of IS_NEWER_THAN in timestamp checks
  FetchContent: Don't update timestamps if files don't change

Daan De Meyer (1):
  Tests: Fix ExternalProject CONFIGURE_HANDLED_BY_BUILD on 1s filesystems

Gregor Jasny (1):
  DetermineCompiler: Fix copy-paste error in Intel Compiler detection

Kyle Edwards (7):
  cmCustomCommand: Record value of CMP0116 at time of creation
  Ninja: Use CMP0116 status recorded at time of custom command's creation
  Tests: Test per-CC behavior of CMP0116
  Tests: Test Qt autogen target with CMP0116 set to WARN
  Help: Note that CMP0116 is recorded at the time of CC creation
  CMakePresets.json: Remove undocumented support for comments
  Tests: Remove comments from CMakePresetsTest/Good.json.in

Marc Chevrier (1):
  Genex: LINK_LANGUAGE respects LINKER_LANGUAGE property

Michael Hirsch (2):
  Help: Clarify preset name conflict rules in cmake-presets(7)
  Help: Add build and test preset to examples in cmake-presets(7)

Michael Hirsch, Ph.D (1):
  Help: Add internal links to if() docs

Robert Maynard (1):
  CUDA: Improve error messages when CUDA compiler detection fails

Sankhesh Jhaveri (1):
  cmake-gui: Restore search bar for cache view and environment dialog



More information about the kde-devel mailing list