CMake 3.30 Release Notes
************************

.. only:: html

  .. contents::

Changes made since CMake 3.29 include the following.

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

Presets
-------

* :manual:`cmake-presets(7)` files now support schema version ``9``.
  ``include`` fields now expand all macros except ``$env{}`` and
  preset-specific macros, i.e., those derived from the fields
  inside a preset's definition.

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

* The :manual:`cmake-file-api(7)` "cmakeFiles" version 1 object's ``version``
  field has been updated to 1.1.  It gained a ``globsDependent`` field to
  report :command:`file(GLOB)` calls using ``CONFIGURE_DEPENDS``.

Generators
----------

* :ref:`Visual Studio Generators` now add ``UseDebugLibraries`` indicators to
  ``.vcxproj`` files to denote which configurations are debug configurations.
  See policy :policy:`CMP0162`.

Languages
---------

* The :manual:`Compile Features <cmake-compile-features(7)>` functionality
  now implements support for the ``cxx_std_26`` and ``cuda_std_26``
  meta-features to indicate that the compiler mode must be at least C++26.
  These meta-features were first documented by CMake 3.25, but were not fully
  implemented.

Commands
--------

* The :command:`add_library` command, on platforms that do not support shared
  libraries, now rejects creation of shared libraries instead of automatically
  converting them to static libraries.  See policy :policy:`CMP0164`.

* The :command:`enable_language` command now fails with an error
  if it is called before the first :command:`project` call.
  See policy :policy:`CMP0165`.

* The :command:`file(DOWNLOAD)` and :command:`file(UPLOAD)` commands
  gained a ``TLS_VERSION <min>`` option to specify the minimum TLS
  version for connections to ``https://`` URLs.

Variables
---------

* The :variable:`CMAKE_<LANG>_STANDARD_LATEST` variable was added to
  describe the latest ``<LANG>`` language standard CMake supports for
  the selected compiler.

* The :envvar:`CMAKE_TLS_VERIFY` environment variable was added as a fallback
  to the existing :variable:`CMAKE_TLS_VERIFY` variable.  It specifies
  whether to verify the server certificate for ``https://`` URLs by default.

* The :variable:`CMAKE_TLS_VERSION` variable and :envvar:`CMAKE_TLS_VERSION`
  environment variable were added to specify a default minimum TLS version
  for connections to ``https://`` URLs by the :command:`file(DOWNLOAD)`
  and :command:`file(UPLOAD)` commands.

* The :variable:`CMAKE_VS_USE_DEBUG_LIBRARIES` variable and corresponding
  :prop_tgt:`VS_USE_DEBUG_LIBRARIES` target property were added to explicitly
  control ``UseDebugLibraries`` indicators in ``.vcxproj`` files.

Properties
----------

* The :prop_sf:`GENERATED` source file property is now visible in all
  directories.  See policy :policy:`CMP0163`.  Policy :policy:`CMP0118`'s
  documentation has been revised to describe its actual effects.

* The :prop_gbl:`PROPAGATE_TOP_LEVEL_INCLUDES_TO_TRY_COMPILE` global property
  can be used to propagate :variable:`CMAKE_PROJECT_TOP_LEVEL_INCLUDES` into
  :command:`try_compile` calls that use the
  :ref:`whole-project signature <Try Compiling Whole Projects>`.
  This is primarily intended as a way for dependency providers to be enabled
  in such :command:`try_compile` calls.

* A :prop_tgt:`VS_FILTER_PROPS` target property was added to tell
  :ref:`Visual Studio Generators` to use a custom MSBuild filter
  ``.props`` file.

Modules
-------

* The :module:`ExternalProject` module's :command:`ExternalProject_Add`
  command gained a ``TLS_VERSION <min>`` option, and support for the
  :variable:`CMAKE_TLS_VERSION` variable and :envvar:`CMAKE_TLS_VERSION`
  environment variable, to specify the minimum TLS version for connections
  to ``https://`` URLs.

* The :module:`FindBacktrace` module now provides an imported target.

