CMake 3.17.0-rc1 is ready for testing

February 12, 2020

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

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

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

Some of the more significant changes in CMake 3.17 are:

  • “cmake(1)” gained a “Ninja Multi-Config” generator, which is similar to the “Ninja” generator but can be used to build multiple configurations at once.
  • Visual Studio Generators learned to support per-config sources. Previously only Command-Line Build Tool Generators supported them.
  • The “Compile Features” functionality now offers meta-features for the CUDA language standard levels (e.g. “cuda_std_03”, “cuda_std_14”). See “CMAKE_CUDA_KNOWN_FEATURES”.
  • The “CMAKE_CUDA_RUNTIME_LIBRARY” variable and “CUDA_RUNTIME_LIBRARY” target property were introduced to select the CUDA runtime library used when linking targets that use CUDA.
  • The “FindCUDAToolkit” module was added to find the CUDA Toolkit without enabling CUDA as a language.
  • “cmake(1)” gained a “–debug-find” command-line option to enable additional human-readable output on where find commands search.
  • The “CMAKE_FIND_DEBUG_MODE” variable was introduced to print extra find call information during the cmake run to standard error. Output is designed for human consumption and not for parsing.
  • The “FindCURL” module learned to find CURL using the “CURLConfig.cmake” package configuration file generated by CURL’s cmake buildsystem. It also gained a new “CURL_NO_CURL_CMAKE” option to disable this behavior.
  • The “FindPython” module has learned to find Python components in active virtual environments managed by “conda”.
  • The “ctest(1)” tool gained a “–no-tests=<[error|ignore]>” option to explicitly set and unify the behavior between direct invocation and script mode if no tests were found.
  • The “ctest(1)” tool gained a “–repeat :” option to specify conditions in which to repeat tests. This generalizes the existing “–repeat-until-fail ” option to add modes for “until-pass” and “after-timeout”.
  • Target link properties “INTERFACE_LINK_OPTIONS”, “INTERFACE_LINK_DIRECTORIES” and “INTERFACE_LINK_DEPENDS” are now transitive over private dependencies on static libraries. See policy “CMP0099”.
  • When using MinGW tools, the “find_library()” command no longer finds “.dll” files by default. Instead it expects “.dll.a” import libraries to be available.
  • The “Ninja” generator now prefers the first ninja build tool to appear in the “PATH” no matter whether it is called “ninja-build”, “ninja”, or “samu”. Previously the first of those names to appear anywhere in the “PATH” would be preferred.
  • “cmake(1)” gained a “-E rm” command-line tool that can be used to remove directories and files. This supersedes the existing “-E remove” and “-E remove_directory” tools and has better semantics.
Changes made since CMake 3.16 include the following.
New Features
============


Generators
----------

* "cmake(1)" gained a "Ninja Multi-Config" generator, which is similar
  to the "Ninja" generator but can be used to build multiple
  configurations at once.

* Visual Studio Generators learned to support per-config sources.
  Previously only Command-Line Build Tool Generators supported them.

* Visual Studio Generators for VS 2010 and above now support
  specifying the "VCTargetsPath" value for project files in
  "CMAKE_GENERATOR_TOOLSET" setting.

* Visual Studio Generators for VS 2010 and above learned to support
  .NET Standard and .NET Core.  See the "DOTNET_TARGET_FRAMEWORK"
  target property and associated "CMAKE_DOTNET_TARGET_FRAMEWORK"
  variable.


Languages
---------

* The "Compile Features" functionality now offers meta-features for
  the CUDA language standard levels (e.g. "cuda_std_03",
  "cuda_std_14").  See "CMAKE_CUDA_KNOWN_FEATURES".


Compilers
---------

* The IBM XL Fortran compiler is now supported by the "Ninja"
  generator.


Command-Line
------------

* "cmake(1)" gained a "--debug-find" command-line option to enable
  additional human-readable output on where find commands search.

* "cmake(1)" gained a "--trace-format" command-line option that can be
  used to set the "--trace" output format. Currently, the old human
  readable and the new JSON format are supported. The new JSON format
  is easier to parse automatically, than the existing format.

* "cmake(1)" gained a "-E rm" command-line tool that can be used to
  remove directories and files.  This supersedes the existing "-E
  remove" and "-E remove_directory" tools and has better semantics.


Commands
--------

* The "add_custom_command()" command learned to interpret paths in
  "DEPENDS" arguments that are specified relative to the current
  binary directory.

* The "foreach()" learned a new option "ZIP_LISTS" to iterate over
  multiple lists simultaneously.

* The "load_cache(READ_WITH_PREFIX)" command mode is now allowed when
  using "cmake -P" to Run a Script.

