CMake 3.16 Release Notes¶
Contents
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 theproject()
andenable_language()
commands. WhenOBJC
orOBJCXX
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 onSolaris
.
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 viaadd_library()
with theMODULE
option) that usetarget_link_libraries()
to link to the executable for its symbols are now linked using the import file. Theinstall(TARGETS)
command now installs the import file as anARCHIVE
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 theCMAKE_SHARED_LINKER_FLAGS
orCMAKE_MODULE_LINKER_FLAGS
variable). One may manually enable runtime linking for executables by adding-Wl,-brtl
to their link flags (e.g. in theCMAKE_EXE_LINKER_FLAGS
variable).
Command-Line¶
cmake(1)
-E
now supportstrue
andfalse
commands, which do nothing while returning exit codes of 0 and 1, respectively.cmake(1)
gained a--trace-redirect=<file>
command line option that can be used to redirect--trace
output to a file instead ofstderr
.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 optionCOMMAND_EXPAND_LISTS
which causes lists in theCOMMAND
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 forGetPrerequisites
.The
find_file()
,find_library()
,find_path()
,find_package()
, andfind_program()
commands have learned to check the following variables to control the default behavior for groups of search locations:CMAKE_FIND_USE_PACKAGE_ROOT_PATH
- Controls the default behavior of searching the<PackageName>_ROOT
variables.CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH
- Controls the default behavior of searching the CMake-specific environment variables.CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH
- Controls the default behavior of searching the standard system environment variables.CMAKE_FIND_USE_CMAKE_PATH
- Controls the default behavior of searching the CMake-specific cache variables.CMAKE_FIND_USE_CMAKE_SYSTEM_PATH
- Controls the default behavior of searching the platform-specific CMake variables.
The
find_package()
command has learned to check theCMAKE_FIND_USE_PACKAGE_REGISTRY
variable to control the default behavior of searching the CMake user package registry and to check theCMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY
variable to control the default behavior of searching the CMake system package registry.The
message()
command learned indentation control with the newCMAKE_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 theCUDA_RESOLVE_DEVICE_SYMBOLS
target property.The
CMAKE_ECLIPSE_RESOURCE_ENCODING
variable was added to specify the resource encoding for the theEclipse CDT4
extra generator.The
CMAKE_UNITY_BUILD
variable was added to initialize theUNITY_BUILD
target property to tell generators to batch include source files for faster compilation times.
Properties¶
The
BUILD_RPATH
andINSTALL_RPATH
target properties now supportgenerator expressions
.The
INSTALL_REMOVE_ENVIRONMENT_RPATH
target property was added to remove compiler-definedRPATH
entries from a target. This property is initialized by theCMAKE_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 thetarget_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 supportsgenerator expressions
.The
VS_DPI_AWARE
target property was added to tell Visual Studio Generators to set theEnableDpiAwareness
property in.vcxproj
files.The
XCODE_SCHEME_DEBUG_DOCUMENT_VERSIONING
target property was added to tell theXcode
generator to set the value of theAllow debugging when using document Versions Browser
schema option.
Modules¶
The
FindDoxygen
moduledoxygen_add_docs()
command gained a newUSE_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
modulefind_package_handle_standard_args()
command gained a newREASON_FAILURE_MESSAGE
option to specify a message giving the reason for the failure.The
FindPkgConfig
modulepkg_search_module()
macro now defines a<prefix>_MODULE_NAME
result variable containing the first matching module name.The
FindPython3
andFindPython
modules gained options to control whichABIs
will be searched.The
FindPython3
,FindPython2
, andFindPython
modules now support direct specification of artifacts via cache entries.
Autogen¶
When using
AUTOMOC
, the newCMAKE_AUTOMOC_PATH_PREFIX
variable orAUTOMOC_PATH_PREFIX
target property may be enabled to generate the-p
path prefix option formoc
. This ensures thatmoc
output files are identical on different build setups (given, that the headers compiled bymoc
are in aninclude directory
). Also it ensures thatmoc
output files will compile correctly when the source and/or build directory is a symbolic link.
CTest¶
ctest(1)
now has the ability to schedule tests based on resource requirements for each test. See Resource Allocation for details.A new test property,
SKIP_REGULAR_EXPRESSION
, has been added. This property is similar toFAIL_REGULAR_EXPRESSION
andPASS_REGULAR_EXPRESSION
, but with the same meaning asSKIP_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 forSKIP_RETURN_CODE
.
CPack¶
cpack(1)
learned support for multiple configurations for-C
option.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 theCPACK_PACKAGE_DESCRIPTION_FILE
andCPACK_DEBIAN_<COMPONENT>_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). Thecmake-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 theCMAKE_FIND_USE_PACKAGE_REGISTRY
variable instead.The
GetPrerequisites
module has been deprecated, as it has been superceded byfile(GET_RUNTIME_DEPENDENCIES)
.The
CPACK_INSTALL_SCRIPT
variable has been deprecated in favor of the new, more accurately namedCPACK_INSTALL_SCRIPTS
variable.
Other Changes¶
The
cmake(1)
-C <initial-cache>
option now evaluates the initial cache script withCMAKE_SOURCE_DIR
andCMAKE_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 theNinja
generator or the Makefile Generators.The
ExternalProject
moduleExternalProject_Add()
command has been updated so thatGIT_SUBMODULES ""
initializes no submodules. See policyCMP0097
.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 policyCMP0096
.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 policyCMP0095
.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.
Updates¶
Changes made since CMake 3.16.0 include the following.
3.16.2¶
CMake 3.16.0 and 3.16.1 processed
.hh
files withAUTOMOC
. This was a behavior change from CMake 3.15 and below that can break existing projects, so it has been reverted as of 3.16.2.
3.16.5¶
The
FindPython
,FindPython2
, andFindPython3
modules no longer create cache entries forPython{,2,3}_LIBRARY_RELEASE
andPython{,2,3}_LIBRARY_DEBUG
. Those values are always computed from other results and so should not be cached. The entries were created by CMake 3.16.0 through 3.16.4 but were alwaysFORCE
-set and could not be meaningfully edited by users.Additionally, the modules no longer expose their internal
_Python*
cache entries publicly. CMake 3.16.0 through 3.16.4 accidentally made them visible as advanced cache entries.
3.16.7¶
Selection of the Objective C or C++ compiler now considers the
CC
orCXX
environment variable if theOBJC
orOBJCXX
environment variable is not set.The
FindPkgConfig
module now extracts include directories prefixed with-isystem
into the*_INCLUDE_DIRS
variables andINTERFACE_INCLUDE_DIRECTORIES
target properties. Previously they would be places in*_CFLAGS_OTHER
variables andINTERFACE_COMPILE_OPTIONS
target properties.
3.16.9¶
The default value of
CMAKE_AUTOMOC_PATH_PREFIX
was changed toOFF
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.