CMake 3.12.0-rc3 is ready for testing

I am proud to announce the third CMake 3.12 release candidate.

The first two 3.12.0 release candidates included a change to allow
the target_link_libraries command to modify targets created outside
the current directory. This has been reverted in rc3 due to
problems with visibility of the linked targets. See issue17943.

Documentation is available at:

Release notes appear below and are also published at

Some of the more significant changes in CMake 3.12 are:

  • 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 “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 “Compile Features” functionality is now aware of C++ 20. No
    specific features are yet enumerated besides the “cxx_std_20” meta-
  • The Visual Studio Generators for VS 2017 learned to support a
    “version=14.##” option in the “CMAKE_GENERATOR_TOOLSET” value (e.g.
    via the “cmake(1)” “-T” option) to specify a toolset version number.
  • 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
  • The “add_compile_definitions()” command was added to set
    preprocessor definitions at directory level. This supersedes
  • 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 “<max>” version. This allows projects to specify a
    range of versions for which they have been updated and avoid
    explicit policy settings.
  • 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
  • A new “$<GENEX_EVAL:…>” and “$<TARGET_GENEX_EVAL:target,…>”
    “generator expression” has been added to enable consumption of
    generator expressions whose evaluation results itself in generator
  • A new “$<TARGET_EXISTS:…>” “generator expression” has been
  • A new “$<TARGET_NAME_IF_EXISTS:…>” “generator expression” has
    been added.
  • The “FindCURL” module now provides imported targets.
  • The “FindJPEG” module now provides imported targets.
  • A “FindODBC” module was added to find an Open Database
    Connectivity (ODBC) library.
  • New “FindPython3” and “FindPython2” modules, as well as a new
    “FindPython” module, have been added to provide a new way to locate
    python environments.


Questions or comments are always welcome!