* The "message()" command learned to output context provided in the
  "CMAKE_MESSAGE_CONTEXT" variable for log levels "NOTICE" and below.
  Enable this output with the new "--log-context" command-line option
  or "CMAKE_MESSAGE_CONTEXT_SHOW" variable.

* The "message()" command gained new keywords "CHECK_START",
  "CHECK_PASS" and "CHECK_FAIL".

* "target_compile_options()" command now honors the "BEFORE" keyword
  more consistently.  See policy "CMP0101".

* The "FindCUDAToolkit" module was added to find the CUDA Toolkit
  without enabling CUDA as a language.


Variables
---------

* A "CMAKE_CTEST_ARGUMENTS" variable was added to specify a list of
  command-line arguments passed to CTest when running through the
  "test" (or "RUN_TESTS") target of the generated build system.

* The following variables are now defined inside a "function()":

  * "CMAKE_CURRENT_FUNCTION"

  * "CMAKE_CURRENT_FUNCTION_LIST_DIR"

  * "CMAKE_CURRENT_FUNCTION_LIST_FILE"

  * "CMAKE_CURRENT_FUNCTION_LIST_LINE"

* The "CMAKE_CUDA_RUNTIME_LIBRARY" variable and "CUDA_RUNTIME_LIBRARY"
  target property were introduced to select the CUDA runtime library
  used when linking targets that use CUDA.

* The "CMAKE_FIND_DEBUG_MODE" variable was introduced to print extra
  find call information during the cmake run to standard error. Output
  is designed for human consumption and not for parsing.

* The "CMAKE_EXPORT_COMPILE_COMMANDS" variable now takes its initial
  value from the "CMAKE_EXPORT_COMPILE_COMMANDS" environment variable
  if no explicit configuration is given.

* The "CMAKE__COMPILER_LAUNCHER" variable, if not set
  explicitly, now takes its initial value from the
  "CMAKE__COMPILER_LAUNCHER" environment variable.

* The "CMAKE_MESSAGE_LOG_LEVEL" variable can now be used to persist a
  log level between CMake runs, unlike the "--log-level" command line
  option which only applies to that particular run.

* The "CMAKE_XCODE_SCHEME_ENVIRONMENT" variable and
  "XCODE_SCHEME_ENVIRONMENT" target property were added to tell the
  "Xcode" generator to set the value of the "Custom Working Directory"
  schema option.


Properties
----------

* The "AIX_EXPORT_ALL_SYMBOLS" target property and associated
  "CMAKE_AIX_EXPORT_ALL_SYMBOLS" variable were created to optionally
  explicitly disbale automatic export of symbols from shared libraries
  on AIX.

* The "DEPRECATION" target property was added to mark a target as
  deprecated.  If a linked target is marked as deprecated, a warning
  with the deprecation message is issued at generate time.

* The "INSTALL_NAME_DIR" target property now supports "generator
  expressions". In particular, the "$" generator
  expression can be used to set the directory relative to the install-
  time prefix.

* Target properties "OSX_COMPATIBILITY_VERSION" and
  "OSX_CURRENT_VERSION" were added to set the "compatibility_version"
  and "curent_version" respectively on macOS. For backwards
  compatibility, if these properties are not set, "SOVERSION" and
  "VERSION" are used respectively as fallbacks.

* The "VS_DOTNET_DOCUMENTATION_FILE" target property was added to tell
  Visual Studio Generators to generate a "DocumentationFile" reference
  in ".csproj" files.


Modules
-------

* The "ExternalProject" module "ExternalProject_Add()" command gained
  a "GIT_SUBMODULES_RECURSE" option to specify whether Git submodules
  should be updated recursively.  The default is on to preserve
  existing behavior.

* The "FindCUDAToolkit" module was added to find the CUDA Toolkit
  without enabling CUDA as a language.

* The "FindCURL" module learned to find CURL using the
  "CURLConfig.cmake" package configuration file generated by CURL’s
  cmake buildsystem.  It also gained a new "CURL_NO_CURL_CMAKE" option
  to disable this behavior.

* The "FindFLEX" module’s "FLEX_TARGET" command now runs "flex" with
  "CMAKE_CURRENT_BINARY_DIR" as the working directory. See policy
  "CMP0098".

* The "FindLibArchive" module now provides an imported target for
  libarchive.

* The "FindPython" module has learned to find Python components in
  active virtual environments managed by "conda".

* The "FindPython3" and "FindPython" modules gained, respectively,
  variable "Python3_SOABI" and "Python_SOABI" giving the standard
  extension suffix for modules.

* The "FindLibXml2" module now provides an imported target for the
  "xmllint" executable


Autogen
-------

* "AUTOMOC" and "AUTOUIC" learned to process headers with a ".hh"
  extension.  See policy "CMP0100".


CTest
-----

* The "CTEST_CONFIGURATION_TYPE" variable is now set from the command
  line when "ctest(1)" is invoked with "-C ".

