Changes made since CMake 3.15 include the following.

New Features

============

Languages

---------

* CMake learned to support the Objective C ("OBJC") and Objective

C++ ("OBJCXX") languages. They may be enabled via the "project()"

and "enable_language()" commands. When "OBJC" or "OBJCXX" is

enabled, source files with the ".m" or ".mm", respectively, will be

compiled as Objective C or C++. Otherwise they will be treated as

plain C++ sources as they were before.

Compilers

---------

* The "Clang" compiler is now supported on "Solaris".

Platforms

---------

* On AIX, executables using the "ENABLE_EXPORTS" target property now

produce a linker import file with a ".imp" extension in addition to

the executable file. Plugins (created via "add_library()" with the

"MODULE" option) that use "target_link_libraries()" to link to the

executable for its symbols are now linked using the import file. The

"install(TARGETS)" command now installs the import file as an

"ARCHIVE" artifact.

* On AIX, runtime linking is no longer enabled by default. CMake

provides the linker enough information to resolve all symbols up

front. One may manually enable runtime linking for shared libraries

and/or loadable modules by adding "-Wl,-G" to their link flags (e.g.

in the "CMAKE_SHARED_LINKER_FLAGS" or "CMAKE_MODULE_LINKER_FLAGS"

variable). One may manually enable runtime linking for executables

by adding "-Wl,-brtl" to their link flags (e.g. in the

"CMAKE_EXE_LINKER_FLAGS" variable).

Command-Line

------------

* "cmake(1)" "-E" now supports "true" and "false" commands, which do

nothing while returning exit codes of 0 and 1, respectively.

* "cmake(1)" gained a "--trace-redirect=" command line option

that can be used to redirect "--trace" output to a file instead of

"stderr".

* The "cmake(1)" "--loglevel" command line option has been renamed

to "--log-level" to make it consistent with the naming of other

command line options. The "--loglevel" option is still supported to

preserve backward compatibility.

Commands

--------

* The "add_test()" command learned the option "COMMAND_EXPAND_LISTS"

which causes lists in the "COMMAND" argument to be expanded,

including lists created by generator expressions.

* The "file()" command learned a new sub-command,

"GET_RUNTIME_DEPENDENCIES", which allows you to recursively get the

list of libraries linked by an executable or library. This sub-

command is intended as a replacement for "GetPrerequisites".

* The "find_file()", "find_library()", "find_path()",

"find_package()", and "find_program()" commands have learned to

check the following variables to control searching

* "CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH" - Controls the searching

the cmake-specific environment variables.

* "CMAKE_FIND_USE_CMAKE_PATH" - Controls the searching the cmake-

specific cache variables.

* "CMAKE_FIND_USE_CMAKE_SYSTEM_PATH" - Controls the searching

cmake platform specific variables.

* "CMAKE_FIND_USE_PACKAGE_ROOT_PATH" - Controls the searching of

"_ROOT" variables.

* "CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH" - Controls the

searching the standard system environment variables.

* The "find_package()" command has learned to check the following

variables to control searching

* "CMAKE_FIND_USE_PACKAGE_REGISTRY" - Controls the searching the

cmake user registry.

* The "message()" command learned indentation control with the new

"CMAKE_MESSAGE_INDENT" variable.

* The "target_precompile_headers()" command was added to specify a

list of headers to precompile for faster compilation times.

Variables

---------

* The "CMAKE_CUDA_RESOLVE_DEVICE_SYMBOLS" variable has been

introduced to optionally initialize the

"CUDA_RESOLVE_DEVICE_SYMBOLS" target property.

* The "CMAKE_ECLIPSE_RESOURCE_ENCODING" variable was added to

specify the resource encoding for the the "Eclipse CDT4" extra

generator.

Properties

----------

* The "BUILD_RPATH" and "INSTALL_RPATH" target properties now

support "generator expressions".

* The "INSTALL_REMOVE_ENVIRONMENT_RPATH" target property was added

to remove compiler-defined "RPATH" entries from a target. This

property is initialized by the

"CMAKE_INSTALL_REMOVE_ENVIRONMENT_RPATH" variable.

* The "PRECOMPILE_HEADERS" target property was added to specify a

list of headers to precompile for faster compilation times. Set it

using the "target_precompile_headers()" command.

* The "UNITY_BUILD" target property was added to tell generators to

batch include source files for faster compilation times.

* The "VS_CONFIGURATION_TYPE" target property now supports

"generator expressions".

* The "VS_DPI_AWARE" target property was added to tell Visual Studio

Generators to set the "EnableDpiAwareness" property in ".vcxproj"

files.

