CMake 4.3 Release Notes
***********************

.. only:: html

  .. contents::

Changes made since CMake 4.2 include the following.

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

Common Package Specification
----------------------------

* Support for importing and exporting packages described using the |CPS|_
  (CPS) was added.  This improves build system interoperability by allowing
  expressive, feature-rich package descriptions to be exchanged in a format
  other than CMake Language.

  * The :command:`find_package` now searches for and can import CPS packages.

  * The :command:`install` and :command:`export` commands gained a new
    ``PACKAGE_INFO`` sub-command to generate CPS package descriptions.

  * The :command:`project` command gained new ``COMPAT_VERSION`` and
    ``SPDX_LICENSE`` options.  These values may be inherited when creating a
    CPS package description.  See the :command:`install(PACKAGE_INFO)`
    documentation for details.

.. _CPS: https://cps-org.github.io/cps/
.. |CPS| replace:: Common Package Specification

Instrumentation
---------------

* :manual:`cmake-instrumentation(7)` was added to enable collection of
  timing data, target information, and system diagnostic information during
  the configure, generate, build, test, and install steps of a CMake project:

  * Instrumentation data are :ref:`indexed <cmake-instrumentation Indexing>`
    and provided to :ref:`callbacks <cmake-instrumentation Callbacks>` for
    custom processing.

  * Instrumentation data are included in submissions to CDash.

  * Optionally,
    :ref:`Google Trace Event Format <cmake-instrumentation Google Trace File>`
    files may be generated to visualize instrumentation data.

Presets
-------

* :manual:`cmake-presets(7)` files now support schema version ``11``.
  The ``jobs`` field under test presets now supports an empty string, to
  match the behavior of :option:`ctest --parallel` with the value omitted.
* The ``jobs`` field under both build and test presets no longer accept
  negative integer values, regardless of the schema version.

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

* The :manual:`cmake-file-api(7)` "codemodel" version 2 version field
  has been updated to 2.10.

* The :manual:`cmake-file-api(7)` "codemodel" version 2 "target" object
  gained a new ``interfaceSources`` array field, and the ``sourceGroups``
  array items gained a new ``interfaceSourceIndexes`` array field.

Platforms
---------

* ``HIP`` language code may now be compiled for SPIR-V targets,
  e.g., via chipStar.  See the :variable:`CMAKE_HIP_PLATFORM` variable.

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

* :option:`cmake --version` now supports a ``=json-v1`` value to print
  detailed version information in a JSON format.

* :option:`cmake --build` now supports specifying a build directory and
  preset together.  The build preset will be used with the explicit
  build directory substituted.

* The :option:`cmake -E` commands
  :option:`md5sum <cmake-E md5sum>`,
  :option:`sha1sum <cmake-E sha1sum>`,
  :option:`sha224sum <cmake-E sha224sum>`,
  :option:`sha256sum <cmake-E sha256sum>`,
  :option:`sha384sum <cmake-E sha384sum>`, and
  :option:`sha512sum <cmake-E sha512sum>`
  now support reading from standard input by passing ``-``.

* The :option:`cmake -E bin2c <cmake-E bin2c>` command-line tool was added.

* The :option:`cmake -E tar <cmake-E tar>` command-line tool:

  * Gained a ``--cmake-tar-compression-level`` flag to specify the
    compression level.
  * Gained a ``--cmake-tar-compression-method`` flag to specify the
    compression method.
  * Gained a ``--cmake-tar-threads`` flag to enable multithreaded operations.
  * Now supports specifying compression method and level for ``7zip`` and
    ``zip`` formats.
  * Gained a ``--format=raw`` flag to disable compression.
  * Gained a ``--lzma`` flag to specify ``LZMA`` compression.

Commands
--------

* The :command:`cmake_instrumentation` command was added to make
  project-level instrumentation queries.

