CMake 3.16.0-rc1 is ready for testing

I am proud to announce the first CMake 3.16 release candidate.

Documentation is available at:

Release notes appear below and are also published at

Some of the more significant changes in CMake 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.
    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
    hardware requirements for each test. See Hardware Allocation for
  • 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.
    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
  • 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.
    deprecated. Use the “CMAKE_FIND_USE_PACKAGE_REGISTRY” variable
  • The “GetPrerequisites” module has been deprecated, as it has been
    superceded by “file(GET_RUNTIME_DEPENDENCIES)”.

Questions or comments are always welcome!