* The "XCODE_SCHEME_DEBUG_DOCUMENT_VERSIONING" target property was

added to tell the "Xcode" generator to set the value of the "Allow

debugging when using document Versions Browser" schema option.

Modules

-------

* The "FindDoxygen" module "doxygen_add_docs()" command gained a new

"USE_STAMP_FILE" option. When this option present, the custom

target created by the command will only re-run Doxygen if any of the

source files have changed since the last successful run.

* The "FindGnuTLS" module now provides an imported target.

* The "FindPackageHandleStandardArgs" module

"find_package_handle_standard_args()" command gained a new

"REASON_FAILURE_MESSAGE" option to specify a message giving the

reason for the failure.

* The "FindPkgConfig" module "pkg_search_module()" macro now defines

a "_MODULE_NAME" result variable containing the first

matching module name.

* The "FindPython3" and "FindPython" modules gained options to

control which "ABIs" will be searched.

* The "FindPython3", "FindPython2", and "FindPython" modules now

support direct specification of artifacts via cache entries.

Autogen

-------

* When using "AUTOMOC", CMake now generates the "-p" path prefix

option for "moc". This ensures that "moc" output files are

identical on different build setups (given, that the headers

compiled by "moc" are in an "include directory"). Also it ensures

that "moc" output files will compile correctly when the source

and/or build directory is a symbolic link.

The "moc" path prefix generation behavior can be configured by

setting the new "CMAKE_AUTOMOC_PATH_PREFIX" variable and/or

"AUTOMOC_PATH_PREFIX" target property.

CTest

-----

* "ctest(1)" now has the ability to serialize tests based on

hardware requirements for each test. See Hardware Allocation for

details.

* A new test property, "SKIP_REGULAR_EXPRESSION", has been added.

This property is similar to "FAIL_REGULAR_EXPRESSION" and

"PASS_REGULAR_EXPRESSION", but with the same meaning as

"SKIP_RETURN_CODE". This is useful, for example, in cases where the

user has no control over the return code of the test. For example,

in Catch2, the return value is the number of assertion failed,

therefore it is impossible to use it for "SKIP_RETURN_CODE".

CPack

-----

* CPack variable "CPACK_INSTALL_CMAKE_CONFIGURATIONS" was added to

control what configurations are to be packaged for multi-

configuration CMake generators.

* The "CPack DEB Generator" is now able to format generic text

(usually used as the description for multiple CPack generators)

according to the Debian Policy Manual. See the

"CPACK_PACKAGE_DESCRIPTION_FILE" and

"CPACK_DEBIAN__DESCRIPTION" variables.

* The "CPack Archive Generator" learned to generate ".tar.zst"

packages with Zstandard compression.

Deprecated and Removed Features

===============================

* An explicit deprecation diagnostic was added for policy "CMP0067"

("CMP0066" 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 "CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY" variable has been

deprecated. Use the "CMAKE_FIND_USE_PACKAGE_REGISTRY" variable

instead.

* The "GetPrerequisites" module has been deprecated, as it has been

superceded by "file(GET_RUNTIME_DEPENDENCIES)".

* The "CPACK_INSTALL_SCRIPT" variable has been deprecated in favor

of the new, more accurately named "CPACK_INSTALL_SCRIPTS" variable.

Other Changes

=============

* The "cmake(1)" "-C " option now evaluates the

initial cache script with "CMAKE_SOURCE_DIR" and "CMAKE_BINARY_DIR"

set to the top-level source and build trees.

* The "cmake(1)" "-E remove_directory" command-line tool, when given

the path to a symlink to a directory, now removes just the symlink.

It no longer removes content of the linked directory.

* The "ctest(1)" "--build-makeprogram" command-line option now

specifies the make program used when configuring a project with the

"Ninja" generator or the Makefile Generators.

* The "ExternalProject" module "ExternalProject_Add()" command has

been updated so that "GIT_SUBMODULES """ initializes no submodules.

See policy "CMP0097".

* The "FindGTest" module has been updated to recognize MSVC build

trees generated by GTest 1.8.1.

* The "project()" command no longer strips leading zeros in version

components. See policy "CMP0096".

* The Qt Compressed Help file is now named "CMake.qch", which no

longer contains the release version in the file name. When CMake is

upgraded in-place, the name and location of this file will remain

constant. Tools such as IDEs, help viewers, etc. should now be able

to refer to this file at a fixed location that remains valid across

CMake upgrades.

* "RPATH" entries are properly escaped in the generated CMake

scripts used for installation. See policy "CMP0095".

* When using "CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS" on Windows the auto-

generated exports are now updated only when the object files

providing the symbols are updated.