CMake 4.2 Release Notes
***********************

.. only:: html

  .. contents::

Changes made since CMake 4.1 include the following.

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

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

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

* The :manual:`cmake-file-api(7)` "codemodel" version 2 "target" and
  "directory" objects gained a new ``codemodelVersion`` field.

* The :manual:`cmake-file-api(7)` "codemodel" version 2 now includes imported
  targets and all interface library targets in its replies.  Previously,
  imported targets were omitted, and only those interface targets that
  participated in the build system were included.  The following changes
  support these new additions:

  * The "target" object gained ``imported``, ``local``, and ``abstract`` fields.
  * The "target" object's ``type`` field can now also hold the value
    ``UNKNOWN_LIBRARY``.
  * The "codemodel" object's ``configurations`` entries gained a new
    ``abstractTargets`` array.
  * Entries in the ``directories`` and ``projects`` arrays of the "codemodel"
    object's ``configurations`` entries gained a new ``abstractTargetIndexes``
    array.

* The :manual:`cmake-file-api(7)` "codemodel" version 2 "target" object gained
  new ``linkLibraries``, ``interfaceLinkLibraries``, ``compileDependencies``,
  ``interfaceCompileDependencies``, ``objectDependencies``, and
  ``orderDependencies`` fields.

Generators
----------

* The :generator:`Visual Studio 18 2026` generator was added.  This is
  experimental and based on "Visual Studio 2026 Insiders" because this
  version of VS has not been released.

* The :generator:`FASTBuild` generator was added.

Platforms
---------

* CMake now supports :ref:`Cross Compiling for Emscripten` with simple
  toolchain files.

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

* The :manual:`cmake(1)` command-line tool now supports
  ``cmake -E copy_if_newer`` and ``cmake -E copy_directory_if_newer``
  subcommands to copy files based on timestamp comparison instead of
  content comparison. These commands copy files only if the source is
  newer than the destination, providing better performance for build
  systems compared to ``copy_if_different`` which compares file contents.

Commands
--------

* The :command:`cmake_language(TRACE)` command was added to enable or
  disable tracing during script execution.

* The :command:`set(CACHE{<variable>}) <set(CACHE)>` and
  :command:`unset(CACHE{<variable>}) <unset(CACHE)>` commands were added to
  explicitly set and unset cache entries.

* The :command:`string(REGEX QUOTE)` command was added to
  generate a regular expression exactly matching a string.

Variables
---------

* The :variable:`CMAKE_CXX_STDLIB_MODULES_JSON` variable was added to set
  the path to the ``import std`` metadata file for the standard library
  rather than using the compiler to discover its location.

* The :variable:`CMAKE_INTERMEDIATE_DIR_STRATEGY` variable and corresponding
  :envvar:`CMAKE_INTERMEDIATE_DIR_STRATEGY` environment variable were added
  to change the strategy used to name intermediate directories used for
  object files and other associated target metadata.

* The :variable:`CMAKE_AUTOGEN_INTERMEDIATE_DIR_STRATEGY` variable and
  corresponding :envvar:`CMAKE_AUTOGEN_INTERMEDIATE_DIR_STRATEGY` environment
  variable were added to change the strategy used to name intermediate
  directories used for :manual:`Qt Autogen <cmake-qt(7)>` files.

* The :variable:`CMAKE_SKIP_LINTING` variable and corresponding
  :prop_tgt:`SKIP_LINTING` target property were added to tell the
  :ref:`Command-Line Build Tool Generators` to skip linting all
  sources in a target.

Properties
----------

* The :prop_sf:`INSTALL_OBJECT_NAME` source file property was added to
  control names of installed object files for specific compiled sources.

* The :prop_tgt:`INSTALL_OBJECT_NAME_STRATEGY` target property was added
  to control the naming strategy for installed object files.

* The :prop_tgt:`INSTALL_OBJECT_ONLY_USE_DESTINATION` target property was
  added to more precisely control the installation path for object files.

* The :prop_sf:`JOB_POOL_COMPILE` source file property was added
  to assign individual source compilations to :prop_gbl:`JOB_POOLS`.

* The :prop_sf:`OBJECT_NAME` source file property was added to control
  object names of compiled source files.

* The :prop_tgt:`UNITY_BUILD_FILENAME_PREFIX` target property was added
  to control names of source files generated by :prop_tgt:`UNITY_BUILD`.

Modules
-------

