CMake 3.14.0-rc3 is ready for testing

March 1, 2019

I am proud to announce the third CMake 3.14 release candidate.
https://cmake.org/download/

The first two 3.14.0 release candidates included the FindOcatave
module. This has been removed in rc3 pending further development.

Documentation is available at:
https://cmake.org/cmake/help/v3.14

Release notes appear below and are also published at
https://cmake.org/cmake/help/v3.14/release/3.14.html

Some of the more significant changes in CMake 3.14 are:

  • Support for running CMake on Windows XP and Windows Vista has been
    dropped. The precompiled Windows binaries provided on “cmake.org”
    now require Windows 7 or higher.
  • CMake now supports Cross Compiling for iOS, tvOS, or watchOS using
    simple toolchain files.
  • The “Visual Studio 16 2019” generator was added. This is
    experimental and based on “Visual Studio 2019 Preview 4” because
    this version of VS has not been released.The VS 2019 generator differs from generators for earlier versions
    in that it does not provide variants that specify the target
    platform in the generator name. Instead “CMAKE_GENERATOR_PLATFORM”
    must be used, e.g. through the “-A” command-line option.
    Furthermore, the default target platform (architecture) is now based
    on the *host* platform. The VS host toolset selection is now based
    on the host architecture as well.
  • The “Green Hills MULTI” generator has been updated to include Object
    Library support, support for target renaming and destination output
    control properties, and other improvements.
  • A “CMAKE_BUILD_RPATH_USE_ORIGIN” variable and corresponding
    “BUILD_RPATH_USE_ORIGIN” target property were added to enable use of
    relative runtime paths (RPATHs). This helps achieving relocatable
    and reproducible builds that are invariant of the build directory.
  • The “install(TARGETS)” command learned how to install to an
    appropriate default directory for a given target type, based on
    variables from the “GNUInstallDirs” module and built-in defaults, in
    lieu of a “DESTINATION” argument.
  • The “install(FILES)” and “install(DIRECTORY)” commands learned a
    new set of parameters for installing files as a file type, setting
    the destination based on the appropriate variables from
    “GNUInstallDirs” and built-in defaults, in lieu of a “DESTINATION”
    argument.
  • The “install(CODE)” and “install(SCRIPT)” commands learned to
    support generator expressions. See policy “CMP0087”.
  • The “if()” command gained support for checking if cache variables
    are defined with the “DEFINED CACHE{VAR}” syntax.
  • A file-based api for clients to get semantic buildsystem
    information has been added. See the “cmake-file-api(7)” manual.
    This is intended to replace the “cmake-server(7)” mode for IDEs.
  • The “cmake(1)” Build Tool Mode (“cmake –build”) gained “–
    verbose” and “-v” options to specify verbose build output. Some
    generators such as Xcode don’t support this option currently.
  • The “cmake(1)” “-E compare_files” command learned a new “–ignore-
    eol” option to specify that end-of-line differences (e.g. LF vs
    CRLF) should be ignored when comparing files.
CMake 3.14 Release Notes
************************

Changes made since CMake 3.13 include the following.


New Features
============


Generators
----------

* The "Visual Studio 16 2019" generator was added.  This is
  experimental and based on "Visual Studio 2019 Preview 4" because
  this version of VS has not been released.

  The VS 2019 generator differs from generators for earlier versions
  in that it does not provide variants that specify the target
  platform in the generator name.  Instead "CMAKE_GENERATOR_PLATFORM"
  must be used, e.g. through the "-A" command-line option.
  Furthermore, the default target platform (architecture) is now based
  on the *host* platform.  The VS host toolset selection is now based
  on the host architecture as well.

