Release Date: 7th December 2021
This is part of the change history for the book Professional CMake: A Practical Guide. The 11th Edition has been updated for the CMake 3.22 release. Compared to previous releases, CMake 3.22 was a relatively small update. The 11th Edition is therefore also correspondingly smaller than usual. The most significant change for this edition is a rewrite of the section covering Android. The new environment modification test property is also noteworthy. As usual, a range of smaller updates and clarifications have also been made. The main changes in this edition are listed below.
Flow Control chapter:
- Added a note to highlight that
if(ENV{some_var})
always evaluates to false.
Build Type chapter:
- CMake 3.22 added support for initialising the build type from a
CMAKE_BUILD_TYPE
environment variable for single configuration generators. - CMake 3.22 added support for initialising the set of build types from a
CMAKE_CONFIGURATION_TYPES
environment variable for multi configuration generators.
Language Requirements chapter:
- Updated and clarified the CMake versions that first supported various CUDA language standards (the CMake documentation had previously been somewhat incorrect and was also updated). CUDA 23 was also added by CMake 3.22.
- CMake 3.22 now honours
<LANG>_EXTENSIONS
fully independently from<LANG>_STANDARD
. In previous CMake versions, the latter had to be set for the former to have any effect. This relates to a new CMP0128 policy, which also has other effects related to setting the language standard and enabling compiler extensions.
Working With Files chapter:
- Fixed an error in one of the earlier
cmake_path()
examples to do with setting thepath
variable from a string.
Toolchains And Cross Compiling chapter:
- The example section for Android was lifted out to its own proper section and was almost entirely rewritten. It now focuses on using NDK r23 or later with CMake 3.21 or later. The previous discussion for earlier NDK and CMake versions has mostly been removed, apart from some historical context. The new section is more focused and easier to follow. Discussion of the unmaintained Nvidia Nsight Tegra Visual Studio Edition has also been removed.
Finding Things chapter:
- CMake 3.22 added support for a new
CMAKE_REQUIRE_FIND_PACKAGE_<packageName>
variable to turn optional packages into required ones. - CMake 3.22 updated the
FindPkgConfig
module to allow passing arbitrary arguments to thepkgconfig
executable.
Testing chapter:
- CMake 3.22 added a new
ENVIRONMENT_MODIFICATION
test property which allows a test’s environment variables to be modified at test time instead of only being able to specify values based on details available at configure time. - With CMake 3.22, tests can now add test labels dynamically by including appropriate tags in the test output. These are made available in CDash dashboard results.
Memcheck
dashboard steps now also submit their test results to CDash (new behavior in CMake 3.22, previously those test results were lost and only the memory check results were submitted).- The
gtest_discover_tests()
command now supports a newTEST_FILTER
keyword which can be used to filter the set of discovered tests (new in CMake 3.22).
Installing chapter:
- Added a recommended practice related to the support for a new
CMAKE_INSTALL_MODE
environment variable added in CMake 3.22.
Packaging chapter:
- CMake 3.22 added a new
CPACK_NSIS_IGNORE_LICENSE_PAGE
variable to turn off the license page in NSIS installers.
Working With Qt chapter:
- Added some very brief comments regarding Qt 6, but the chapter still focuses predominantly on Qt 5.