* Nearly all find modules now provide a ``<PackageName>_VERSION`` result
  variable matching the casing of its module name.  Existing variants such as
  ``<PackageName>_VERSION_STRING`` and uppercased ``<PACKAGENAME>_VERSION``
  are deprecated.  See documentation of each find module for details.

* The :module:`CheckTypeSize` module's :command:`check_type_size` command
  gained a new ``RESULT_VARIABLE`` keyword to customize the result variable
  name instead of the default ``HAVE_<size-var>``.

* The :module:`ExternalProject` module's :command:`ExternalProject_Add`
  and :command:`ExternalProject_Add_Step` commands now provide options to set
  environment variables on the configure, build, install, and test steps.

* The :module:`FindPython3`, :module:`FindPython2`, and :module:`FindPython`
  modules no longer make ``NumPy`` depend on ``Development.Module``.
  See policy :policy:`CMP0201`.

* The :module:`GoogleTest` module's :command:`gtest_discover_tests()`
  command now sets the ``DEF_SOURCE_LINE`` test property for each
  discovered test if gtest supports the ``--gtest_output=json`` option.
  This test property is used by some IDEs to locate the source for each test.

* The :module:`UseSWIG` module's :command:`swig_add_library` command gained a
  ``DEBUG_POSTFIX`` option to control the :prop_tgt:`DEBUG_POSTFIX` target
  property.

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

* The :genex:`<LANG>_COMPILER_LINKER_ID <C_COMPILER_LINKER_ID>` and
  :genex:`<LANG>_COMPILER_LINKER_FRONTEND_VARIANT <C_COMPILER_LINKER_FRONTEND_VARIANT>`
  families of generator expressions were added to access the value of the
  associated :variable:`CMAKE_<LANG>_COMPILER_LINKER_ID` and
  :variable:`CMAKE_<LANG>_COMPILER_LINKER_FRONTEND_VARIANT` variables.

* The :genex:`TARGET_FILE_BASE_NAME`, :genex:`TARGET_IMPORT_FILE_BASE_NAME`,
  :genex:`TARGET_LINKER_FILE_BASE_NAME`,
  :genex:`TARGET_LINKER_LIBRARY_FILE_BASE_NAME`,
  :genex:`TARGET_LINKER_IMPORT_FILE_BASE_NAME`, and
  :genex:`TARGET_PDB_FILE_BASE_NAME`
  generator expressions gained a ``POSTFIX`` option to control the inclusion
  of the :prop_tgt:`<CONFIG>_POSTFIX` target property as part of the base
  names of the corresponding files.

* The :genex:`TARGET_INTERMEDIATE_DIR` generator expression was
  added to refer to a target's intermediate files directory in
  the build tree.

CPack
-----

* The :variable:`CPACK_PACKAGE_CHECKSUM` variable now supports multiple values.

* The :cpack_gen:`CPack NSIS Generator` gained a
  :variable:`CPACK_NSIS_CRC_CHECK` variable for setting the ``CRCCheck``
  attribute.

* The :cpack_gen:`CPack WIX Generator` gained a
  :variable:`CPACK_WIX_CAB_PER_COMPONENT` variable to enable one ``.cab``
  per component.

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

* All find modules now provide a ``<PackageName>_FOUND`` result variable
  matching the casing of its module name.  Existing variants, such as the
  uppercased ``<PACKAGENAME>_FOUND``, are deprecated where appropriate.
  See documentation of each find module for details.

* The :module:`FindwxWidgets` module's result variable
  ``wxWidgets_USE_FILE`` is now deprecated in favor of including the
  :module:`UsewxWidgets` module directly.

* The :generator:`Visual Studio 14 2015` generator is now deprecated
  and will be removed in a future version of CMake.

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

* The :genex:`$<CONFIG:cfgs>` generator expression, when appearing on an
  imported target, has been fixed to only match the configuration actually
  being consumed.  See policy :policy:`CMP0199`.

* Selection of configuration and location of imported targets is now more
  consistent.  See policy :policy:`CMP0200`.

* The :variable:`CMAKE_PARENT_LIST_FILE` variable is no longer defined when
  processing a ``CMakeLists.txt`` file.  See policy :policy:`CMP0198`.

* For builds targeting the MSVC ABI, all generators now add the ``_MBCS``
  preprocessor definition when compiling sources unless ``_UNICODE`` or
  ``_SBCS`` is found.  See policy :policy:`CMP0204`.

* For builds targeting the MSVC ABI, all generators now add the ``_WINDLL``
  preprocessor definition when compiling sources in shared libraries.
  See policy :policy:`CMP0203`.