* The "Green Hills MULTI" generator has been updated:

  * Now supports Object Libraries.

  * Now warns on unsupported project types such as shared libraries.

  * Now generates a top-level ".top.gpj" for each
    directory calling the "project()" command.  The top-level project
    file "default.gpj" is no longer created.

  * Now honors target renaming and destination output control
    properties such as "RUNTIME_OUTPUT_DIRECTORY" and "OUTPUT_NAME".
    This also fixes support for installation rules generated by
    "install()".

  * Now honors source file properties "INCLUDE_DIRECTORIES",
    "COMPILE_DEFINITIONS", and "COMPILE_OPTIONS".

  * Now supports Dynamic Download Integrity Applications which did
    not include Integrate Files via "GHS_INTEGRITY_APP" and setting a
    target link flag of "-dynamic".

  * The contents of project files now sorts sources groups and files
    by name. Set the "GHS_NO_SOURCE_GROUP_FILE" target property to
    "ON" to generate a single project file for the target instead of a
    project file for each source group.  Set the
    "CMAKE_GHS_NO_SOURCE_GROUP_FILE" variable to enable this for all
    targets.


File-Based API
--------------

* A file-based api for clients to get semantic buildsystem
  information has been added.  See the "cmake-file-api(7)" manual.
  This is intended to replace the "cmake-server(7)" mode for IDEs.


Platforms
---------

* CMake now supports Cross Compiling for iOS, tvOS, or watchOS using
  simple toolchain files.


Command-Line
------------

* The "cmake(1)" Build Tool Mode ("cmake --build") gained "--
  verbose" and "-v" options to specify verbose build output. Some
  generators such as Xcode don't support this option currently.

* The "cmake(1)" "-E compare_files" command learned a new "--ignore-
  eol" option to specify that end-of-line differences (e.g. LF vs
  CRLF) should be ignored when comparing files.

* The "cmake-gui(1)" dialog gained new "-S" and "-B" arguments to
  explicitly specify source and build directories.


Commands
--------

* The "file()" command learned a new sub-command, "CREATE_LINK",
  which can be used to create hard or symbolic links.

* The "file()" command learned a new sub-command, "READ_SYMLINK",
  which can be used to determine the path that a symlink points to.

* The "file()" command gained a "SIZE" mode to get the size of a
  file on disk.

* The "find_package()" command learned to optionally resolve
  symbolic links in the paths to package configuration files. See the
  "CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS" variable.

* The "get_filename_component()" command gained new "LAST_EXT" and
  "NAME_WLE" variants to work with the extension after the last "." in
  the name.

* The "if()" command gained support for checking if cache variables
  are defined with the  "DEFINED CACHE{VAR}" syntax.

* The "install(CODE)" and "install(SCRIPT)" commands learned to
  support generator expressions.  See policy "CMP0087".

* The "install(TARGETS)" command learned how to install to an
  appropriate default directory for a given target type, based on
  variables from the "GNUInstallDirs" module and built-in defaults, in
  lieu of a "DESTINATION" argument.

* The "install(FILES)" and "install(DIRECTORY)" commands learned a
  new set of parameters for installing files as a file type, setting
  the destination based on the appropriate variables from
  "GNUInstallDirs" and built-in defaults, in lieu of a "DESTINATION"
  argument.

* The "list()" operations "REMOVE_ITEM", "REMOVE_DUPLICATES",
  "SORT", "REVERSE", and "FILTER" all now accept a non-existent
  variable as the list since these operations on empty lists is also
  the empty list.

* The "list()" operation "REMOVE_AT" now indicates that the given
  indices are invalid for a non-existent variable or empty list.

* The "try_compile()" and "try_run()" commands gained a new
  "LINK_OPTIONS" option.


Variables
---------

* A "CMAKE_BUILD_RPATH_USE_ORIGIN" variable and corresponding
  "BUILD_RPATH_USE_ORIGIN" target property were added to enable use of
  relative runtime paths (RPATHs). This helps achieving relocatable
  and reproducible builds that are invariant of the build directory.


Properties
----------

* A "CMAKE_ROLE" global property was added to allow scripts to
  determine whether they're running in project mode, script mode,
  find-package mode, CTest, or CPack.

* The "CUDA_RESOLVE_DEVICE_SYMBOLS" target property is now supported
  on shared library, module library, and executable targets.
  Previously it was only honored on static libraries.

* The "EXCLUDE_FROM_ALL" target property was created to override the
  setting of its directory. A target will now be built as part of
  "all" if its "EXCLUDE_FROM_ALL" property is set to "OFF", even if
  its containing directory is marked as "EXCLUDE_FROM_ALL".