* The :command:`file(ARCHIVE_CREATE)` command:

  * Gained a ``THREADS`` option to enable multithreaded operations.
  * Now supports ``COMPRESSION`` method ``Deflate`` as an alias for ``GZip``.
  * Now supports ``COMPRESSION`` method ``LZMA``.
  * Now supports ``COMPRESSION`` method ``LZMA2`` as an alias for ``XZ``.
  * Now supports ``COMPRESSION`` method ``PPMd`` for format ``7zip``.
  * Now supports ``COMPRESSION`` and ``COMPRESSION_LEVEL`` options
    for formats ``7zip`` and ``zip``.

* The :command:`get_property` and :command:`set_property` commands
  now support a ``FILE_SET`` scope for file set properties of a target.

* The :command:`string(JSON)` command gained new ``GET_RAW`` and
  ``STRING_ENCODE`` modes.

* The :command:`source_group` command now supports
  :manual:`generator expressions <cmake-generator-expressions(7)>`.

* The :command:`cmake_host_system_information` command gained a
  ``LOCALE_CHARSET`` query for the expected :manual:`cmake-language(7)`
  script encoding.

Variables
---------

* The :variable:`CMAKE_<LANG>_LINK_FLAGS` and
  :variable:`CMAKE_<LANG>_LINK_FLAGS_<CONFIG>` variables were added
  to support per-language link flags for all target types.
  See policy :policy:`CMP0210`.

* The :variable:`CMAKE_VERIFY_PRIVATE_HEADER_SETS` variable and corresponding
  :prop_tgt:`VERIFY_PRIVATE_HEADER_SETS` target property were added to
  enable build rules that verify all headers in private file sets can be used
  on their own.

Properties
----------

* A :prop_tgt:`<LANG>_PVS_STUDIO` target property and supporting
  :variable:`CMAKE_<LANG>_PVS_STUDIO` variable were introduced to tell
  :ref:`Makefile Generators` and :ref:`Ninja Generators` to run
  ``pvs-studio-analyzer`` with the compiler for ``C`` and ``CXX`` languages.

* When :prop_tgt:`VERIFY_INTERFACE_HEADER_SETS` is set to true on an executable
  target, that target's interface file sets are verified regardless of its
  :prop_tgt:`ENABLE_EXPORTS` property. See policy :policy:`CMP0209`.

* The :prop_tgt:`PRIVATE_HEADER_SETS_TO_VERIFY` target property was added to
  customize which private file sets to verify when the target's
  :prop_tgt:`VERIFY_PRIVATE_HEADER_SETS` property is true.

Modules
-------

* The :module:`FindCUDAToolkit` module now creates a ``CUDA::bin2c``
  imported target for the :ref:`bin2c <FindCUDAToolkit_bin2c>` utility.

* The :module:`FindLibXml2` module gained a ``LibXml2_USE_STATIC_LIBS`` hint
  to select static libraries.

* The :module:`FindRuby` module now provides imported targets.

* The :module:`FindSQLite3` module now provides imported
  targets with the ``SQLite3::`` prefix.

* The :module:`UseJava` module's :command:`add_jar` command now accepts a new
  ``INCLUDE_MODULES`` option that adds its arguments to the ``--module-path``
  argument to the Java compiler. This allows building JAR files that use JPMS
  modules in their build.

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

* :ref:`String Comparison <String Comparisons Generator Expressions>`
  generator expressions were added.

* :genex:`$<STRING:...>` generator expressions were added for
  :ref:`query <String Queries Generator Expressions>`,
  :ref:`generation <String Generating Generator Expressions>`, and
  :ref:`transformation <String Transforming Generator Expressions>`
  operations on strings.

* The :genex:`$<FILE_SET_EXISTS>` and :genex:`$<FILE_SET_PROPERTY>` generator
  expressions were added to query file set existence and properties.

* The :genex:`$<SOURCE_EXISTS>` and :genex:`$<SOURCE_PROPERTY>` generator
  expressions were added to query source file existence and properties.

CTest
-----

