CMake 3.14 Release Notes

Changes made since CMake 3.13 include the following.

New Features


  • The Visual Studio 16 2019 generator was added. This is experimental and based on “Visual Studio 2019 Preview 4” because this version of VS has not been released.

    The VS 2019 generator differs from generators for earlier versions in that it does not provide variants that specify the target platform in the generator name. Instead CMAKE_GENERATOR_PLATFORM must be used, e.g. through the -A command-line option. Furthermore, the default target platform (architecture) is now based on the host platform. The VS host toolset selection is now based on the host architecture as well.

  • The Green Hills MULTI generator has been updated:

    • Now supports Object Libraries.
    • Now warns on unsupported project types such as shared libraries.
    • Now generates a top-level <PROJECT-NAME>.top.gpj for each directory calling the project() command. The top-level project file default.gpj is no longer created.
    • Now honors target renaming and destination output control properties such as RUNTIME_OUTPUT_DIRECTORY and OUTPUT_NAME. This also fixes support for installation rules generated by install().
    • Now honors source file properties INCLUDE_DIRECTORIES, COMPILE_DEFINITIONS, and COMPILE_OPTIONS.
    • Now supports Dynamic Download Integrity Applications which did not include Integrate Files via GHS_INTEGRITY_APP and setting a target link flag of -dynamic.
    • The contents of project files now sorts sources groups and files by name. Set the GHS_NO_SOURCE_GROUP_FILE target property to ON to generate a single project file for the target instead of a project file for each source group. Set the CMAKE_GHS_NO_SOURCE_GROUP_FILE variable to enable this for all targets.

File-Based API

  • A file-based api for clients to get semantic buildsystem information has been added. See the cmake-file-api(7) manual. This is intended to replace the cmake-server(7) mode for IDEs.



  • The cmake(1) Build Tool Mode (cmake --build) gained --verbose and -v options to specify verbose build output. Some generators such as Xcode don’t support this option currently.
  • The cmake(1) -E compare_files command learned a new --ignore-eol option to specify that end-of-line differences (e.g. LF vs CRLF) should be ignored when comparing files.
  • The cmake-gui(1) dialog gained new -S and -B arguments to explicitly specify source and build directories.


  • The file() command learned a new sub-command, CREATE_LINK, which can be used to create hard or symbolic links.
  • The file() command learned a new sub-command, READ_SYMLINK, which can be used to determine the path that a symlink points to.
  • The file() command gained a SIZE mode to get the size of a file on disk.
  • The find_package() command learned to optionally resolve symbolic links in the paths to package configuration files. See the CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS variable.
  • The get_filename_component() command gained new LAST_EXT and NAME_WLE variants to work with the extension after the last . in the name.
  • The if() command gained support for checking if cache variables are defined with the DEFINED CACHE{VAR} syntax.
  • The install(CODE) and install(SCRIPT) commands learned to support generator expressions. See policy CMP0087.
  • The install(TARGETS) command learned how to install to an appropriate default directory for a given target type, based on variables from the GNUInstallDirs module and built-in defaults, in lieu of a DESTINATION argument.
  • The install(FILES) and install(DIRECTORY) commands learned a new set of parameters for installing files as a file type, setting the destination based on the appropriate variables from GNUInstallDirs and built-in defaults, in lieu of a DESTINATION argument.
  • The list() operations REMOVE_ITEM, REMOVE_DUPLICATES, SORT, REVERSE, and FILTER all now accept a non-existent variable as the list since these operations on empty lists is also the empty list.
  • The list() operation REMOVE_AT now indicates that the given indices are invalid for a non-existent variable or empty list.
  • The try_compile() and try_run() commands gained a new LINK_OPTIONS option.


  • A CMAKE_BUILD_RPATH_USE_ORIGIN variable and corresponding BUILD_RPATH_USE_ORIGIN target property were added to enable use of relative runtime paths (RPATHs). This helps achieving relocatable and reproducible builds that are invariant of the build directory.



  • The family of modules to check capabilities (like CheckCSourceCompiles) gain capability to manage LINK_OPTIONS.

  • A CheckFortranSourceRuns module was added to provide a check_fortran_source_runs() command to check if a Fortran source snippet compiles and runs.

  • The CMakePackageConfigHelpers module’s write_basic_package_version_file() command gained a new ARCH_INDEPENDENT option for supporting architecture-independent packages.

  • The ExternalProject module ExternalProject_Add() command gained LOG_DIR and LOG_MERGED_STDOUTERR options to control logging.

  • The ExternalProject module ExternalProject_Add() command gained LOG_PATCH to optionally log the patch step.

  • The ExternalProject module ExternalProject_Add() command learned to apply SOURCE_SUBDIR when BUILD_IN_SOURCE is also used. The BUILD_COMMAND is run in the given SOURCE_SUBDIR of the SOURCE_DIR.

  • The FetchContent module gained a new FetchContent_MakeAvailable() command. It accepts a list of dependency names, which it then iterates over, populating and adding each one to the main build using the canonical pattern. This significantly reduces the amount of boilerplate needed in a project.

  • The FindBISON module’s BISON_TARGET command now runs bison with CMAKE_CURRENT_BINARY_DIR as the working directory. See policy CMP0088.

  • The FindCURL module gained support for requesting protocols as package components.

  • The FindFontconfig module was added to find fontconfig.

  • The FindGDAL module now provides imported targets.

  • The FindGIF module now provides imported targets.

  • The FindGit module now provides an imported target for the Git executable.

  • The FindIce module learned to find slice2confluence and slice2matlab.

  • The FindLibinput module was added to find libinput.

  • The FindLibLZMA module now provides imported targets.

  • The FindMatlab module gained new options R2017b and R2018a to specify the MEX API version to use; these options mirror the new options to the mex command in MATLAB R2018a. The option MX_LIBRARY is no longer needed.

  • The FindPostgreSQL module now provides imported targets.

  • The FindPython, FindPython2, and FindPython3 modules gained support for NumPy component.

  • The FindPython2, FindPython3, and FindPython modules now support running in script mode by skipping the creation of imported targets and helper functions.

  • The FindSQLite3 module was added to find the SQLite v3.x library.

  • The FindX11 had the following variables renamed in order to match their library names rather than header names. The old variables are provided for compatibility:

    • X11_Xxf86misc_INCLUDE_PATH instead of X11_xf86misc_INCLUDE_PATH
    • X11_Xxf86misc_LIB instead of X11_xf86misc_LIB
    • X11_Xxf86misc_FOUND instead of X11_xf86misc_FOUND
    • X11_Xxf86vm_INCLUDE_PATH instead of X11_xf86vmode_INCLUDE_PATH
    • X11_Xxf86vm_LIB instead of X11_xf86vmode_LIB
    • X11_Xxf86vm_FOUND instead of X11_xf86vmode_FOUND
    • X11_xkbfile_INCLUDE_PATH instead of X11_Xkbfile_INCLUDE_PATH
    • X11_xkbfile_LIB instead of X11_Xkbfile_LIB
    • X11_xkbfile_FOUND instead of X11_Xkbfile_FOUND
    • X11_Xtst_INCLUDE_PATH instead of X11_XTest_INCLUDE_PATH
    • X11_Xtst_LIB instead of X11_XTest_LIB
    • X11_Xtst_FOUND instead of X11_XTest_FOUND
    • X11_Xss_INCLUDE_PATH instead of X11_Xscreensaver_INCLUDE_PATH
    • X11_Xss_LIB instead of X11_Xscreensaver_LIB
    • X11_Xss_FOUND instead of X11_Xscreensaver_FOUND

    The following variables are deprecated completely since they were essentially duplicates:

    • X11_Xinput_INCLUDE_PATH (use X11_Xi_INCLUDE_PATH)
    • X11_Xinput_LIB (use X11_Xi_LIB)
    • X11_Xinput_FOUND (use X11_Xi_FOUND)
  • The FindX11 now provides X11_Xext_INCLUDE_PATH.

  • The FindX11 now provides imported targets.

  • The UseSWIG module learned to pass -module <module_name> to the SWIG compiler if the file property SWIG_MODULE_NAME is defined. See policy CMP0086.

  • The UseSWIG module gained an option to specify SWIG source file extensions.

