1CMake 3.20 Release Notes
2************************
3
4.. only:: html
5
6  .. contents::
7
8Changes made since CMake 3.19 include the following.
9
10New Features
11============
12
13Presets
14-------
15
16* :manual:`cmake-presets(7)` gained support for build and test presets.
17
18Generators
19----------
20
21* :ref:`Makefile Generators`, for some toolchains, now use the compiler
22  to extract implicit dependencies while compiling source files.
23
24Languages
25---------
26
27* C++23 compiler modes may now be specified via the :prop_tgt:`CXX_STANDARD`,
28  :prop_tgt:`CUDA_STANDARD`, or :prop_tgt:`OBJCXX_STANDARD` target properties,
29  or via the :manual:`Compile Features <cmake-compile-features(7)>`
30  functionality's ``cxx_std_23`` meta-feature.
31
32* ``CUDA`` language support now works when ``nvcc`` is a symbolic link,
33  for example due to a ``ccache`` or ``colornvcc`` wrapper script.
34
35* The :envvar:`CUDAARCHS` environment variable was added for initializing
36  :variable:`CMAKE_CUDA_ARCHITECTURES`. Useful in cases where the compiler
37  default is unsuitable for the machine's GPU.
38
39Compilers
40---------
41
42* The NVIDIA HPC SDK compilers are now supported with compiler id ``NVHPC``.
43
44* The Intel oneAPI NextGen LLVM compilers are now supported with
45  compiler id ``IntelLLVM``:
46
47  * The ``icx``/``icpx`` C/C++ compilers on Linux, and the ``icx``
48    C/C++ compiler on Windows, are fully supported as of oneAPI 2021.1.
49
50  * The ``ifx`` Fortran compiler on Linux is supported as of oneAPI 2021.1.
51
52  * The ``ifx`` Fortran compiler on Windows is not yet supported.
53
54  The Intel oneAPI Classic compilers (``icc``, ``icpc``, and ``ifort``)
55  continue to be supported with compiler id ``Intel``.
56
57* Support was added for the IAR STM8 compiler.
58
59Platforms
60---------
61
62* CMake's support for :ref:`Cross Compiling for Android`
63  is now merged with the Android NDK's toolchain file.
64  They now have similar behavior, though some variable names differ.
65  User-facing changes include:
66
67  - ``find_*`` functions will search NDK ABI / API specific paths by default.
68
69  - The default :variable:`CMAKE_BUILD_TYPE` for Android is
70    now ``RelWithDebInfo``.
71
72  - The :variable:`CMAKE_ANDROID_NDK_VERSION` variable was added to
73    report the version of the NDK.
74
75File-Based API
76--------------
77
78* The :manual:`cmake-file-api(7)` gained a new "toolchains" object
79  kind that describes the compiler used for each enabled language.
80
81Commands
82--------
83
84* :command:`add_custom_command` and :command:`add_custom_target` now
85  support :manual:`generator expressions <cmake-generator-expressions(7)>`
86  in their ``OUTPUT`` and ``BYPRODUCTS`` options.
87
88  Their ``COMMAND``, ``WORKING_DIRECTORY``, and ``DEPENDS`` options gained
89  support for new generator expressions ``$<COMMAND_CONFIG:...>`` and
90  ``$<OUTPUT_CONFIG:...>`` that control cross-config handling when using
91  the :generator:`Ninja Multi-Config` generator.
92
93* The :command:`add_custom_command` command gained ``DEPFILE`` support on
94  :ref:`Makefile Generators`.
95
96* The :command:`add_library` command previously prohibited imported object
97  libraries when using potentially multi-architecture configurations.
98  This mostly affected the :generator:`Xcode` generator, e.g. when targeting
99  iOS or one of the other device platforms.  This restriction has now been
100  removed.
101
102* The :command:`cmake_path` command was added for operations on
103  filesystem paths.
104
105* The :command:`configure_file` command gained ``USE_SOURCE_PERMISSIONS``
106  and ``FILE_PERMISSIONS`` options to support copying of permissions of the
107  source file and using specified permissions respectively.
108
109* The :command:`file(GENERATE)` command gained a ``NEWLINE_STYLE`` option to
110  specify how newlines are handled for the generated file.
111
112* The :command:`file(GENERATE)` command gained ``NO_SOURCE_PERMISSIONS``,
113  ``USE_SOURCE_PERMISSIONS``, and ``FILE_PERMISSIONS`` options for controlling
114  the permissions of the generated file.
115
116* The :command:`install(FILES)` command ``RENAME`` option learned to
117  support :manual:`generator expressions <cmake-generator-expressions(7)>`.
118
119* The :command:`target_include_directories` command gained a new option
120  ``AFTER``.
121
122* The :command:`target_sources` command now supports targets created
123  by the :command:`add_custom_target` command.
124
125* The :command:`try_run` command gained a ``WORKING_DIRECTORY`` option to
126  set the working directory in which to run the compiled check executable.
127
128Variables
129---------
130
131* The :variable:`CMAKE_<LANG>_BYTE_ORDER` variable was added to provide the
132  target architecture byte order detected from the toolchain.
133
134* The :variable:`CMAKE_RUNTIME_OUTPUT_DIRECTORY`,
135  :variable:`CMAKE_LIBRARY_OUTPUT_DIRECTORY`, and
136  :variable:`CMAKE_ARCHIVE_OUTPUT_DIRECTORY` variables now support
137  target-dependent generator expressions.
138
139Properties
140----------
141
142* The :prop_tgt:`<LANG>_CLANG_TIDY` target property and the associated
143  :variable:`CMAKE_<LANG>_CLANG_TIDY` variable learned to support
144  the ``OBJC`` and ``OBJCXX`` languages.
145
146* The :prop_tgt:`EXPORT_COMPILE_COMMANDS` target property was added
147  for the associated :variable:`CMAKE_EXPORT_COMPILE_COMMANDS` variable
148  to allow for configuration of exporting compile commands per target.
149
150* The :prop_sf:`GENERATED` source-file property is now visible
151  from any directory scope, regardless of the scope in which it is set.
152  See policy :policy:`CMP0118`.
153
154* The :prop_tgt:`UNITY_BUILD_UNIQUE_ID` target property
155  was added to support generation of an identifier that is
156  unique per source file in unity builds.  It can help to
157  resolve duplicate symbol problems with anonymous namespaces.
158
159* The :prop_tgt:`WIN32_EXECUTABLE` target property now works with Clang
160  on Windows.
161
162* The :prop_tgt:`XCODE_EMBED_FRAMEWORKS <XCODE_EMBED_<type>>` target property
163  was added to tell the :generator:`Xcode` generator to embed frameworks.
164  Aspects of the embedding can be customized with the
165  :prop_tgt:`XCODE_EMBED_FRAMEWORKS_PATH <XCODE_EMBED_<type>>`,
166  :prop_tgt:`XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY`, and
167  :prop_tgt:`XCODE_EMBED_FRAMEWORKS_REMOVE_HEADERS_ON_COPY` target properties.
168
169Modules
170-------
171
172* The :module:`ExternalData` module :command:`ExternalData_Add_Target`
173  function gained a ``SHOW_PROGRESS <bool>`` option for controlling whether
174  or not to show progress output during the build.
175
176* The :module:`ExternalProject` module :command:`ExternalProject_Add` function
177  gained a ``CONFIGURE_HANDLED_BY_BUILD`` option.  This can be used to make
178  subsequent runs of the configure step be triggered by the build step when
179  an external project dependency rebuilds instead of always re-running the
180  configure step in such cases.
181
182* The :module:`FindBoost` module gained a ``Boost_NO_WARN_NEW_VERSIONS``
183  option to silence the warning about unknown dependencies for new
184  Boost versions.
185
186* The :module:`FindCUDAToolkit` module gained support for finding CUDA
187  toolkits when ``nvcc`` is a symbolic link,
188  for example due to a ``ccache`` or ``colornvcc`` wrapper script.
189
190* The :module:`FindGDAL` module has been improved to document and mark as
191  advanced its cache variables. There is a new ``FindGDAL_SKIP_GDAL_CONFIG``
192  variable which may be used to skip over the ``gdal-config``-based search.
193  Users may also set ``GDAL_ADDITIONAL_LIBRARY_VERSIONS`` to add additional
194  versions to the library name search strategy.
195
196* The :module:`FindIntl` module now provides an imported target.
197
198* The :module:`FindOpenSSL` module learned to support a version range.
199
200* The :module:`FindPython3`, :module:`FindPython2` and :module:`FindPython`
201  modules gained options controlling how unversioned interpreter names are
202  searched.
203
204* The :module:`UseJava` module ``add_jar()`` command's
205  ``GENERATE_NATIVE_HEADERS`` feature gained options to export the
206  generated target.
207
208* The :module:`UseSWIG` module gained the capability, for
209  :ref:`Makefile <Makefile Generators>` and :ref:`Ninja <Ninja Generators>`
210  generators, to use the ``swig`` tool to generate implicit dependencies.
211
212Autogen
213-------
214
215* The :ref:`Qt AUTOMOC` feature now works with per-config sources.
216
217CTest
218-----
219
220* :manual:`ctest(1)` gained a ``--test-dir`` option to specify the directory
221  in which to look for tests.
222
223CPack
224-----
225
226* :module:`CPack` gained the :variable:`CPACK_THREADS` variable to
227  control the number of threads used for parallelized operations,
228  such as compressing the installer package.
229
230* The :cpack_gen:`CPack DEB Generator` learned a new
231  :variable:`CPACK_DEBIAN_PACKAGE_SHLIBDEPS_PRIVATE_DIRS`
232  variable to specify additional search directories for
233  resolving private library dependencies when using
234  ``dpkg-shlibdeps``.
235
236* The :cpack_gen:`CPack IFW Generator` gained a new
237  :variable:`CPACK_IFW_PACKAGE_WIZARD_SHOW_PAGE_LIST` variable to
238  control visibility of the widget listing installer pages on the left side
239  of the wizard. This feature available only since QtIFW 4.0.
240
241* The :cpack_gen:`CPack NSIS Generator` gained new
242  :variable:`CPACK_NSIS_BRANDING_TEXT` and
243  :variable:`CPACK_NSIS_BRANDING_TEXT_TRIM_POSITION` variables to change
244  the text at the bottom of the install window and change its trim position
245
246* The :cpack_gen:`CPack NSIS Generator` now correctly handles Unicode
247  characters.  If you want to have a :variable:`CPACK_RESOURCE_FILE_LICENSE`
248  with UTF-8 characters, it needs to be encoded in UTF-8 BOM.
249
250* The :cpack_gen:`CPack NuGet Generator` gained options:
251
252  - :variable:`CPACK_NUGET_PACKAGE_ICON` and
253    :variable:`CPACK_NUGET_<compName>_PACKAGE_ICON`
254    allow package icons to be specified by local files.
255  - :variable:`CPACK_NUGET_PACKAGE_LICENSE_EXPRESSION` and
256    :variable:`CPACK_NUGET_<compName>_PACKAGE_LICENSE_EXPRESSION` add
257    support for specifying licenses recognized by the
258    `Software Package Data Exchange`_ (SPDX).
259  - :variable:`CPACK_NUGET_PACKAGE_LICENSE_FILE_NAME` and
260    :variable:`CPACK_NUGET_<compName>_PACKAGE_LICENSE_FILE_NAME` allow
261    licenses to be specified by local files.
262  - :variable:`CPACK_NUGET_PACKAGE_LANGUAGE` and
263    :variable:`CPACK_NUGET_<compName>_PACKAGE_LANGUAGE` allow the locale
264    for a package to be specified, for example ``en_CA``.
265
266.. _Software Package Data Exchange: https://spdx.org/
267
268Deprecated and Removed Features
269===============================
270
271* The :manual:`cmake-server(7)` mode has been removed.
272  Clients should use the :manual:`cmake-file-api(7)` instead.
273
274* The :module:`WriteCompilerDetectionHeader` module has been deprecated
275  via policy :policy:`CMP0120`.  Projects should be ported away from it.
276
277* The :module:`TestBigEndian` module has been deprecated in favor
278  of the :variable:`CMAKE_<LANG>_BYTE_ORDER` variable.
279
280* The :module:`AddFileDependencies` module is deprecated.
281  Port projects to use :command:`set_property` directly.
282
283* The :cpack_gen:`CPack NuGet Generator` deprecated some variables to reflect
284  changes in the NuGet specification:
285
286  - :variable:`CPACK_NUGET_PACKAGE_ICONURL` and
287    :variable:`CPACK_NUGET_<compName>_PACKAGE_ICONURL` have been deprecated;
288    replace with a reference to a local icon file.
289  - :variable:`CPACK_NUGET_PACKAGE_LICENSEURL` and
290    :variable:`CPACK_NUGET_<compName>_PACKAGE_LICENSEURL` have been deprecated;
291    replace with a reference to the project's license file or SPDX
292    license expression.
293
294Other Changes
295=============
296
297* When running :manual:`cmake(1)` to :ref:`Generate a Project Buildsystem`,
298  unknown command-line arguments starting with a hyphen (``-``) are now
299  rejected with an error.  Previously they were silently ignored.
300
301* Source file extensions must now be explicit.
302  See policy :policy:`CMP0115` for details.
303
304* The :prop_sf:`LANGUAGE` source file property now forces compilation
305  as the specified language.  See policy :policy:`CMP0119`.
306
307* On AIX, installation of XCOFF executables and shared libraries
308  no longer requires relinking to change the runtime search path
309  from the build-tree RPATH to the install-tree RPATH.  CMake now
310  edits the XCOFF binaries directly during installation, as has
311  long been done on ELF platforms.
312
313* With MSVC-like compilers the value of
314  :variable:`CMAKE_CXX_FLAGS <CMAKE_<LANG>_FLAGS>` no longer contains
315  the ``/GR`` flag for runtime type information by default.
316  See policy :policy:`CMP0117`.
317
318* Ninja generators now transform the ``DEPFILE`` generated by an
319  :command:`add_custom_command`. See policy :policy:`CMP0116` for details.
320
321* The precompiled Linux binaries provided on
322  `cmake.org <https://cmake.org/download/>`_ have changed their naming pattern
323  to ``cmake-$ver-linux-$arch``, where ``$arch`` is either ``x86_64`` or
324  ``aarch64``.
325
326* The precompiled Windows binaries provided on
327  `cmake.org <https://cmake.org/download/>`_ have changed their naming pattern
328  to ``cmake-$ver-windows-$arch``, where ``$arch`` is either ``x86_64`` or
329  ``i386``.
330
331Updates
332=======
333
334Changes made since CMake 3.20.0 include the following.
335
3363.20.1
337------
338
339* The :module:`FindIntl` module in CMake 3.20.0 added checks
340  ``Intl_HAVE_GETTEXT_BUILTIN``, ``Intl_HAVE_DCGETTEXT_BUILTIN``,
341  and ``Intl_IS_BUILTIN``, but they were not implemented correctly.
342  These have been removed and replaced with a single ``Intl_IS_BUILT_IN``
343  check, whose name is consistent with the :module:`FindIconv` module.
344
345* The ``-rpath`` linker flag is now specified as supported on all Apple
346  platforms, not just macOS.  The ``install_name_dir`` used for
347  iOS, tvOS and watchOS should now default to ``@rpath`` instead of using
348  a full absolute path and failing at runtime when the library or framework
349  is embedded in an application bundle (see :prop_tgt:`XCODE_EMBED_<type>`).
350
3513.20.2
352------
353
354* The Intel Classic 2021 compiler version numbers are now detected correctly
355  as having major version 2021.  CMake 3.20.1 and below were not aware of a
356  change to the identification macro version scheme made by Intel starting
357  in version 2021, and detected the version as 20.2.
358
359* The Intel oneAPI Fortran compiler is now identified as ``IntelLLVM``.
360  The oneAPI 2021.1 Fortran compiler is missing an identification macro,
361  so CMake 3.20.1 and below identified it as ``Intel``.  CMake now has
362  a special case to recognize oneAPI 2021.1 Fortran as ``IntelLLVM``.
363  The oneAPI 2021.2 Fortran compiler defines the proper identification
364  macro and so is identified as ``IntelLLVM`` by all CMake 3.20 versions.
365
3663.20.3, 3.20.4, 3.20.5, 3.20.6
367------------------------------
368
369These versions made no changes to documented features or interfaces.
370Some implementation updates were made to support ecosystem changes
371and/or fix regressions.
372