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.
“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 🙂
Next release: CMake 3000!