CMake 3.16 Release Notes

Changes made since CMake 3.15 include the following.

New Features


  • 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 Clang compiler is now supported on Solaris.


  • 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=<file> 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.






  • 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.



Deprecated and Removed Features

Other Changes

  • The cmake(1) -C <initial-cache> 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.