CMake 3.1 Release Notes

Changes made since CMake 3.0 include the following.

New Features


Windows Phone and Windows Store

  • Generators for Visual Studio 11 (2012) and above learned to generate projects for Windows Phone and Windows Store. One may set the CMAKE_SYSTEM_NAME variable to WindowsPhone or WindowsStore on the cmake(1) command-line or in a CMAKE_TOOLCHAIN_FILE to activate these platforms. Also set CMAKE_SYSTEM_VERSION to 8.0 or 8.1 to specify the version of Windows to be targeted.

NVIDIA Nsight Tegra

  • Generators for Visual Studio 10 (2010) and above learned to generate projects for NVIDIA Nsight Tegra Visual Studio Edition. One may set the CMAKE_SYSTEM_NAME variable to Android on the cmake(1) command-line or in a CMAKE_TOOLCHAIN_FILE to activate this platform.




  • The Visual Studio generators for versions 8 (2005) and above learned to read the target platform name from a new CMAKE_GENERATOR_PLATFORM variable when it is not specified as part of the generator name. The platform name may be specified on the cmake(1) command line with the -A option, e.g. -G "Visual Studio 12 2013" -A x64.

  • The CMAKE_GENERATOR_TOOLSET variable may now be initialized in a toolchain file specified by the CMAKE_TOOLCHAIN_FILE variable. This is useful when cross-compiling with the Xcode or Visual Studio generators.

  • The CMAKE_INSTALL_MESSAGE variable was introduced to optionally reduce output installation.



  • The BundleUtilities module learned to resolve and replace @rpath placeholders on OS X to correctly bundle applications using them.

  • The CMakePackageConfigHelpers module configure_package_config_file() command learned a new INSTALL_PREFIX option to generate package configuration files meant for a prefix other than CMAKE_INSTALL_PREFIX.

  • The CheckFortranSourceCompiles module was added to provide a CHECK_Fortran_SOURCE_COMPILES macro.

  • The ExternalData module learned to tolerate a DATA{} reference to a missing source file with a warning instead of rejecting it with an error. This helps developers write new DATA{} references to test reference outputs that have not yet been created.

  • The ExternalProject module learned to support lzma-compressed source tarballs with .7z, .tar.xz, and .txz extensions.

  • The ExternalProject module ExternalProject_Add command learned a new BUILD_ALWAYS option to cause the external project build step to run every time the host project is built.

  • The ExternalProject module ExternalProject_Add command learned a new EXCLUDE_FROM_ALL option to cause the external project target to have the EXCLUDE_FROM_ALL target property set.

  • The ExternalProject module ExternalProject_Add_Step command learned a new EXCLUDE_FROM_MAIN option to cause the step to not be a direct dependency of the main external project target.

  • The ExternalProject module ExternalProject_Add command learned a new DOWNLOAD_NO_PROGRESS option to disable progress output while downloading the source tarball.

  • The FeatureSummary module feature_summary API learned to accept multiple values for the WHAT option and combine them appropriately.

  • The FindCUDA module learned to support fatbin and cubin modules.

  • The FindGTest module gtest_add_tests macro learned a new AUTO option to automatically read the SOURCES target property of the test executable and scan the source files for tests to be added.

  • The FindGLEW module now provides imported targets.

  • The FindGLUT module now provides imported targets.

  • The FindHg module gained a new Hg_WC_INFO macro to help run hg to extract information about a Mercurial work copy.

  • The FindOpenCL module was introduced.

  • The FindOpenMP module learned to support Fortran.

  • The FindPkgConfig module learned to use the PKG_CONFIG environment variable value as the pkg-config executable, if set.

  • The FindXercesC module was introduced.

  • The FindZLIB module now provides imported targets.

  • The GenerateExportHeader module generate_export_header function learned to allow use with Object Libraries.

  • The InstallRequiredSystemLibraries module gained a new CMAKE_INSTALL_OPENMP_LIBRARIES option to install MSVC OpenMP runtime libraries.

  • The UseSWIG module learned to detect the module name from .i source files if possible to avoid the need to set the SWIG_MODULE_NAME source file property explicitly.

  • The WriteCompilerDetectionHeader module was added to allow creation of a portable header file for compiler optional feature detection.

