CMake 3.21.0 available for download

I am happy to announce that CMake 3.21.0 is now available for download at:
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__LINKER_LAUNCHER”
    variable and “_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__LINKER_LAUNCHER”
    variable and “_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 " 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 “_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-rc3:

Alex Turbov (1):

  • CPack/DEB: Avoid overriding user-provided postinst and postrm

Brad King (6):

  • FindJPEG: Revert “Search for ‘turbojpeg’ and ‘turbojpeg-static’ too”
  • Tests: Fix RunCMake.try_compile C/CXX standards with IntelLLVM MSVC mode
  • Find{BLAS,LAPACK}: Avoid clobbering results when no vendor is requested
  • ci: Verify that Intel MKL is found when it is the only BLAS/LAPACK
  • Help: Clarify ‘cmake --build’ signature alternatives
  • CMake 3.21.0

Kyle Edwards (1):

  • file(GET_RUNTIME_DEPENDENCIES): Check architecture of dependencies

Lingkai Dong (1):

  • ARMClang: Fix regression in check for working compiler

Raul Tambre (1):

  • CMakeCCompilerId: Fix C standard detection in Clang and IntelLLVM MSVC mode

Sérgio Martins (1):

  • Help: Fix preset example cmakeMinimumRequired
4 Likes

Key user-facing upgrades:

  • cmake --install-prefix ~/my option as a friendly alternative to cmake -DCMAKE_INSTALL_PREFIX=~/my
  • Presets no longer requiring generator

Is it maybe worth mentioning that (IIUC) the “DLLS” in that expression is literal, and it will only have any contents when building on a Windows platform? (IOW, not all shared libraries are DLLS, only .dll files are DLLS.)

The other changes, to the RUNTIME_DEPENDENCIES-type properties/expressions, are cross-platform.

The VisualStudio generators 2019 and 2022 actively remove compiler option /interface. This broke the CI of the {fmt} library: https://github.com/fmtlib/fmt/pull/2432#issuecomment-885717118. Without this option, no module interface unit can be build. Even worse: the generated compiler options make no sense anymore. :scream:
The Ninja generator doesn’t have this problem. The only visible change in the generated ninja.build is a switch from relative paths to full, absolute paths.

With 3.20 everything was fine.

I’ve opened CMake Issue 22477 for the /interface option, thanks. Please follow that for updates.

1 Like

Brad,

thanks a lot for your attention - much appreciated!
I’ve updated to 3.21.1 now and can confirm that the /interface compiler option is present now. Alas, it looks like the missing other half of modules support has slipped through unit testing. As shown in issue 22474, the module reference requires /reference $module-name=$path-to-BMI in the INTERFACE of target_compile_options(). The /reference introducer is still swallowed by the generator, leaving $module-name=$path-to-BMI as a malformed command line part.

if /reference $module-name=$path-to-BMI must be kept together, please use SHELL: prefix to avoid deduplication processing:

target_compile_options(mytarget INTERFACE "SHELL:/reference $module-name=$path-to-BMI")

Thanks for the tip, but this doesn’t change a bit. The generator still puts

<AdditionalOptions>%(AdditionalOptions)fmt=Z:/fmt/build/test/test-module.ifc</AdditionalOptions>

into the vcxproj-file instead of

<AdditionalOptions>%(AdditionalOptions)/reference fmt=Z:/fmt/build/test/test-module.ifc</AdditionalOptions>

Instead of generating AdditionalOptions it could transform all module-related options into the corresponding MSBuild entities.

That’s what CMake’s Visual Studio generators try to do in general. It is the attempt to do that mapping that causes the /reference flag to be removed.

This is out of scope for discussion under a release announcement. If you found a regression in the release, please open an issue to report it.

I’ve opened CMake Issue 22530 for the /reference flag. Please follow that issue for updates.