* The "ctest(1)" gained support for Dr. Memory to run memcheck runs.

* The "ctest(1)" tool gained a "--no-tests=<[error|ignore]>" option to
  explicitly set and unify the behavior between direct invocation and
  script mode if no tests were found.

* The "ctest(1)" tool gained a "--repeat :" option to specify
  conditions in which to repeat tests.  This generalizes the existing
  "--repeat-until-fail " option to add modes for "until-pass" and
  "after-timeout".

* The "ctest_test()" command gained a "REPEAT :" option to
  specify conditions in which to repeat tests.


CPack
-----

* The "CPack DragNDrop Generator" learned to use the
  "CPACK_DMG__FILE_NAME" variable to set a custom filename
  when packaging components into their own DMGs.

* The "CPack DragNDrop Generator" learned to handle RTF formatted
  license files.  When "CPACK_DMG_SLA_DIR" variable is set,
  ".license.rtf" is considered, but only as a fallback when
  the plaintext (".txt") file is not found in order to maintain
  backwards compatibility.

* The "CPack NSIS Generator" gained a new variable
  "CPACK_NSIS_MUI_HEADERIMAGE" to set the header image. To not break
  existing setups, it still defaults to "CPACK_PACKAGE_ICON" if the
  new variable is not set.

* The "CPack NSIS Generator" now supports "CPACK_NSIS_UNINSTALL_NAME".
  This can be used to specify the name of the Uninstall program.

* The "CPack NSIS Generator" now supports "CPACK_NSIS_WELCOME_TITLE"
  and "CPACK_NSIS_WELCOME_TITLE_3LINES". These can be used to specify
  the welcome page title and display it in 3 lines.

* The "CPack NSIS Generator" now supports "CPACK_NSIS_FINISH_TITLE"
  and "CPACK_NSIS_FINISH_TITLE_3LINES". These can be used to specify
  the finish page title and display it in 3 lines.

* The "CPack productbuild Generator" gained option
  "CPACK_PRODUCTBUILD_BACKGROUND" to specify a background image for
  the macOS installer.


Other
-----

* "ccmake(1)" now displays cache values using colors based on the
  entry type if the terminal supports color.

* "ccmake(1)" now displays messages and a progress bar during
  configure and generate.  It will keep the output displayed if any
  errors or warnings occurred.


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

* An explicit deprecation diagnostic was added for policy "CMP0068"
  and policy "CMP0069" ("CMP0067" and below were already deprecated).
  The "cmake-policies(7)" manual explains that the OLD behaviors of
  all policies are deprecated and that projects should port to the NEW
  behaviors.

* The "CPack PackageMaker Generator" generator has been deprecated
  because Xcode no longer distributes the PackageMaker tools. The
  undocumented "OSXX11" generator has also been deprecated.

* The "cmake(1)" command-line "-E remove" and "-E remove_directory"
  tools are deprecated in favor of the new "-E rm" tool.  The older
  tools always returned 0 if a named path did not exist even without
  the force option and cannot be fixed without breaking compatibility,
  and so have been superseded.


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

* The "file API" index file now emits a "multiConfig" flag specifying
  whether or not the generator supports multiple output
  configurations.

* Target link properties "INTERFACE_LINK_OPTIONS",
  "INTERFACE_LINK_DIRECTORIES" and "INTERFACE_LINK_DEPENDS" are now
  transitive over private dependencies on static libraries. See policy
  "CMP0099".

* When using MinGW tools, the "find_library()" command no longer finds
  ".dll" files by default.  Instead it expects ".dll.a" import
  libraries to be available.

* The "MinGW Makefiles" generator no longer issues an error if
  "sh.exe" is present in the environment’s "PATH".

* The "Ninja" generator now prefers the first ninja build tool to
  appear in the "PATH" no matter whether it is called "ninja-build",
  "ninja", or "samu".  Previously the first of those names to appear
  anywhere in the "PATH" would be preferred.

* With SDCC the "sdar" tool is now preferred over "sdcclib" as
  librarian. The latter was deprecated by SDCC 3.2.0 and removed in
  SDCC 3.8.6.

* With SDCC the default flags no longer include any target-specific
  flags. Previously the default flags were hard-coded for 8051.

* The "CMAKE_VS_GLOBALS" variable value now applies during compiler
  identification and in targets created by the "add_custom_target()"
  command.

* The "Xcode" generator no longer hard-codes "-Wmost", "-Wno-four-
  char-constants", and "-Wno-unknown-pragmas" warning flags.


2 comments to CMake 3.17.0-rc1 is ready for testing

  1. “Some of the more significant changes in CMake 17 are:

    I think this is supposed to say 3.17 unless CMake is switching to a new version numbering 🙂

Leave a Reply