CMake 3.10 Release Notes

Changes made since CMake 3.9 include the following.

New Features


  • The flang Fortran compiler is now supported, with compiler id Flang.

  • A new minimal platform file for Midipix was added.

  • Support for the MSVC ARM64 architecture was added. Visual Studio 2017 Update 4 and above offer an ARM64 toolchain.

  • Support for the IAR ARM Compiler was improved.



  • The cmake_host_system_information() command learned more keys to get information about the processor capabilities and the host OS version.

  • The configure_file() command learned to support indented #  cmakedefine and #  cmakedefine01. Spaces and/or tabs between the # character and the cmakedefine/cmakedefine01 words are now understood and preserved in the output.

  • The execute_process() command gained a RESULTS_VARIABLE option to collect a list of results from all children in a pipeline of processes when multiple COMMAND arguments are given.

  • The include_guard() command was introduced to allow guarding CMake scripts from being included more than once. The command supports DIRECTORY and GLOBAL options to adjust the corresponding include guard scope. If no options given, include guard is similar to basic variable-based check.

  • The string() command learned a new PREPEND subcommand.

  • The string(TIMESTAMP) command now supports %A for full weekday name and %B for full month name.




  • The FindCurses module gained a CURSES_NEED_WIDE option to request the wide-character variant.

  • The FindEXPAT module now provides imported targets.

  • The FindFreetype module now provides imported targets.

  • FindMPI gained a number of new features, including:

    • Language-specific components have been added to the module.

    • Many more MPI environments are now supported.

    • The environmental support for Fortran has been improved.

    • A user now has fine-grained control over the MPI selection process, including passing custom parameters to the MPI compiler.

    • The version of the implemented MPI standard is now being exposed.

    • MPI-2 C++ bindings can now be detected and also suppressed if so desired.

    • The available Fortran bindings are now being detected and verified.

    • Various MPI-3 information can be requested, including the library version and Fortran capabilities of the individual bindings.

    • Statically linked MPI implementations are supported.

  • A FindOpenACC module was added to detect compiler support for OpenACC. Currently only supports PGI, GNU and Cray compilers.

  • The FindOpenGL module gained support for GLVND on Linux.

  • The FindOpenMP module gained support for language-specific components.

  • A FindPatch module was added to find the patch command-line executable.

  • The FindProtobuf module protobuf_generate_cpp() command gained a DESCRIPTORS option to generate descriptor files.

  • The GoogleTest module gained a new command gtest_discover_tests() implementing dynamic (build-time) test discovery. Unlike the source parsing approach, dynamic discovery executes the test (in 'list available tests' mode) at build time to discover tests. This is robust against unusual ways of labeling tests, provides much better support for advanced features such as parameterized tests, and does not require re-running CMake to discover added or removed tests within a test executable. Note that a breaking change was made in CMake 3.10.3 to address an ambiguity of the TIMEOUT keyword (see 3.10.3).

  • The InstallRequiredSystemLibraries module gained support for installing Intel compiler runtimes.


  • When using AUTOMOC or AUTOUIC with a multi configuration generator (e.g. Xcode), included *.moc, moc_*.cpp and ui_*.h files are generated in <AUTOGEN_BUILD_DIR>/include_<CONFIG> instead of <AUTOGEN_BUILD_DIR>/include.

  • When using AUTOMOC or AUTOUIC, source files that are GENERATED will be processed as well. They were ignored by AUTOMOC and AUTOUIC in earlier releases. See policy CMP0071.

  • When using AUTOMOC, CMake searches for the strings Q_OBJECT, Q_GADGET or Q_NAMESPACE in a source file to determine if it needs to be moc processed. The new CMAKE_AUTOMOC_MACRO_NAMES variable and AUTOMOC_MACRO_NAMES target property may be set to register additional strings (macro names) to search for.

  • When using AUTOMOC, the new CMAKE_AUTOMOC_COMPILER_PREDEFINES variable and AUTOMOC_COMPILER_PREDEFINES target property specify whether to enable or disable the generation of the compiler pre definitions file moc_predefs.h.


  • A CTEST_LABELS_FOR_SUBPROJECTS CTest module variable and CTest script variable were added to specify a list of labels that should be treated as subprojects by CDash. To use this value in both the CTest module and the ctest command line Dashboard Client mode (e.g. ctest -S) set it in the CTestConfig.cmake config file.



  • The cmake(1) -E mode gained support for sha1sum, sha224sum, sha256sum, sha384sum, and sha512sum.

  • The graphviz output now distinguishes among the different dependency types PUBLIC, PRIVATE and INTERFACE and represents them in the output graph as solid, dashed and dotted edges.

Deprecated and Removed Features

  • Support for building CMake itself with C++98 compilers was dropped. CMake is now implemented using C++11.

  • Support for building CMake on HP-UX has been dropped pending better support for C++11 and a port of libuv. See CMake Issue 17137. Use CMake 3.9 or lower instead for HP-UX support.

Other Changes

  • On FreeBSD the C++ compiler named c++ is now the preferred default.

  • The file(GENERATE) command now interprets relative paths given to its OUTPUT and INPUT arguments with respect to the caller's current binary and source directories, respectively. See policy CMP0070.

  • The get_filename_component() PROGRAM mode semantics have been revised to not tolerate unquoted spaces in the path to the program while also accepting arguments. While technically incompatible with the old behavior, it is expected that behavior under typical use cases with properly-quoted command-lines has not changed.


Changes made since CMake 3.10.0 include the following.


  • The cmake-server(7) codemodel response cross-references field added by 3.10.0 has been dropped due to excessive memory usage. Another approach will be needed to provide backtrace information.


  • CMake 3.10.1 added a TIMEOUT option to gtest_discover_tests() from the GoogleTest module. That keyword clashed with the TIMEOUT test property, which is one of the common properties that would be set with the command's PROPERTIES keyword, usually leading to legal but unintended behavior. The keyword was changed to DISCOVERY_TIMEOUT in CMake 3.10.3 to address this problem. The ambiguous behavior of the gtest_discover_tests() command's TIMEOUT keyword in 3.10.1 and 3.10.2 has not been preserved.