CMake 3.17 Release Notes

Changes made since CMake 3.16 include the following.

New Features




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


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





  • 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. Moreover, commands Python3_add_library() and Python_add_library() gained the option WITH_SOABI to prefix the library suffix with the value of SOABI.

  • The FindLibXml2 module now provides an imported target for the xmllint executable.



  • The CTEST_CONFIGURATION_TYPE variable is now set from the command line when ctest(1) is invoked with -C <cfg>.

  • The ctest(1) tool 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 <mode>:<n> option to specify conditions in which to repeat tests. This generalizes the existing --repeat-until-fail <n> option to add modes for until-pass and after-timeout.

  • The ctest_test() command gained a REPEAT <mode>:<n> option to specify conditions in which to repeat tests.



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