I am proud to announce the second CMake 3.21 release candidate.
https://cmake.org/download/
Documentation is available at:
https://cmake.org/cmake/help/v3.21
Release notes appear below and are also published at
https://cmake.org/cmake/help/v3.21/release/3.21.html
Some of the more significant changes in CMake 3.21 are:
-
CMake learned to support “HIP” as a first-class language that can be
enabled via the “project()” and “enable_language()” commands. -
The “Visual Studio 17 2022” generator was added. This is
experimental and based on “Visual Studio 2022 Preview 1.1” because
this version of VS has not been released. -
The Makefile Generators and the “Ninja” generator learned to add
linker launcher tools along with the linker for “C”, “CXX”, “OBJC”,
and “OBJCXX” languages. See the “CMAKE_<LANG>_LINKER_LAUNCHER”
variable and “<LANG>_LINKER_LAUNCHER” target property for details. -
“C_STANDARD”, “OBJC_STANDARD”, and the “Compile Features”
functionality gained support for C17 and C23. -
“cmake(1)” gained the “–toolchain <path/to/file>” command-line
option to specify a toolchain file. -
Messages printed to a terminal now may be colored by message type.
-
The Fujitsu compiler is now supported using compiler id “Fujitsu” in
traditional (“Trad”) mode, and compiler id “FujitsuClang” in “Clang”
mode. -
The “add_custom_command()” command “DEPFILE” option:
-
may now use “generator expressions”,
-
is now supported by Visual Studio Generators for VS 2012 and
above, and -
is now supported by the “Xcode” generator.
-
-
The “add_custom_command(TARGET)” command (for Build Events) gained
support for resolving target-dependent generator expressions. -
The “install(TARGETS)” command gained new “RUNTIME_DEPENDENCIES” and
“RUNTIME_DEPENDENCY_SET” arguments, which can be used to install
runtime dependencies using “file(GET_RUNTIME_DEPENDENCIES)”. -
A new “TARGET_RUNTIME_DLLS” generator expression was added.
-
“ctest(1)” gained a “–output-junit” option to write test results to
a JUnit XML file. -
The “ctest_build()” command gained a “PARALLEL_LEVEL” option.
-
“ARMClang” cpu/arch compile and link flags are no longer added
automatically based on the “CMAKE_SYSTEM_PROCESSOR” variable or the
undocumented “CMAKE_SYSTEM_ARCH” variable. They must be specified
explicitly. See policy “CMP0123”. -
The “foreach()” command now isolates loop variables in the loop
scope. See policy “CMP0124” for details.
CMake 3.21 Release Notes
Changes made since CMake 3.20 include the following.
New Features
Presets
-
“cmake-presets(7)” gained support for specifying the install prefix
in a configure preset. -
“cmake-presets(7)” gained support for conditional enabling of
presets. -
“cmake-presets(7)” gained support for a “${hostSystemName}” macro.
-
“cmake-presets(7)” gained support for omitting the “generator” and
“binaryDir” fields.
Generators
-
The Makefile Generators and the “Ninja” generator learned to add
linker launcher tools along with the linker for “C”, “CXX”, “OBJC”,
and “OBJCXX” languages. See the “CMAKE_<LANG>_LINKER_LAUNCHER”
variable and “<LANG>_LINKER_LAUNCHER” target property for details. -
The “Visual Studio 17 2022” generator was added. This is
experimental and based on “Visual Studio 2022 Preview 1.1” because
this version of VS has not been released.
Languages
-
CMake learned to support “HIP” as a first-class language that can be
enabled via the “project()” and “enable_language()” commands. -
“C_STANDARD”, “OBJC_STANDARD”, and the “Compile Features”
functionality gained support for C17 and C23. -
Source file extensions “.ixx” and “.cppm” are now treated as C++.
Command-Line
-
“cmake(1)” gained the “–install-prefix <dir>” command-line option
to specify the location of the install prefix. -
“cmake(1)” gained the “–toolchain <path/to/file>” command-line
option to specify a toolchain file. -
“cmake(1)” “-E capabilities” output, for some generators, may now
contain a “supportedPlatforms” field listing platforms known to be
supported in “CMAKE_GENERATOR_PLATFORM”. -
Messages printed to a terminal now may be colored by message type.
Compilers
- The Fujitsu compiler is now supported using compiler id “Fujitsu” in
traditional (“Trad”) mode, and compiler id “FujitsuClang” in “Clang”
mode.
Platforms
- CMake now supports the MSYS runtime environment, much like CYGWIN.
File-Based API
-
The “cmake-file-api(7)” “codemodel” version 2 “version” field has
been updated to 2.3. -
The “cmake-file-api(7)” “codemodel” version 2 gained a new
“directory” object containing directory-level information. This
includes a list of installers generated by the “install()” command.
Commands
-
The “add_custom_command()” command “DEPFILE” option:
-
may now use “generator expressions”,
-
is now supported by Visual Studio Generators for VS 2012 and
above, and -
is now supported by the “Xcode” generator.
-
-
The “add_custom_command(TARGET)” command (for Build Events) gained
support for resolving target-dependent generator expressions. -
The “build_command()” command gained a “PARALLEL_LEVEL” option.
-
The “file(COPY_FILE)” command was added to copy a single file.
-
The “file(GET_RUNTIME_DEPENDENCIES)” command gained new
“POST_INCLUDE_FILES” and “POST_EXCLUDE_FILES” arguments. -
The “file(REAL_PATH)” command gained the option “EXPAND_TILDE” to
replace any leading tilde with the path to the user’s home
directory. -
The “file(RENAME)” command learned to optionally capture failure in
a result variable. It also gained a “NO_REPLACE” option to fail if
the destination exists. -
The “install()” command gained a new “IMPORTED_RUNTIME_ARTIFACTS”
mode, which can be used to install the runtime artifacts of imported
targets. -
The “install()” command gained a new “RUNTIME_DEPENDENCY_SET” mode,
which can be used to install runtime dependencies using
“file(GET_RUNTIME_DEPENDENCIES)”. -
The “install(TARGETS)” command gained new “RUNTIME_DEPENDENCIES” and
“RUNTIME_DEPENDENCY_SET” arguments, which can be used to install
runtime dependencies using “file(GET_RUNTIME_DEPENDENCIES)”. -
The “install(SCRIPT|CODE)” command supports a new option
“ALL_COMPONENTS” which allows the corresponding code to run for
every component of a per component installation. -
The “project()” command now sets variables “PROJECT_IS_TOP_LEVEL”
and “<PROJECT-NAME>_IS_TOP_LEVEL” to indicate whether it was called
in a top-level “CMakeLists.txt” file.
Variables
- The “CMAKE_TOOLCHAIN_FILE” environment variable was added to provide
a default value for the “CMAKE_TOOLCHAIN_FILE” variable.
Properties
-
The “IMPORTED_TARGETS” directory property was added to get a list of
Imported Targets created in the current directory. -
The “XCODE_EMBED_APP_EXTENSIONS” target property was added to tell
the “Xcode” generator to embed app extensions such as iMessage
sticker packs. Aspects of the embedding can be customized with the
“XCODE_EMBED_APP_EXTENSIONS_PATH”,
“XCODE_EMBED_APP_EXTENSIONS_CODE_SIGN_ON_COPY” and
“XCODE_EMBED_APP_EXTENSIONS_REMOVE_HEADERS_ON_COPY” properties.
Modules
-
The “FindBLAS” and “FindLAPACK” modules learned to support the
serial “Fujitsu_SSL2” and parallel “Fujitsu_SSL2BLAMP” libraries. -
The “FindDevIL” module now provides imported targets.
-
The “FindIconv” module now has version support.
-
The “FindIntl” module now has version support.
-
The “FindMPI” module learned to support “Fujitsu” and “FujitsuClang”
in both host and cross compiling modes. -
The “FindMsys” module was added to find MSYS installations. Like
“FindCygwin”, it is used automatically by some other find modules to
locate UNIX-style tools on Windows. -
The “FindOpenMP” module learned to support “Fujitsu” and
“FujitsuClang”. -
The “FindVulkan” module gained imported targets “Vulkan::Headers”
and “Vulkan::glslangValidator”. -
The “UseJava” module command “add_jar” gained a “RESOURCES” option
to allow explicit naming of resources with non-optional namespace. -
The “UseSWIG” module use now standard library naming conventions for
the “CSharp” language. See policy “CMP0122”. -
The “UseSWIG” module now supports using the “swig” tool to generate
implicit dependencies with the “Xcode” generator.
Generator Expressions
- A new “TARGET_RUNTIME_DLLS” generator expression was added.
CTest
-
“ctest(1)” gained documentation for its ability to capture
Additional Test Measurements. -
“ctest(1)” learned to recognize files attached to a test at run
time. Previously it was only possible to attach files to tests at
configure time by using the “ATTACHED_FILES” or
“ATTACHED_FILES_ON_FAIL” test properties. See Additional Test
Measurements for more information. -
“ctest(1)” gained a “–output-junit” option to write test results to
a JUnit XML file. -
The “ctest_build()” command gained a “PARALLEL_LEVEL” option.
CPack
-
The “CPack DragNDrop Generator” gained option “CPACK_DMG_FILESYSTEM”
to control the “.dmg” filesystem. -
The “CPack IFW Generator” now supports hyphens in names given to
“cpack_ifw_configure_component()” or
“cpack_ifw_configure_component_group()” as “DEPENDS” or
“DEPENDENCIES” arguments. This requires QtIFW 3.1 or later. -
The “CPack NSIS Generator” gained a new “CPACK_NSIS_EXECUTABLE”
variable to specify the “makensis” executable to use instead of the
default one. -
The “CPACK_CUSTOM_INSTALL_VARIABLES” variable was added to set
variables in “cmake_install.cmake” script invocations made by CPack.
Deprecated and Removed Features
-
Undocumented “CMAKE_SYSTEM_NAME” version-stripping behavior has been
removed entirely. If it is set by a “-D” flag or by a “toolchain
file”, it is left unaltered, even if it still contains a version
number. Similar “CMAKE_HOST_SYSTEM_NAME” version-stripping behavior,
also undocumented, has been moved earlier, before “project()” or
“enable_language()” is called. -
“ARMClang” cpu/arch compile and link flags are no longer added
automatically based on the “CMAKE_SYSTEM_PROCESSOR” variable or the
undocumented “CMAKE_SYSTEM_ARCH” variable. They must be specified
explicitly. See policy “CMP0123”.
Other Changes
-
The “find_file()”, “find_path()”, “find_program()”, and
“find_library()” commands handle cache variables in the same way
regardless how they are defined. See policy “CMP0125” for details. -
The “find_file()”, “find_path()”, “find_program()”, and
“find_library()” commands gained the option “NO_CACHE” to store find
result in normal variable. -
The “foreach()” command now isolates loop variables in the loop
scope. See policy “CMP0124” for details. -
The “list()” command’s “GET”, “INSERT”, “SUBLIST”, and “REMOVE_AT”
subcommands now error with invalid (i.e., non-integer) values are
given as any of their index arguments based on the setting of policy
“CMP0121”. -
The “set(CACHE)” command no longer removes a normal variable of the
same name, if any. See policy “CMP0126”. -
“target_link_libraries()” calls referencing object libraries via the
“TARGET_OBJECTS” generator expression now place the object files
before all libraries on the link line, regardless of their specified
order. See documentation on Linking Object Libraries via
$<TARGET_OBJECTS> for details. -
The Ninja Generators now pass source files and include directories
to the compiler using absolute paths. This makes diagnostic
messages and debug symbols more consistent, and matches the Makefile
Generators. -
The “NMake Makefiles” generator now encodes the generated makefiles
as UTF-8 with a BOM when using “nmake” from VS 9 or above. -
The Visual Studio Generators for VS 2010 and above now place per-
source preprocessor definitions after target-wide preprocssor
definitions. This makes VS consistent with the Ninja Generators and
the Makefile Generators. -
The precompiled binaries provided on cmake.org now support “liblzma”
multi-threading. See the “CPACK_THREADS” and
“CPACK_ARCHIVE_THREADS” variables.
Changes made since CMake 3.21.0-rc1:
Alex Sweet (1):
- CPack/RPM: Fix weak dep support
Ben Boeckel (1):
- Help/CMP0102: mention the varible that controls CMP0102 warnings
Brad King (16):
- bootstrap: Compile with _FILE_OFFSET_BITS=64 on Linux
- Help: Remove unnecessary Sphinx versionadded markup in VS toolset selection
- VS: Update v142 CL flag table for VS 17.0 Preview 1
- Tests: Shorten RunCMake.GenEx-* case names
- VS: Add Visual Studio 17 2022 generator
- VS: Use 64-bit MSBuild in VS 2022
- TestDriver: Avoid declaring local variable after statement
- Help: Clarify 3.21 release note on supportedPlatforms
- Help/dev/experimental: Link to published P1689R4
- ci: update keyserver URL
- ci: add freeglut to Debian and Fedora base images
- curl: backport upstream fix to 7.77.0 regression
- VS: Add ARM64EC to supported platforms for VS 16 and 17
- DetermineCompiler: Restore identification of MSVC with no INCLUDE dirs
- target_link_libraries: Restore transitive out-of-dir linking
- CMake 3.21.0-rc2
Eisuke Kawashima (1):
- FindOpenMP: Link with OpenMP flags on Fujitsu
FeRD (Frank Dana) (1):
- Help: Add versionadded tags to cmake-generator-expressions(7)
Gregor Jasny (1):
- ASM_NASM: Do not generate depfiles with YASM
KWSys Upstream (1):
- KWSys 2021-06-28 (0648cb1a)
Marc Chevrier (2):
- Help: UseJava reorganization
- CMP0126: Add control for warnings
NAKAMURA Takumi (1):
- Tests/RunCMake/Ninja.*: Sanitize NINJA_STATUS since we expect default behavior
Paul Zehner (1):
- Fujitsu: Add IPO support for Fortran
Yuichiro Utsumi (2):
- FujitsuClang: Set CMAKE_<LANG>_COMPILER_AR and CMAKE_<LANG>_COMPILER_RANLIB
- FujitsuClang: Change LTO option from -flto=thin to -flto
Đoàn Trần Công Danh (1):
- Ninja: Fix LINK_WHAT_YOU_USE link flag placement