CMake 3.3 Release Notes

Changes made since CMake 3.2 include the following.

New Features


  • The Makefile Generators now add .DELETE_ON_ERROR to the makefiles that contain the actual build rules for files on disk. This tells GNU make to remove rule outputs when their recipe modifies an output but fails.
  • The Visual Studio Generators learned to support .xaml source files and automatically associate them with corresponding .h and .cpp sources.
  • A new experimental Green Hills MULTI generator was added on Windows. Green Hills MULTI is an IDE for embedded real-time systems.


  • The add_dependencies() command learned to allow dependencies to be added to interface libraries. Dependencies added to an interface library are followed transitively in its place since the target itself does not build.
  • The execute_process() command learned to support specifying the same file for OUTPUT_FILE and ERROR_FILE.
  • The file(GLOB) and file(GLOB_RECURSE) commands learned a new LIST_DIRECTORIES <bool> option to specify whether the glob result should include directories.
  • The find_library(), find_path(), and find_file() commands now search in installation prefixes derived from the PATH environment variable.
  • The if() command learned a new IN_LIST operator that evaluates to true if a given element is contained in a named list.
  • The install(EXPORT) and export() commands learned to export targets that populate the INTERFACE_SOURCES target property.
  • The install(TARGETS) command learned to support generator expressions in the DESTINATION value.




  • The CheckFortranCompilerFlag module was introduced to check Fortran compiler flags, much like the CheckCCompilerFlag module already does for C.
  • The ExternalData module learned a new ExternalData_NO_SYMLINKS option to disable use of symbolic links to populate the real data files and use copies instead.
  • The ExternalData module learned a new RECURSE: option in DATA{} references specifying directories. This allows an entire directory tree of associated files to be matched.
  • The ExternalData module learned a new URL template placeholder %(algo:<key>) to allow custom mapping from algorithm name to URL component through configuration of new ExternalData_URL_ALGO_<algo>_<key> variables. This allows more flexibility in remote URLs.
  • The ExternalProject module learned to replace tokens like <BINARY_DIR> in the BYPRODUCTS of each step.
  • The ExternalProject module APIs learned to support generator expressions when using LOG_* options and in CMake initial cache options.
  • The FindBoost module now tracks the directories containing libraries separately for RELEASE and DEBUG configurations.
  • The FindCUDA module now defaults to using the static CUDA runtime library if it is available. A new CUDA_USE_STATIC_CUDA_RUNTIME option is offered to control this behavior.
  • The FindMatlab module was completely rewritten. It learned about versions and components and to find Matlab in a more precise and multiplatform way. The module now offers APIs to create mex extensions, documentation, and unit tests.
  • The FindPackageHandleStandardArgs module FIND_PACKAGE_HANDLE_STANDARD_ARGS function now always populates both the <PackageName>_FOUND and <UPPERCASE_NAME>_FOUND variables (the latter for backwards compatibility). The FOUND_VAR option is now ignored except to enforce its allowed values.
  • The InstallRequiredSystemLibraries module learned a new CMAKE_INSTALL_SYSTEM_RUNTIME_COMPONENT option to specify the installation component.

Generator Expressions

  • A new COMPILE_LANGUAGE generator expression was introduced to allow specification of compile options for target files based on the LANGUAGE of each source file. Due to limitations of the underlying native build tools, this feature has varying support across generators. See the cmake-generator-expressions(7) manual for details.




  • The Compile Features functionality is now aware of features supported by GNU compilers on Windows, versions 4.4 through 5.0.
  • The cmake(1) -E tar command learned a new --format<format> option to specify the archive format to be written.
  • On OS X, CMake learned to create XCTest bundles to test Frameworks and App Bundles within Xcode. The FindXCTest module provides convenience functions to handle XCTEST bundles.

Deprecated and Removed Features

  • On OS X the cmake-gui(1) no longer has the Install For Command Line Use menu item. Instead there is a How to Install For Command Line Use menu item that shows an informational dialog box explaining how to make the command line tools available. For example:

    /Applications/ --install
  • The ctest_build() and build_command() commands no longer tell make tools to ignore errors with the -i option. Previously this was done for Makefile Generators but not others. See policy CMP0061.

  • The Visual Studio 10 2010 generator no longer checks for running VS IDEs with the project open or asks them to reload. This was originally done for VS 10 because it had been done for VS 7 through 9 to avoid prompting for every project in a solution. Since VS >= 10 allow the whole solution to reload at once they do not need CMake to help them.

  • The Visual Studio 7 generator (.NET 2002) is now deprecated and will be removed in a future version of CMake.

  • The Visual Studio 6 generator is now deprecated and will be removed in a future version of CMake.

  • The find_package() command no longer considers project build trees recently configured in a cmake-gui(1). This was previously done only on Windows and is now never done. The NO_CMAKE_BUILDS_PATH option is now ignored if given and effectively always on. Projects may populate the User Package Registry to aid users building multiple dependent projects one after another.

  • The add_definitions() command no longer causes a DEFINITIONS directory property to be populated. See policy CMP0059.

  • With Visual Studio 7, 8, and 9 generators the value of the $(OutDir) placeholder no longer evaluates to the configuration name. Projects should use $(ConfigurationName) for that instead.

  • Using the output of export() with the install(FILES) command is no longer allowed. See policy CMP0062 for details.

Other Changes

  • The Ninja generator now requires that calls to the add_custom_command() and add_custom_target() commands use the BYPRODUCTS option to explicitly specify any files generated by the custom commands that are not listed as outputs (perhaps because their timestamps are allowed to be older than the inputs). See policy CMP0058.
  • Build-time progress output of Makefile Generators has been improved. It no longer mixes progress and build rule messages during parallel builds. The link rule messages now have progress and are displayed as bold green instead of bold red (since red is often associated with an error message).
  • The CMAKE_CFG_INTDIR variable value for Visual Studio 7, 8, and 9 is now $(ConfigurationName) instead of $(OutDir). This should have no effect on the intended use cases of the variable.
  • Linking to library files by a full path in an implicit linker search directory (e.g. /usr/lib/libfoo.a) no longer asks the linker to search for the library (e.g. -lfoo) and now links by full path. See policy CMP0060.