blob: abd746314cadd488c5d16c84669cea3c87ceb004 [file] [log] [blame]
CMake 3.17 Release Notes
************************
.. only:: html
.. contents::
Changes made since CMake 3.16 include the following.
New Features
============
Generators
----------
* :manual:`cmake(1)` gained a :generator:`Ninja Multi-Config` generator,
which is similar to the :generator:`Ninja` generator but can be used to build
multiple configurations at once.
* :ref:`Visual Studio Generators` learned to support per-config sources.
Previously only :ref:`Command-Line Build Tool Generators` supported them.
* :ref:`Visual Studio Generators` for VS 2010 and above now support
specifying the ``VCTargetsPath`` value for project files in
:variable:`CMAKE_GENERATOR_TOOLSET` setting.
* :ref:`Visual Studio Generators` for VS 2010 and above learned to
support .NET Standard and .NET Core. See the
:prop_tgt:`DOTNET_TARGET_FRAMEWORK` target property and
associated :variable:`CMAKE_DOTNET_TARGET_FRAMEWORK` variable.
Languages
---------
* The :manual:`Compile Features <cmake-compile-features(7)>` functionality
now offers meta-features for the CUDA language standard levels
(e.g. ``cuda_std_03``, ``cuda_std_14``). See
:prop_gbl:`CMAKE_CUDA_KNOWN_FEATURES`.
Compilers
---------
* The IBM XL Fortran compiler is now supported by the :generator:`Ninja`
generator.
Command-Line
------------
* :manual:`cmake(1)` gained a ``--debug-find`` command-line option to
enable additional human-readable output on where ``find_*`` commands search.
* :manual:`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.
* :manual:`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 :command:`add_custom_command` command learned to interpret paths in
``DEPENDS`` arguments that are specified relative to the current
binary directory.
* The :command:`foreach` command learned a new ``ZIP_LISTS`` option to iterate
over multiple lists simultaneously.
* The :command:`load_cache(READ_WITH_PREFIX)` command mode is now allowed
when using ``cmake -P`` to :ref:`Run a Script <Script Processing Mode>`.
* The :command:`message` command learned to output context provided in
the :variable:`CMAKE_MESSAGE_CONTEXT` variable for log levels
``NOTICE`` and below. Enable this output with the new ``--log-context``
command-line option or :variable:`CMAKE_MESSAGE_CONTEXT_SHOW` variable.
* The :command:`message` command gained new keywords ``CHECK_START``,
``CHECK_PASS`` and ``CHECK_FAIL``.
* The :command:`target_compile_options` command now honors the ``BEFORE``
keyword more consistently. See policy :policy:`CMP0101`.
Variables
---------
* A :variable:`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 :command:`function`:
- :variable:`CMAKE_CURRENT_FUNCTION`
- :variable:`CMAKE_CURRENT_FUNCTION_LIST_DIR`
- :variable:`CMAKE_CURRENT_FUNCTION_LIST_FILE`
- :variable:`CMAKE_CURRENT_FUNCTION_LIST_LINE`
* The :variable:`CMAKE_CUDA_RUNTIME_LIBRARY` variable and
:prop_tgt:`CUDA_RUNTIME_LIBRARY` target property were introduced to
select the CUDA runtime library used when linking targets that
use CUDA.
* The :variable:`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 :variable:`CMAKE_EXPORT_COMPILE_COMMANDS` variable now takes its
initial value from the :envvar:`CMAKE_EXPORT_COMPILE_COMMANDS` environment
variable if no explicit configuration is given.
* The :variable:`CMAKE_<LANG>_COMPILER_LAUNCHER` variable, if not set
explicitly, now takes its initial value from the
:envvar:`CMAKE_<LANG>_COMPILER_LAUNCHER` environment variable.
* The :variable:`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 :variable:`CMAKE_XCODE_SCHEME_ENVIRONMENT` variable was added
to initialize the :prop_tgt:`XCODE_SCHEME_ENVIRONMENT` target property.
* The :variable:`CMAKE_XCODE_SCHEME_WORKING_DIRECTORY` variable and
associated :prop_tgt:`XCODE_SCHEME_WORKING_DIRECTORY` target property
were added to tell the :generator:`Xcode` generator to set the value of
the ``Custom Working Directory`` schema option.
Properties
----------
* The :prop_tgt:`AIX_EXPORT_ALL_SYMBOLS` target property and associated
:variable:`CMAKE_AIX_EXPORT_ALL_SYMBOLS` variable were created to
optionally explicitly disable automatic export of symbols from shared
libraries on AIX.
* The :prop_tgt:`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 :prop_tgt:`INSTALL_NAME_DIR` target property now supports
:manual:`generator expressions <cmake-generator-expressions(7)>`.
In particular, the ``$<INSTALL_PREFIX>`` generator expression can
be used to set the directory relative to the install-time prefix.
* Target properties :prop_tgt:`MACHO_COMPATIBILITY_VERSION` and
:prop_tgt:`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, :prop_tgt:`SOVERSION` and :prop_tgt:`VERSION`
are used respectively as fallbacks.
* The :prop_tgt:`VS_DOTNET_DOCUMENTATION_FILE` target property was added
to tell :ref:`Visual Studio Generators` to generate a ``DocumentationFile``
reference in ``.csproj`` files.
Modules
-------
* The :module:`ExternalProject` module :command:`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 :module:`FindCUDAToolkit` module was added to find the
CUDA Toolkit without enabling CUDA as a language.
* The :module:`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 :module:`FindFLEX` module's ``FLEX_TARGET`` command now runs ``flex``
with :variable:`CMAKE_CURRENT_BINARY_DIR` as the working directory.
See policy :policy:`CMP0098`.
* The :module:`FindLibArchive` module now provides an imported target
for libarchive.
* The :module:`FindPython` module has learned to find Python components
in active virtual environments managed by ``conda``.
* The :module:`FindPython3` and :module:`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 :module:`FindLibXml2` module now provides an imported target for the
``xmllint`` executable.
Autogen
-------
* :prop_tgt:`AUTOMOC` and :prop_tgt:`AUTOUIC` learned to process headers
with a ``.hh`` extension. See policy :policy:`CMP0100`.
CTest
-----
* The :variable:`CTEST_CONFIGURATION_TYPE` variable is now set from the
command line when :manual:`ctest(1)` is invoked with ``-C <cfg>``.
* The :manual:`ctest(1)` tool gained support for Dr. Memory to run
memcheck runs.
* The :manual:`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 :manual:`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 :command:`ctest_test` command gained a ``REPEAT <mode>:<n>`` option
to specify conditions in which to repeat tests.
CPack
-----
* The :cpack_gen:`CPack DragNDrop Generator` learned to use
the :variable:`CPACK_DMG_<component>_FILE_NAME` variable
to set a custom filename when packaging components into
their own DMGs.
* The :cpack_gen:`CPack DragNDrop Generator` learned to handle
RTF formatted license files. When :variable:`CPACK_DMG_SLA_DIR`
variable is set, ``<language>.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_gen:`CPack NSIS Generator` gained a new variable
:variable:`CPACK_NSIS_MUI_HEADERIMAGE` to set the header image.
To not break existing setups, it still defaults to
:variable:`CPACK_PACKAGE_ICON` if the new variable is not set.
* The :cpack_gen:`CPack NSIS Generator` now supports
:variable:`CPACK_NSIS_UNINSTALL_NAME`.
This can be used to specify the name of the Uninstall program.
* The :cpack_gen:`CPack NSIS Generator` now supports
:variable:`CPACK_NSIS_WELCOME_TITLE` and
:variable:`CPACK_NSIS_WELCOME_TITLE_3LINES`.
These can be used to specify the welcome page title and display it in 3 lines.
* The :cpack_gen:`CPack NSIS Generator` now supports
:variable:`CPACK_NSIS_FINISH_TITLE` and
:variable:`CPACK_NSIS_FINISH_TITLE_3LINES`.
These can be used to specify the finish page title and display it in 3 lines.
* The :cpack_gen:`CPack productbuild Generator` gained support for a
:variable:`CPACK_PRODUCTBUILD_BACKGROUND` variable to specify a background
image for the macOS installer.
Other
-----
* :manual:`ccmake(1)` now displays cache values using colors
based on the entry type if the terminal supports color.
* :manual:`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 :manual:`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_gen:`CPack PackageMaker Generator` generator has been
deprecated because Xcode no longer distributes the PackageMaker tools.
The undocumented ``OSXX11`` generator has also been deprecated.
* The :manual:`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.
* The :cpack_gen:`CPack NSIS Generator` now requires NSIS 3.0 or later.
Other Changes
=============
* The :manual:`file API <cmake-file-api(7)>` index file now emits a
``multiConfig`` flag specifying whether or not the generator supports
multiple output configurations.
* Target link properties :prop_tgt:`INTERFACE_LINK_OPTIONS`,
:prop_tgt:`INTERFACE_LINK_DIRECTORIES` and
:prop_tgt:`INTERFACE_LINK_DEPENDS` are now transitive over private
dependencies on static libraries.
See policy :policy:`CMP0099`.
* When using MinGW tools, the :command:`find_library` command no longer
finds ``.dll`` files by default. Instead, it expects ``.dll.a`` import
libraries to be available.
* The :generator:`MinGW Makefiles` generator no longer issues an error if
``sh.exe`` is present in the environment's ``PATH``.
* The :generator:`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 :variable:`CMAKE_VS_GLOBALS` variable value now applies during
compiler identification and in targets created by the
:command:`add_custom_target` command.
* The :generator:`Xcode` generator no longer hard-codes ``-Wmost``,
``-Wno-four-char-constants``, and ``-Wno-unknown-pragmas`` warning flags.
Updates
=======
Changes made since CMake 3.17.0 include the following.
3.17.1
------
* CMake 3.17.0 updated the :cpack_gen:`CPack NSIS Generator` with changes
that require NSIS 3.0 or later. CMake 3.17.1 now enforces the use
of a sufficiently new version.
3.17.3
------
* Selection of the Objective C or C++ compiler now considers the
:envvar:`CC` or :envvar:`CXX` environment variable if the
:envvar:`OBJC` or :envvar:`OBJCXX` environment variable is not set.
* The :module:`FindPkgConfig` module now extracts include directories
prefixed with ``-isystem`` into the ``*_INCLUDE_DIRS`` variables and
:prop_tgt:`INTERFACE_INCLUDE_DIRECTORIES` target properties.
Previously they would be places in ``*_CFLAGS_OTHER`` variables and
:prop_tgt:`INTERFACE_COMPILE_OPTIONS` target properties.
3.17.5
------
* The default value of :variable:`CMAKE_AUTOMOC_PATH_PREFIX` was changed to
``OFF`` because this feature can break existing projects that have
identically named header files in different include directories.
This restores compatibility with behavior of CMake 3.15 and below.
The default was also changed to ``OFF`` in 3.16.9.