* "INTERFACE_POSITION_INDEPENDENT_CODE" target property gains the
  support of "generator expressions".


Modules
-------

* The family of modules to check capabilities (like
  "CheckCSourceCompiles") gain capability to manage "LINK_OPTIONS".

* A "CheckFortranSourceRuns" module was added to provide a
  "check_fortran_source_runs()" command to check if a Fortran source
  snippet compiles and runs.

* The "CMakePackageConfigHelpers" module’s
  "write_basic_package_version_file()" command gained a new
  "ARCH_INDEPENDENT" option for supporting architecture-independent
  packages.

* The "ExternalProject" module "ExternalProject_Add()" command
  gained "LOG_DIR" and "LOG_MERGED_STDOUTERR" options to control
  logging.

* The "ExternalProject" module "ExternalProject_Add()" command
  gained "LOG_PATCH" to optionally log the patch step.

* The "ExternalProject" module's "ExternalProject_Add()" command
  learned to apply "SOURCE_SUBDIR" when "BUILD_IN_SOURCE" is also
  used. The "BUILD_COMMAND" is run in the given "SOURCE_SUBDIR" of the
  "SOURCE_DIR".

* The "FetchContent" module gained a new
  "FetchContent_MakeAvailable()" command.  It accepts a list of
  dependency names, which it then iterates over, populating and adding
  each one to the main build using the canonical pattern.  This
  significantly reduces the amount of boilerplate needed in a project.

* The "FindBISON" module's "BISON_TARGET" command now runs "bison"
  with "CMAKE_CURRENT_BINARY_DIR" as the working directory. See policy
  "CMP0088".

* The "FindCURL" module gained support for requesting protocols as
  package components.

* The "FindFontconfig" module was added to find fontconfig.

* The "FindGDAL" module now provides imported targets.

* The "FindGIF" module now provides imported targets.

* The "FindGit" module now provides an imported target for the Git
  executable.

* The "FindIce" module learned to find "slice2confluence" and
  "slice2matlab".

* The "FindLibinput" module was added to find libinput.

* The "FindLibLZMA" module now provides imported targets.

* The "FindMatlab" module gained new options "R2017b" and "R2018a"
  to specify the MEX API version to use; these options mirror the new
  options to the "mex" command in MATLAB R2018a. The option
  "MX_LIBRARY" is no longer needed.

* The "FindPostgreSQL" module now provides imported targets.

* The "FindPython", "FindPython2", and "FindPython3" modules gained
  support for "NumPy" component.

* The "FindPython2", "FindPython3", and "FindPython" modules now
  support running in script mode by skipping the creation of imported
  targets and helper functions.

* The "FindSQLite3" module was added to find the SQLite v3.x
  library.

* The "FindX11" had the following variables renamed in order to
  match their library names rather than header names. The old
  variables are provided for compatibility:

     * "X11_Xxf86misc_INCLUDE_PATH" instead of
       "X11_xf86misc_INCLUDE_PATH"

     * "X11_Xxf86misc_LIB" instead of "X11_xf86misc_LIB"

     * "X11_Xxf86misc_FOUND" instead of "X11_xf86misc_FOUND"

     * "X11_Xxf86vm_INCLUDE_PATH" instead of
       "X11_xf86vmode_INCLUDE_PATH"

     * "X11_Xxf86vm_LIB" instead of "X11_xf86vmode_LIB"

     * "X11_Xxf86vm_FOUND" instead of "X11_xf86vmode_FOUND"

     * "X11_xkbfile_INCLUDE_PATH" instead of
       "X11_Xkbfile_INCLUDE_PATH"

     * "X11_xkbfile_LIB" instead of "X11_Xkbfile_LIB"

     * "X11_xkbfile_FOUND" instead of "X11_Xkbfile_FOUND"

     * "X11_Xtst_INCLUDE_PATH" instead of "X11_XTest_INCLUDE_PATH"

     * "X11_Xtst_LIB" instead of "X11_XTest_LIB"

     * "X11_Xtst_FOUND" instead of "X11_XTest_FOUND"

     * "X11_Xss_INCLUDE_PATH" instead of
       "X11_Xscreensaver_INCLUDE_PATH"

     * "X11_Xss_LIB" instead of "X11_Xscreensaver_LIB"

     * "X11_Xss_FOUND" instead of "X11_Xscreensaver_FOUND"

  The following variables are deprecated completely since they were
  essentially duplicates:

     * "X11_Xinput_INCLUDE_PATH" (use "X11_Xi_INCLUDE_PATH")

     * "X11_Xinput_LIB" (use "X11_Xi_LIB")

     * "X11_Xinput_FOUND" (use "X11_Xi_FOUND")

