I am proud to announce the fourth CMake 3.16 release candidate.
https://cmake.org/download/
Documentation is available at:
https://cmake.org/cmake/help/v3.16
Release notes appear below and are also published at
https://cmake.org/cmake/help/v3.16/release/3.16.html
Some of the more significant changes in CMake 3.16 are:
-
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. -
The “target_precompile_headers()” command was added to specify a
list of headers to precompile for faster compilation times. -
The “UNITY_BUILD” target property was added to tell generators to
batch include source files for faster compilation times. -
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 “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”. -
“ctest(1)” now has the ability to serialize tests based on
resource requirements for each test. See Resource Allocation for
details. -
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). -
“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. -
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)”.
CMake 3.16 Release Notes
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.
- “CMAKE_FIND_USE_PACKAGE_REGISTRY” - Controls the searching the
-
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
resource requirements for each test. See Resource 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.
Changes made since CMake 3.16.0-rc3:
Alex Turbov (1):
CPack: Remove CPACK_INSTALL_CMAKE_CONFIGURATIONS
Arkadiusz Drabczyk (1):
Tutorial: replace Unicode EN DASH with ASCII dash
Ben Boeckel (3):
Help: drop confusing reference to if()
from $<BOOL:>
FindPostgreSQL: support version encoding used in pre-10 releases
FindPostgreSQL: also search for libraries in the MacPorts suffix
Brad King (20):
CTest: Rename PROCESSES test property to RESOURCE_GROUPS
CTest: Rename “Processes” lexer to “ResourceGroups”
Help/dev: Update maintainer guide for Discourse transition
cmGlobalXCodeGenerator: Mark known source locations
Xcode: Fix generated references to CMakeLists.txt files
CMakeCPack: Update Debian package contact email
Help: Replace links to mailing lists with links to our Discourse Forum
README: Update links to cmake.org pages
README: Replace link to mailing list the CMake Discourse Forum
CMakeSystemSpecificInformation: Replace mailing list with Discourse Forum
FindBinUtils: Revert “Use the compiler to get the path to compiler tools”
Help: Document target_precompile_headers genex with angle brackets
CTestCoverageCollectGCOV: Fix typo in ctest_coverage_collect_gcov docs
expat: Update script to get Expat 2.2.9
expat: Update CMake build for 2.2.9
Tests: Fix ExportImport PCH expectation on Cray Classic compiler
Tests: Add RunCMake.CPackCommandLine case for multi-config package
Tests: Organize Objective C/C++ test directories
CPack: Restore support for custom package configuration templates
CMake 3.16.0-rc4
Charles Barto (1):
Help: Clarify load_cache documentation of first parameter
Craig Scott (14):
ForceToRelativePath: Fix spurious assertion when local path is root dir
Help: list(REMOVE_ITEM) removes all instances, not just the first found
Help: Typo and grammar fixes for file(GET_RUNTIME_DEPENDENCIES)
Tutorial: clean up typos, grammar and formatting
RPATH: Remove stray indent in generated file(RPATH_CHANGE) command
Help: Fix inaccuracies in INSTALL_REMOVE_ENVIRONMENT_RPATH docs
CTest: Rename hardware -> resources for CMake variables, command options
cmCTestMultiProcessHandler: Rename resource locking functions
CTest: Rename hardware -> resources for source code
CTest: Rename hardware -> resources for RunCMake tests
Help: Improve readability and fix inaccuracies in unity build docs
Help: Reorganise target_precompile_headers() docs for readability
Help: Provide guidance on INTERFACE for target_precompile_headers()
Help: Clarify compile features handling for OBJC and OBJCXX
Craig Sturdy (1):
FindwxWidgets: Add support for wxQt
Cristian Adam (13):
PCH: Add support for OBJC/OBJCXX languages
CMakeVersion.rc: Fix build with llvm-rc
ObjC: Mark explicitly the language for compilation
Unity build: Include GENERATED files into unity build
ObjC: Set same settings for all languages supported on Darwin
ObjC: Add try_compile support
PCH: No repeated path for internal generated PCH files
Unity: Don’t include sources with HEADER_FILE_ONLY property set
ObjC: Document ObjC/ObjCXX standard properties / variables
ObjC: Add OBJC/OBJCXX flags to Xcode projects
ObjC: Initialize ObjC/XX standard properties from C/C++ counterparts
ObjC: Proper initialization of ObjC/XX standard properties
PCH: Do not issue an error on duplicate target_precompile_headers call
Daniel Eiband (2):
cmFileAPI: Resolve full path in PCH source comparison
UnityBuild: Resolve full paths of unity source includes
Deniz Bahadir (1):
FindBoost: Prevent warning due to new meta-component “ALL” of Boost 1.73
Expat Upstream (1):
expat 2019-09-25 (a7bc26b6)
Grant Kim (1):
FindwxWidgets: Add link dependencies for MinGW
Kyle Edwards (2):
Help: Fix error in resource allocation example
Tests: Fix reliance on undefined behavior of cm::optional
Marc Aldorasi (2):
Help: Reference IMPORTED_IMPLIB from the IMPORTED_LOCATION documentation
Help: Both add_custom_command signatures support COMMAND_EXPAND_LISTS
Mateusz Janek (1):
source_group: ensure that passed file is not a directory
Robert Maynard (3):
Help: Remove out of date bounds on compile feature supported versions
find_package: Add support for CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY
Help: Clarify what ‘aware’ means as it relates to C++ standards
Saleem Abdulrasool (3):
Swift: Allow build and installed RPATHs to differ
Swift: support INSTALL_NAME_DIR
on Darwin
Swift: support -rpath
on Darwin
Tomasz Słodkowicz (1):
FindwxWidgets: Add support for 3.1.3 VS binaries