# CMake 3.17.0-rc3 is ready for testing

**URL:** https://discourse.cmake.org/t/cmake-3-17-0-rc3-is-ready-for-testing/798
**Category:** Announcements
**Created:** [March 12, 2020, 3:54pm UTC](https://discourse.cmake.org/t/cmake-3-17-0-rc3-is-ready-for-testing/798 "2020-03-12T15:54:05Z")
**Posts on this page:** 1
**Page:** 1

<div class="post-metadata">

### Author: ![robert.maynard](https://discourse.cmake.org/user_avatar/discourse.cmake.org/robert.maynard/32/4_2.png) [@robert.maynard](https://discourse.cmake.org/u/robert.maynard)
#### Post date: [March 12, 2020, 3:54pm UTC](https://discourse.cmake.org/t/cmake-3-17-0-rc3-is-ready-for-testing/798/1 "2020-03-12T15:54:06Z")

</div>

I am proud to announce the third CMake 3.17 release candidate.  
[https://cmake.org/download/](https://cmake.org/download/)

Documentation is available at:  
[https://cmake.org/cmake/help/v3.17](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](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.

# CMake 3.17 Release Notes

## 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()” command learned a new “ZIP\_LISTS” option 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”.

- The “target\_compile\_options()” command now honors the “BEFORE”  
keyword more consistently. See policy “CMP0101”.

### 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()”:

- 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 was added to  
initialize the “XCODE\_SCHEME\_ENVIRONMENT” target property.

- The “CMAKE\_XCODE\_SCHEME\_WORKING\_DIRECTORY” variable and associated  
“XCODE\_SCHEME\_WORKING\_DIRECTORY” 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 disable 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 “$\<INSTALL\_PREFIX\>” generator  
expression can be used to set the directory relative to the install-  
time prefix.

- Target properties “MACHO\_COMPATIBILITY\_VERSION” and  
“MACHO\_CURRENT\_VERSION” were added to set the  
“compatibility\_version” and “curent\_version”, respectively, for  
Mach-O binaries. 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. 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.

### 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)” 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 :” 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 support for a  
“CPACK\_PRODUCTBUILD\_BACKGROUND” variable 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.

# Changes made since CMake 3.16.0-rc2:

Betsy McPhail (1):

- CTest: Fix our internal CURL\_DEBUGFUNCTION to conform to CURL docs

Bo Anderson (1):

- FindPython: Convert env CMAKE\_FRAMEWORK\_PATH to CMake path

Brad King (5):

- Help: Clarify add\_custom\_command DEPENDS conversion to file paths
- Help: Fix toctree order of Xcode scheme variable and property
- Help: Fix 3.17 release notes for Xcode scheme settings
- macOS: Rename OSX\__VERSION properties to MACHO_\_VERSION
- CMake 3.17.0-rc3

Craig Scott (1):

- Help: Cleanup minor typos and grammar in 3.17 release notes

Jesse Gorzinski (1):

- libuv: Add support for building on IBM i (OS400)

Kyle Edwards (2):

- Ninja Multi-Config: Don’t build target dependencies for custom commands
- Ninja Multi-Config: Fix spurious unused variable warning

Marc Chevrier (2):

- FindPython: python\_add\_library can now manage SOABI suffix.
- Apple Clang: add flags for C++17 standard

Raul Tambre (2):

- cm\_cxx\_features: Filter out CUDA installation warnings
- cmAlgorithms: Fix -Wnon-c-typedef-for-linkage warnings

Robert Maynard (1):

- CUDAToolkit: Mark find queries as advanced variables

Saleem Abdulrasool (3):

- Swift: support Ninja Multi-Config
- Swift: repair RPATH handling for macOS
- Swift: Fix quoting of library search paths with spaces

ThePrez (1):

- cmstd: Remove -isystem option for IBM i (OS400)

Thomas Bernard (1):

- llvm-rc: Forward DEFINES instead of FLAGS
