CMake 3.17.0-rc2 is ready for testing
March 2, 2020
I am proud to announce the second 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. ---------------------------------------------------------------------------- Changes made since CMake 3.17.0-rc1: Brad King (4): Help: Replace UTF-8 apostrophe with ascii apostrophe KWSys: SystemTools: CopyFileIfDifferent: Fix endless recursion KWSys: Terminal: Add st-256color to VT100 color support whitelist CMake 3.17.0-rc2 Craig Scott (3): Tests: Fix test_clean target missing some test directories Tests: Add missing ExternalProject smoke tests ExternalProject: Quote each git --config option to handle spaces Cristian Adam (1): PCH: Copy the timestamp from an absolute header file Francisco Facioni (1): Ninja: Do not use nvcc response files with non-nvcc tools Kyle Edwards (14): Ninja Multi-Config: Fix issue with framework dependencies and Autogen Refactor: Require detail when calling cmCTestRunTest::StartFailure() CTest: Improve error reporting with bad working directory for tests Refactor: Provide more detailed error information from TryAllocateResources() CTest: Provide more detailed information on resource allocation error Tests: Fix CustComDepend test for Ninja Multi-Config Tests: Fix CFBundleTest for Ninja Multi-Config Help: Note that CMAKE_CFG_INTDIR is not fully supported on Ninja Multi-Config Help: Clarify that the CTest resource allocation feature doesn't oversubscribe Ninja Multi-Config: Remove "NMC" from variable names Generator: Don't allow Ninja Multi-Config variables on other generators Ninja Multi-Config: Always generate build.ninja foreach: Fix crash when parsing invalid integer foreach: Set fatal error on invalid range Marc Chevrier (2): FindPython: Mark non-public cache entries INTERNAL FindPython: Do not cache computed result variables Richard (1): Autogen: Recognize the new Q_NAMESPACE_EXPORT macro in AUTOMOC Robert Maynard (1): FindCUDA: Only depend on Threads::Threads on platforms that need it Rolf Eike Beer (2): FindPkgConfig: set policies CMP0054 and CMP0057 to new Tests: fix RunCMake.Make test when run on systems with non-english locale Saleem Abdulrasool (1): Swift: support `-rpath` for executables Sergey Larin (1): PCH: Clang: Update PCH usage flags to include original header