* The :module:`CTestCoverageCollectGCOV` module:

  * Now supports ``TARBALL_COMPRESSION`` method ``LZMA``.

  * Now supports ``TARBALL_COMPRESSION`` method ``LZMA2``
    as an alias for ``XZ``.

  * Now supports ``FROM_EXT`` with file extensions corresponding to
    ``LZMA`` and ``ZSTD`` compression.

CPack
-----

* :module:`CPack` gained the :variable:`CPACK_COMPRESSION_LEVEL`
  variable to control the compression level used when creating
  packages.

* The :cpack_gen:`CPack Archive Generator`:

  * Now supports compression method specification for formats
    ``7zip`` and ``zip``.

  * Gained a :variable:`CPACK_ARCHIVE_COMPRESSION_LEVEL` option to
    control the compression level used when creating archive packages.

  * Gained :variable:`CPACK_ARCHIVE_UID` and :variable:`CPACK_ARCHIVE_GID`
    options to specify the UID and GID of archive entries, respectively.
    The defaults are UID ``0`` and GID ``0``.  See policy :policy:`CMP0206`.

* The :cpack_gen:`CPack DEB Generator` gained a new
  :variable:`CPACK_DEBIAN_COMPRESSION_LEVEL` variable to control the
  compression level used when creating Debian packages.

* The :cpack_gen:`CPack WIX Generator` now supports per-user installers
  by setting :variable:`CPACK_WIX_INSTALL_SCOPE` to ``perUser``.

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

* The :variable:`CMAKE_ENABLE_EXPORTS` variable is deprecated in favor of
  the :variable:`CMAKE_EXECUTABLE_ENABLE_EXPORTS` and
  :variable:`CMAKE_SHARED_LIBRARY_ENABLE_EXPORTS` variables.

* The :command:`export(EXPORT)` command no longer allows certain
  arguments to be missing or empty.  See policy :policy:`CMP0208`.

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

* The :option:`cmake -E tar <cmake-E tar>` command-line tool
  and the :command:`file(ARCHIVE_EXTRACT)` command now reject archive
  entries whose paths are absolute or contain ``..`` path traversal
  components.

* The family of :option:`cmake --trace` and related commands now print "end"
  commands for control structures: :command:`endblock`, :command:`endforeach`,
  :command:`endfunction`, :command:`endif`, :command:`endmacro`, and
  :command:`endwhile`.

* The :command:`file(CREATE_LINK)` command's ``COPY_ON_ERROR`` option,
  when used with a directory, now copies directory content.
  See policy :policy:`CMP0205`.

* The :command:`file(GET_RUNTIME_DEPENDENCIES)`
  and :command:`install(RUNTIME_DEPENDENCY_SET)` commands now normalize
  paths before matching filters.  See policy :policy:`CMP0207`.

* The precompiled Linux ``aarch64`` binaries provided on
  `cmake.org <https://cmake.org/download/>`_ now require GLIBC 2.28 or higher.

* The precompiled macOS binary provided on ``cmake.org`` for macOS 10.13+
  now requires macOS 12 or newer for the :manual:`cmake-gui(1)` application.
  The command-line tools still run on macOS 10.13.

* The precompiled Windows binaries provided on
  `cmake.org <https://cmake.org/download/>`_ now require Windows 10 or higher.

Updates
=======

Changes made since CMake 4.3.0 include the following.

4.3.1, 4.3.2
------------

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

4.3.3
-----

* The :command:`export(PACKAGE_INFO)` command now writes to the
  ``cps/<package-name>`` subdirectory of the current build directory,
  rather than directly to the current build directory.

4.3.4
-----

* :manual:`cmake-instrumentation(7)`, introduced in 4.3.0, has been *changed*
  to generate :ref:`index files <cmake-instrumentation v1 Index File>` and
  :ref:`snippet files <cmake-instrumentation v1 Snippet File>` with a new
  ``version`` field format.  It is now an object with major and minor version
  components, ``{ "major": 1, "minor": 0 }``.  Previously it was an integer
  with only the major version, ``1``.