Generator Expressions

  • The $<Fortran_COMPILER_ID:...> and $<Fortran_COMPILER_VERSION:...> generator expressions were added.
  • The $<IN_LIST:...> generator expression now correctly handles an empty argument. See CMP0085 for details.



  • ctest(1) gained a --show-only=json-v1 option to show the list of tests in a machine-readable JSON format. See the Show as JSON Object Model section of the manual.
  • The ctest_submit() command learned a new Done part that can be used to inform CDash that a build is complete and that no more parts will be uploaded.
  • CTest learned to accept the dashboard server submission URL from a single variable. See the SubmitURL setting in ctest(1), the CTEST_SUBMIT_URL variable, and the SUBMIT_URL argument of the ctest_submit() command.

Deprecated and Removed Features

  • An explicit deprecation diagnostic was added for policies CMP0064 and CMP0065 (CMP0063 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 Xcode generator deprecated support for Xcode versions prior to Xcode 5. Support for those will be dropped in a future version of CMake.
  • The FindQt module is no longer used by the find_package() command as a find module. This allows the Qt Project upstream to optionally provide its own QtConfig.cmake package configuration file and have applications use it via find_package(Qt) rather than find_package(Qt CONFIG). See policy CMP0084.
  • Support for running CMake on Windows XP and Windows Vista has been dropped. The precompiled Windows binaries provided on now require Windows 7 or higher.
  • CTest no longer supports submissions via ftp, scp, cp, and xmlrpc. CDash is the only maintained testing dashboard for CTest, and it only supports submissions over http and https.

Other Changes

  • Object library linking has been fixed to propagate private link libraries of object libraries to consuming targets.
  • Install rules under add_subdirectory() now interleave with those in the calling directory. See policy CMP0082 for details.
  • CMake now imposes a maximum recursion limit to prevent a stack overflow on scripts that recurse infinitely. The limit can be adjusted at runtime with CMAKE_MAXIMUM_RECURSION_DEPTH.
  • When using cppcheck via the CMAKE_<LANG>_CPPCHECK variable or <LANG>_CPPCHECK property, the build will now fail if cppcheck returns non-zero as configured by its command-line options.
  • Required link options to manage Position Independent Executable are now added when POSITION_INDEPENDENT_CODE is set. The project is responsible for using the CheckPIESupported module to check for PIE support to ensure that the POSITION_INDEPENDENT_CODE target property will be honored at link time for executables. This behavior is controlled by policy CMP0083.
  • Visual Studio Generators for VS 2010 and above learned to support the VS_DEBUGGER_* properties on targets created via add_custom_target().
  • The CPack module no longer defaults to the paxr value in the CPACK_DEBIAN_ARCHIVE_TYPE variable, because dpkg has never supported the PAX tar format. The paxr value will be mapped to gnutar and a deprecation message emitted.
  • CMake no longer issues a warning if a target listed in an install(TARGETS) command has its EXCLUDE_FROM_ALL property set to true.