* The "FindX11" now provides "X11_Xext_INCLUDE_PATH".

* The "FindX11" now provides imported targets.

* The "UseSWIG" module learned to pass "-module " to
  the "SWIG" compiler if the file property "SWIG_MODULE_NAME" is
  defined. See policy "CMP0086".

* The "UseSWIG" module gained an option to specify "SWIG" source
  file extensions.


Generator Expressions
---------------------

* The "$" and
  "$" "generator expressions" were
  added.

* The "$" generator expression now correctly handles an
  empty argument. See "CMP0085" for details.


Autogen
-------

* The "AUTOMOC_EXECUTABLE", "AUTORCC_EXECUTABLE", and
  "AUTOUIC_EXECUTABLE" target properties were added.  They all take a
  path to an executable and force automoc/autorcc/autouic to use this
  executable.

  Setting these will also prevent the configure time testing for these
  executables. This is mainly useful when you build these tools
  yourself.

* The new variables "CMAKE_GLOBAL_AUTOGEN_TARGET",
  "CMAKE_GLOBAL_AUTOGEN_TARGET_NAME", "CMAKE_GLOBAL_AUTORCC_TARGET"
  and "CMAKE_GLOBAL_AUTORCC_TARGET_NAME" control the generation of
  global "autogen" and "autorcc" targets.

* A new "CMAKE_AUTOGEN_ORIGIN_DEPENDS" variable and
  "AUTOGEN_ORIGIN_DEPENDS" target property may be set to enable or
  disable forwarding of the origin target dependencies to the
  corresponding "_autogen" target.


CTest
-----

* "ctest(1)" gained a "--show-only=json-v1" option to show the list
  of tests in a machine-readable JSON format. See the Show as JSON
  Object Model section of the manual.

* The "ctest_submit()" command learned a new "Done" part that can be
  used to inform CDash that a build is complete and that no more parts
  will be uploaded.

* CTest learned to accept the dashboard server submission URL from a
  single variable.  See the "SubmitURL" setting in "ctest(1)", the
  "CTEST_SUBMIT_URL" variable, and the "SUBMIT_URL" argument of the
  "ctest_submit()" command.


Deprecated and Removed Features
===============================

* An explicit deprecation diagnostic was added for policies
  "CMP0064" and "CMP0065" ("CMP0063" and below were already
  deprecated). The "cmake-policies(7)" manual explains that the OLD
  behaviors of all policies are deprecated and that projects should
  port to the NEW behaviors.

* The "Xcode" generator deprecated support for Xcode versions prior
  to Xcode 5.  Support for those will be dropped in a future version
  of CMake.

* The "FindQt" module is no longer used by the "find_package()"
  command as a find module.  This allows the Qt Project upstream to
  optionally provide its own "QtConfig.cmake" package configuration
  file and have applications use it via "find_package(Qt)" rather than
  "find_package(Qt CONFIG)".  See policy "CMP0084".

* Support for running CMake on Windows XP and Windows Vista has been
  dropped. The precompiled Windows binaries provided on "cmake.org"
  now require Windows 7 or higher.

* CTest no longer supports submissions via "ftp", "scp", "cp", and
  "xmlrpc".  CDash is the only maintained testing dashboard for CTest,
  and it only supports submissions over "http" and "https".


Other Changes
=============

* Object library linking has been fixed to propagate private link
  libraries of object libraries to consuming targets.

* Install rules under "add_subdirectory()" now interleave with those
  in the calling directory. See policy "CMP0082" for details.