Generator Expressions

  • New COMPILE_FEATURES generator expression allows setting build properties based on available compiler features.


  • The ctest_coverage() command learned to read variable CTEST_COVERAGE_EXTRA_FLAGS to set CoverageExtraFlags.

  • The ctest_coverage() command learned to support Intel coverage files with the codecov tool.

  • The ctest_memcheck() command learned to support sanitizer modes, including AddressSanitizer, MemorySanitizer, ThreadSanitizer, and UndefinedBehaviorSanitizer. Options may be set using the new CTEST_MEMORYCHECK_SANITIZER_OPTIONS variable.



  • The cmake(1) -E option learned a new env command.

  • The cmake(1) -E tar command learned to support lzma-compressed files.

  • Object Libraries may now have extra sources that do not compile to object files so long as they would not affect linking of a normal library (e.g. .dat is okay but not .def).

  • Visual Studio generators for VS 8 and later learned to support the ASM_MASM language.

  • The Visual Studio generators learned to treat .hlsl source files as High Level Shading Language sources (using FXCompile in .vcxproj files). Source file properties VS_SHADER_TYPE, VS_SHADER_MODEL, and VS_SHADER_ENTRYPOINT were added added to specify the shader type, model, and entry point name.

New Diagnostics

Deprecated and Removed Features

  • In CMake 3.0 the target_link_libraries() command accidentally began allowing unquoted arguments to use generator expressions containing a (; separated) list within them. For example:

    set(libs B C)
    target_link_libraries(A PUBLIC $<BUILD_INTERFACE:${libs}>)

    This is equivalent to writing:

    target_link_libraries(A PUBLIC $<BUILD_INTERFACE:B C>)

    and was never intended to work. It did not work in CMake 2.8.12. Such generator expressions should be in quoted arguments:

    set(libs B C)
    target_link_libraries(A PUBLIC "$<BUILD_INTERFACE:${libs}>")

    CMake 3.1 again requires the quotes for this to work correctly.

  • Prior to CMake 3.1 the Makefile generators did not escape # correctly inside make variable assignments used in generated makefiles, causing them to be treated as comments. This made code like:


    not work in Makefile generators, but work in other generators. Now it is escaped correctly, making the behavior consistent across generators. However, some projects may have tried to workaround the original bug with code like:

    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-\\#pragma-messages")

    This added the needed escape for Makefile generators but also caused other generators to pass -Wno-\#pragma-messages to the shell, which would work only in POSIX shells. Unfortunately the escaping fix could not be made in a compatible way so this platform- and generator-specific workaround no longer works. Project code may test the CMAKE_VERSION variable value to make the workaround version-specific too.

  • Callbacks established by the variable_watch() command will no longer receive the ALLOWED_UNKNOWN_READ_ACCESS access type when the undocumented CMAKE_ALLOW_UNKNOWN_VARIABLE_READ_ACCESS variable is set. Uninitialized variable accesses will always be reported as UNKNOWN_READ_ACCESS.

  • The CMakeDetermineVSServicePack module now warns that it is deprecated and should not longer be used. Use the CMAKE_<LANG>_COMPILER_VERSION variable instead.

  • The FindITK module has been removed altogether. It was a thin-wrapper around find_package(ITK ... NO_MODULE). This produces much clearer error messages when ITK is not found.

  • The FindVTK module has been removed altogether. It was a thin-wrapper around find_package(VTK ... NO_MODULE). This produces much clearer error messages when VTK is not found.

    The module also provided compatibility support for finding VTK 4.0. This capability has been dropped.

Other Changes

  • The cmake-gui(1) learned to capture output from child processes started by the execute_process() command and display it in the output window.

  • The cmake-language(7) internal implementation of generator expression and list expansion parsers have been optimized and shows non-trivial speedup on large projects.

  • The Makefile generators learned to use response files with GNU tools on Windows to pass library directories and names to the linker.

  • When generating linker command-lines, CMake now avoids repeating items corresponding to SHARED library targets.

  • Support for the Open Watcom compiler has been overhauled. The CMAKE_<LANG>_COMPILER_ID is now OpenWatcom, and the CMAKE_<LANG>_COMPILER_VERSION now uses the Open Watcom external version numbering. The external version numbers are lower than the internal version number by 11.

  • The cmake-mode.el major Emacs editing mode no longer treats _ as part of words, making it more consistent with other major modes.