* The :module:`FindBLAS` and :module:`FindLAPACK` modules gained
  support for ``libblastrampoline``.

* The :module:`FindCUDAToolkit` module now provides a target for
  ``libnvfatbin`` and ``libnvfatbin_static``, if found.

* The :module:`FindCUDAToolkit` module now searches the
  :variable:`CMAKE_CUDA_COMPILER <CMAKE_<LANG>_COMPILER>`
  variable and the :envvar:`CUDACXX` environment variable
  even when the ``CUDA`` language isn't enabled.

* The :module:`FindOpenMP` module gained an ``OpenMP_RUNTIME_MSVC``
  option to control the OpenMP runtime used with MSVC.

* The :module:`FindPython` and :module:`FindPython3` modules gained
  support for the free threaded Python version.

* The :module:`FindPython`, :module:`FindPython2`, and :module:`FindPython3`
  modules, on Windows, now offer better support for the Python debug variant:

  * new variables:

    * ``Python_EXECUTABLE_DEBUG``
    * ``Python_INTERPRETER``
    * ``Python_DEBUG_POSTFIX``

  * new targets:

    * ``Python::InterpreterDebug``
    * ``Python::InterpreterMultiConfig``

  The ``python_add_library()`` command now manages the
  :prop_tgt:`DEBUG_POSTFIX` target property based on the value
  of the ``Python_DEBUG_POSTFIX`` variable.

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

* The :genex:`<LANG>_COMPILER_FRONTEND_VARIANT <C_COMPILER_FRONTEND_VARIANT>`
  family of generator expressions were added to access the value of the
  associated :variable:`CMAKE_<LANG>_COMPILER_FRONTEND_VARIANT` variables.

* Link features, as used with the :genex:`LINK_LIBRARY` generator expression,
  gained the ability to have attributes that describe their behavior by
  specifying the :variable:`CMAKE_LINK_LIBRARY_<FEATURE>_ATTRIBUTES` or
  :variable:`CMAKE_<LANG>_LINK_LIBRARY_<FEATURE>_ATTRIBUTES` variables.

* The :genex:`QUOTE` generator expression was added to evaluate to ``"``.

* The :genex:`TARGET_PROPERTY` generator expression learned to evaluate
  :ref:`custom transitive properties <Custom Transitive Properties>`
  defined by new :prop_tgt:`TRANSITIVE_COMPILE_PROPERTIES` and
  :prop_tgt:`TRANSITIVE_LINK_PROPERTIES` target properties.

* The :genex:`TARGET_PROPERTY` generator expression now evaluates target
  properties :prop_tgt:`INTERFACE_LINK_OPTIONS`,
  :prop_tgt:`INTERFACE_LINK_DIRECTORIES`, and
  :prop_tgt:`INTERFACE_LINK_DEPENDS` correctly by following private
  dependencies of static libraries.  See policy :policy:`CMP0166`.

CTest
-----

* The :command:`ctest_submit` command and :option:`ctest -T Submit <ctest -T>`
  step gained ``TLSVersion`` and ``TLSVerify`` options to control negotiation
  with ``https://`` URLs.  See the :variable:`CTEST_TLS_VERSION` and
  :variable:`CTEST_TLS_VERIFY` variables.

CPack
-----

* The :cpack_gen:`CPack Inno Setup Generator` is now available
  on non-Windows hosts.

* The :cpack_gen:`CPack NuGet Generator` gained the
  :variable:`CPACK_NUGET_PACKAGE_README`,
  :variable:`CPACK_NUGET_PACKAGE_REPOSITORY_URL`,
  :variable:`CPACK_NUGET_PACKAGE_REPOSITORY_TYPE`,
  :variable:`CPACK_NUGET_PACKAGE_REPOSITORY_BRANCH`, and
  :variable:`CPACK_NUGET_PACKAGE_REPOSITORY_COMMIT` variables.

* The :cpack_gen:`CPack NuGet Generator` can now generate dependency groups
  for framework-specific dependencies. The :variable:`CPACK_NUGET_PACKAGE_TFMS`
  variable was added to specify a list of target framework monikers (TFMs)
  for which groups should be generated.

