CMake 3.12 Release Notes

Changes made since CMake 3.11 include the following.

New Features



  • The cmake(1) Build Tool Mode (cmake --build) gained --parallel [<jobs>] and -j [<jobs>] options to specify a parallel build level. They map to corresponding options of the native build tool.


  • The add_compile_definitions() command was added to set preprocessor definitions at directory level. This supersedes add_definitions().
  • The cmake_minimum_required() and cmake_policy(VERSION) commands now accept a version range using the form <min>[...<max>]. The <min> version is required but policies are set based on the older of the running CMake version and the version specified by <max>. This allows projects to specify a range of versions for which they have been updated and avoid explicit policy settings.
  • The file(GLOB) and file(GLOB_RECURSE) commands learned a new flag CONFIGURE_DEPENDS which enables expression of build system dependency on globbed directory’s contents.
  • The file(TOUCH) and file(TOUCH_NOCREATE) commands were added to expose TOUCH functionality without having to use CMake’s command-line tool mode with execute_process().
  • The find_package() command now searches a prefix specified by a PackageName_ROOT CMake or environment variable. Package roots are maintained as a stack so nested calls to all find_* commands inside find modules also search the roots as prefixes. See policy CMP0074.
  • The install() command learned an optional NAMELINK_COMPONENT parameter, which allows you to change the component for a shared library’s namelink. If none is specified, the value of COMPONENT is used by default.
  • The list() command learned a JOIN sub-command to concatenate list’s elements separated by a glue string.
  • The list() command learned a SUBLIST sub-command to get a sublist of the list.
  • The list() command learned a TRANSFORM sub-command to apply various string transformation to list’s elements.
  • The project() command learned an optional HOMEPAGE_URL parameter which has the effect of setting variables like PROJECT_HOMEPAGE_URL, <PROJECT-NAME>_HOMEPAGE_URL and CMAKE_PROJECT_HOMEPAGE_URL.
  • The string() command learned a JOIN sub-command to concatenate input strings separated by a glue string.
  • target_compile_options() and add_compile_options() commands gained a SHELL: prefix to specify a group of related options using shell-like quoting.
  • The target_link_libraries() command now supports Object Libraries. Linking to an object library uses its object files in direct dependents and also propagates usage requirements.




  • The FindALSA module now provides imported targets.
  • The FindCURL module now provides imported targets.
  • The FindJPEG module now provides imported targets.
  • The FindLibXml2 module now provides imported targets.
  • The FindMatlab module now supports the Matlab Runtime Compiler (MCR) for compiling and linking matlab extensions.
  • A FindODBC module was added to find an Open Database Connectivity (ODBC) library.
  • The FindPkgConfig module has learned to export the found libraries with full path for direct consumption with the target_link_libraries() command.
  • New FindPython3 and FindPython2 modules, as well as a new FindPython module, have been added to provide a new way to locate python environments.
  • The UseSWIG module gained a whole refresh and is now more consistent with standard CMake commands to generate libraries and is fully configurable through properties.
  • The UseSWIG module learned to manage multiple behaviors through UseSWIG_MODULE_VERSION variable to ensure legacy support as well as more robust handling of SWIG advanced features (like %template).
  • The UseSWIG module learned to support CSHARP variant wrapper files.
  • The WriteCompilerDetectionHeader module gained a BARE_FEATURES option to add a compatibility define for the exact keyword of a new language feature.

Generator Expressions


  • The ctest_start() command has been reworked so that you can simply call ctest_start(APPEND) and it will read all the needed information from the TAG file. The argument parsing has also been relaxed so that the order of the arguments is less significant.
  • A PROCESSOR_AFFINITY test property was added to request that CTest run a test with CPU affinity for a set of processors disjoint from other concurrently running tests with the property set.



  • The Compile Features functionality is now aware of C++ 20. No specific features are yet enumerated besides the cxx_std_20 meta-feature.
  • The Compile Features functionality is now aware of the availability of C features in MSVC since VS 2010.
  • The Compile Features functionality is now aware of C language standards supported by Texas Instruments C compilers.

Deprecated and Removed Features

  • The Visual Studio 8 2005 generator has been removed.
  • CMake no longer produces <tgt>_LIB_DEPENDS cache entries for library targets. See policy CMP0073.

Other Changes

  • Include flags for directories marked as SYSTEM are now moved after non-system directories. The -isystem flag does this automatically, so moving them explicitly to the end makes the behavior consistent on compilers that do not have any -isystem flag.
  • Fortran dependency scanning now supports dependencies implied by Fortran Submodules.
  • The existence and functionality of the file ${CMAKE_BINARY_DIR}/cmake_install.cmake has now been documented in the install() documentation so that external packaging software can take advantage of CPack-style component installs.
  • The CheckIncludeFile module check_include_file macro learned to honor the CMAKE_REQUIRED_LIBRARIES variable. See policy CMP0075.
  • The CheckIncludeFileCXX module check_include_file_cxx macro learned to honor the CMAKE_REQUIRED_LIBRARIES variable. See policy CMP0075.
  • The CheckIncludeFiles module check_include_files macro learned to honor the CMAKE_REQUIRED_LIBRARIES variable. See policy CMP0075.
  • The cmake(1) -E copy_directory tool now fails when the source directory does not exist. Previously it succeeded by creating an empty destination directory.
  • The UseSWIG module swig_add_library() command (and legacy swig_add_module command) now set the prefix of Java modules to "" for MINGW, MSYS, and CYGWIN environments.