* CMake now imposes a maximum recursion limit to prevent a stack
  overflow on scripts that recurse infinitely. The limit can be
  adjusted at runtime with "CMAKE_MAXIMUM_RECURSION_DEPTH".

* When using cppcheck via the "CMAKE__CPPCHECK" variable or
  "_CPPCHECK" property, the build will now fail if "cppcheck"
  returns non-zero as configured by its command-line options.

* Required link options to manage Position Independent Executable
  are now added when "POSITION_INDEPENDENT_CODE" is set.  The project
  is responsible for using the "CheckPIESupported" module to check for
  "PIE" support to ensure that the "POSITION_INDEPENDENT_CODE" target
  property will be honored at link time for executables.  This
  behavior is controlled by policy "CMP0083".

* Visual Studio Generators for VS 2010 and above learned to support
  the "VS_DEBUGGER_*" properties on targets created via
  "add_custom_target()".

* The "CPack" module no longer defaults to the "paxr" value in the
  "CPACK_DEBIAN_ARCHIVE_TYPE" variable, because "dpkg" has never
  supported the PAX tar format. The "paxr" value will be mapped to
  "gnutar" and a deprecation message emitted.

* CMake no longer issues a warning if a target listed in an
  "install(TARGETS)" command has its "EXCLUDE_FROM_ALL" property set
  to true.

----------------------------------------------------------------------------
Changes made since CMake 3.14.0-rc2:

Brad King (17):
      Prefix implicit include directories with sysroot on construction
      Restore unconditional use of "standard" include directories
      Do not explicitly report "standard" include directories as implicit
      Use -? instead of /? to test compiler for MSVC-like command-line support
      VS: Factor out a method to set the Windows SDK version internally
      VS: Tell VS 2019 to use Windows SDK 8.1 explicitly when needed
      Fortran: Do not suppress explicit use of implicit include directories
      Tests: Restore support for CMake 3.1 through 3.6 with MSVC
      FindThreads: Fix libc check to use proper header for pthread_kill
      VS: Fix detection of clang-cl with -T llvm
      include_external_msproject: Restore support for EXCLUDE_FROM_ALL
      FindOctave: Remove module pending further work
      FindThreads: Revert libc symbol check to pthread_create
      VS: Drop workaround needed only for VS 2019 preview 2 and 3
      Help: Update VS 2019 generator release note for preview 4
      ExternalProject: Restore default log dir with custom stamp dir
      CMake 3.14.0-rc3

Christian Pfeiffer (1):
      FindJNI: Unify path search, fix support for Java 9

Craig Scott (12):
      Help: Remove outdated statement about get_filename_component()
      Help: Clarify and improve readability of link-related file subcommands
      Release notes: Make ExternalProject dot points consistent
      Help: Clarify ExternalProject_Add()'s LOG_MERGED_STDOUTERR behavior
      EXCLUDE_FROM_ALL: Don't warn if installing target excluded from all
      CheckLangSourceRuns: Capture run output to log files
      Help: User-provided variable names for try_* commands
      Help: try_compile() readability and grammar improvements
      Help: Consistency in try_compile() docs for target type
      Help: Caveat for try_compile() and CMAKE_TRY_COMPILE_PLATFORM_VARIABLES
      Help: Add release note for new ARCH_INDEPENDENT option
      Help: Fix minor inaccuracies of what BUILD_RPATH_USE_ORIGIN affects

Kyle Edwards (1):
      CMAKE_ROLE: Fix value in --build for Visual Studio generators

Maikel van den Hurk (1):
      Add ASM Compiler detection for QCC

Marc Chevrier (1):
      PIE link options: No warning when policy CMP0083 is not set.

Mathieu Garaud (1):
      Extend C++17/C++14 feature checks to cover more standard library APIs

Paul Seyfert (1):
      Help: Fix --build-and-test synopsis in ctest(1)

Robert Maynard (1):
      CUDA: Filter out -framework arguments during device linking

Sebastian Holtermann (2):
      Autogen: Add output caching GetExecutableTestOutput
      Autogen: Use output caching GetExecutableTestOutput

Yves Frederix (1):
      FindBoost: Find boost libraries built with --layout=tagged

Leave a Reply