* The :cpack_gen:`CPack WIX Generator` gained support for WiX Toolset v4.
  See the :variable:`CPACK_WIX_VERSION` variable.

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

* The :module:`FindBoost` module has been removed by policy :policy:`CMP0167`.
  Port projects to upstream Boost's ``BoostConfig.cmake`` package
  configuration file, for which ``find_package(Boost)`` now searches.

* Calling :command:`FetchContent_Populate` with just the name of a
  dependency is now deprecated. Projects should call
  :command:`FetchContent_MakeAvailable` instead. See policy :policy:`CMP0169`.
  Calling :command:`FetchContent_Populate` with full population details
  rather than just a dependency name remains fully supported.

* The :generator:`Visual Studio 9 2008` generator has been removed.

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

* The precompiled Windows ``.msi`` installers provided on
  `cmake.org <https://cmake.org/download/>`_, when performing a fresh
  installation, now modify the system-wide ``PATH`` by default.
  When replacing an existing installation of 3.30 or later, the ``PATH``
  modification preference is preserved by default.

* The official ``.zip`` source archive provided on
  `cmake.org <https://cmake.org/download/>`_ now uses LF newlines,
  instead of CRLF newlines, for consistency with modern conventions.

* The durations printed after "Configuring done" and "Generating done"
  messages now reflect time spent in generator-specific steps, and
  in a code model evaluation step at the beginning of generation that
  was not previously captured.  Printed durations may appear longer
  than in previous versions of CMake, but are more accurate.

* :module:`FetchContent` now prefers to populate content directly rather
  than using a separate sub-build. This may significantly improve configure
  times on some systems (Windows especially, but also on macOS when using
  the Xcode generator). :option:`cmake --fresh` also forces the download,
  update, and patch steps of directly populated dependencies to be re-executed.
  Policy :policy:`CMP0168` provides backward compatibility for those projects
  that still rely on using a sub-build for content population.

* When :variable:`FETCHCONTENT_FULLY_DISCONNECTED` is set to true,
  :command:`FetchContent_MakeAvailable` and the single-argument form of
  :command:`FetchContent_Populate` require that the dependency's source
  directory has already been populated. CMake 3.29 and earlier did not
  check this requirement, but it is now enforced, subject to policy
  :policy:`CMP0170`.

Updates
=======

Changes made since CMake 3.30.0 include the following.

3.30.1, 3.30.2
--------------

* These versions made no changes to documented features or interfaces.
  Some implementation updates were made to support ecosystem changes
  and/or fix regressions.

3.30.3
------

* The :command:`project(<PROJECT-NAME>)` command now sets
  :variable:`<PROJECT-NAME>_SOURCE_DIR`, :variable:`<PROJECT-NAME>_BINARY_DIR`,
  and :variable:`<PROJECT-NAME>_IS_TOP_LEVEL` as normal variables in addition
  to setting them as cache entries.  This is needed to preserve support for
  some :module:`FetchContent` use cases under policy :policy:`CMP0169`'s
  NEW behavior.

* The :module:`FindPython` and :module:`FindPython3` modules now define,
  respectively, the ``Python_DEFINITIONS`` and  ``Python3_DEFINITIONS``
  variables on Windows to support development with the free threaded
  version of Python.  The :prop_tgt:`INTERFACE_COMPILE_DEFINITIONS` target
  property is also defined for the various targets provided by these modules.

3.30.4
------

* The :command:`project(<PROJECT-NAME>)` command now sets
  :variable:`<PROJECT-NAME>_SOURCE_DIR`, :variable:`<PROJECT-NAME>_BINARY_DIR`,
  and :variable:`<PROJECT-NAME>_IS_TOP_LEVEL` as normal variables only if they
  are already set as normal variables when :command:`project` is invoked.
  Cache entries by the same names are always set as before.
  This refines 3.30.3's behavior change to restore behavior of nested
  directories that call :command:`project` with the same project name.
