CMake 3.21 发行说明¶
自 CMake 3.20 以来所做的更改包括以下内容。
新功能¶
预设¶
- cmake-presets(7)增加了在配置预设中指定安装前缀的支持。
- cmake-presets(7)增加了条件性启用预设的支持。
- cmake-presets(7)增加了对- ${hostSystemName}宏的支持。
- cmake-presets(7)增加了省略- generator和- binaryDir字段的支持。
生成器¶
- 增加了 - Visual Studio 17 2022生成器。
- 对于 - C、- CXX、- OBJC和- OBJCXX语言,Makefile Generators 和- Ninja生成器学会了与链接器一起添加链接器启动工具。请参阅- CMAKE_<LANG>_LINKER_LAUNCHER变量和- <LANG>_LINKER_LAUNCHER目标属性了解详情。
语言¶
- CMake 学会了支持 - HIP作为一流语言,可以通过- project()和- enable_language()命令启用。
- C_STANDARD、- OBJC_STANDARD和- Compile Features功能增加了对 C17 和 C23 的支持。
- 源文件扩展名 - .ixx和- .cppm现在被视为 C++。
命令行¶
- cmake(1)增加了- --install-prefix命令行选项来指定安装前缀的位置。
- cmake(1)增加了- --toolchain命令行选项来指定工具链文件。
- cmake(1)- -E capabilities输出,对于某些生成器,现在可能包含一个- supportedPlatforms字段,列出了在- CMAKE_GENERATOR_PLATFORM中已知支持的平台。
- 打印到终端的消息现在可能按消息类型着色。 
编译器¶
- 现在可以使用编译器 ID - Fujitsu(在传统模式- Trad下)和编译器 ID- FujitsuClang(在- Clang模式下)来支持 Fujitsu 编译器。
平台¶
- CMake 现在支持 MSYS 运行时环境,类似于 CYGWIN。 
基于文件的 API¶
- cmake-file-api(7)"codemodel" version 2 的- version字段已更新至 2.3。
- cmake-file-api(7)"codemodel" version 2 增加了一个新的 "directory" 对象,其中包含目录级别的信息。这包括由- install()命令生成的安装程序列表。
命令¶
- add_custom_command()命令的- DEPFILE选项- 现在可以使用 - 生成器表达式,
- 现在由 VS 2012 及更高版本的 Visual Studio Generators 支持,并且 
- 现在由 - Xcode生成器支持。
 
- add_custom_command(TARGET)命令(用于 自定义命令目标)增加了对解析目标依赖的生成器表达式的支持。
- build_command()命令增加了- PARALLEL_LEVEL选项。
- 增加了 - file(COPY_FILE)命令来复制单个文件。
- file(GET_RUNTIME_DEPENDENCIES)命令增加了新的- POST_INCLUDE_FILES和- POST_EXCLUDE_FILES参数。
- file(REAL_PATH)命令增加了- EXPAND_TILDE选项,用于将任何前导波浪号替换为用户主目录的路径。
- file(RENAME)命令学会了可选地捕获失败到结果变量。它还增加了- NO_REPLACE选项,如果目标存在则失败。
- install()命令增加了一个新的- IMPORTED_RUNTIME_ARTIFACTS模式,可用于安装导入目标的运行时构件。
- install()命令增加了一个新的- RUNTIME_DEPENDENCY_SET模式,可用于使用- file(GET_RUNTIME_DEPENDENCIES)安装运行时依赖项。
- install(TARGETS)命令增加新的- RUNTIME_DEPENDENCIES和- RUNTIME_DEPENDENCY_SET参数,可用于使用- file(GET_RUNTIME_DEPENDENCIES)安装运行时依赖项。
- install(SCRIPT|CODE)命令支持新的- ALL_COMPONENTS选项,允许相应的代码为按组件安装的每个组件运行。
- project()命令现在设置变量- PROJECT_IS_TOP_LEVEL和- <PROJECT-NAME>_IS_TOP_LEVEL来指示是否在顶层- CMakeLists.txt文件中调用。
变量¶
- 增加了 - CMAKE_TOOLCHAIN_FILE环境变量,用于提供- CMAKE_TOOLCHAIN_FILE变量的默认值。
属性¶
- 增加了 - IMPORTED_TARGETS目录属性,以获取在当前目录中创建的 导入目标 列表。
- 增加了 - XCODE_EMBED_APP_EXTENSIONS目标属性,以指示- Xcode生成器嵌入应用程序扩展,例如 iMessage 贴纸包。嵌入的各个方面可以通过- XCODE_EMBED_APP_EXTENSIONS_PATH、- XCODE_EMBED_APP_EXTENSIONS_CODE_SIGN_ON_COPY和- XCODE_EMBED_APP_EXTENSIONS_REMOVE_HEADERS_ON_COPY属性进行自定义。
模块¶
- FindBLAS和- FindLAPACK模块学会了支持串行的- Fujitsu_SSL2和并行的- Fujitsu_SSL2BLAMP库。
- FindDevIL模块现在提供导入目标。
- FindIconv模块现在具有版本支持。
- FindIntl模块现在具有版本支持。
- FindMPI模块学会了在主机和交叉编译模式下都支持- Fujitsu和- FujitsuClang。
- 增加了 - FindMsys模块来查找 MSYS 安装。与- FindCygwin一样,一些其他查找模块会自动使用它来定位 Windows 上的类 UNIX 工具。
- FindOpenMP模块学会了支持- Fujitsu和- FujitsuClang。
- FindVulkan模块增加了导入目标- Vulkan::Headers和- Vulkan::glslangValidator。
- UseJava模块命令- add_jar增加了- RESOURCES选项,以允许显式命名具有非可选命名空间的资源。
生成器表达式¶
- 增加了新的 - TARGET_RUNTIME_DLLS生成器表达式。
CTest¶
- ctest(1)学会了在运行时识别附加到测试的文件。之前,只能通过使用- ATTACHED_FILES或- ATTACHED_FILES_ON_FAIL测试属性在配置时将文件附加到测试。有关更多信息,请参阅 附加测试测量。
- ctest(1)增加了- --output-junit选项,用于将测试结果写入 JUnit XML 文件。
- ctest_build()命令增加了- PARALLEL_LEVEL选项。
CPack¶
- CPack DragNDrop Generator增加了- CPACK_DMG_FILESYSTEM选项来控制- .dmg文件系统。
- CPack IFW Generator现在支持在传递给- cpack_ifw_configure_component()或- cpack_ifw_configure_component_group()的- DEPENDS或- DEPENDENCIES参数的名称中包含连字符。这需要 QtIFW 3.1 或更高版本。
- CPack NSIS Generator增加了新的- CPACK_NSIS_EXECUTABLE变量,用于指定要使用的- makensis可执行文件,而不是默认的。
- 增加了 - CPACK_CUSTOM_INSTALL_VARIABLES变量,用于在 CPack 调用- cmake_install.cmake脚本时设置变量。
已弃用和移除的功能¶
- 未文档化的 - CMAKE_SYSTEM_NAME版本剥离行为已被完全移除。如果它由- -D标志或- 工具链文件设置,它将保持不变,即使它仍然包含版本号。类似的未文档化的- CMAKE_HOST_SYSTEM_NAME版本剥离行为已提前,在调用- project()或- enable_language()之前。
- 不再基于 - CMAKE_SYSTEM_PROCESSOR变量或未文档化的- CMAKE_SYSTEM_ARCH变量自动添加- ARMClangCPU/arch 编译和链接标志。必须显式指定它们。请参阅策略- CMP0123。
其他更改¶
- find_file()、- find_path()、- find_program()和- find_library()命令以相同的方式处理缓存变量,无论它们如何定义。有关详细信息,请参阅策略- CMP0125。
- find_file()、- find_path()、- find_program()和- find_library()命令增加了- NO_CACHE选项,用于将查找结果存储在普通变量中。
- list()命令的- GET、- INSERT、- SUBLIST和- REMOVE_AT子命令现在会在索引参数中给出无效(即非整数)值时报错,这取决于策略- CMP0121的设置。
- set(CACHE)命令不再移除同名的普通变量(如果存在)。请参阅策略- CMP0126。
- target_link_libraries()调用通过- TARGET_OBJECTS生成器表达式引用对象库时,现在会将对象文件放在链接行上的所有库之前,无论其指定的顺序如何。有关详细信息,请参阅关于 通过 $<TARGET_OBJECTS> 链接对象库 的文档。
- Ninja Generators 现在使用绝对路径将源文件和包含目录传递给编译器。这使得诊断消息和调试符号更加一致,并与 Makefile Generators 保持一致。 
- NMake Makefiles生成器现在在使用 VS 9 或更高版本的- nmake时,将生成的 makefiles 编码为 UTF-8 并带 BOM。
- VS 2010 及更高版本的 Visual Studio Generators 现在将每个源文件的预处理器定义放在目标范围的预处理器定义之后。这使得 VS 与 Ninja Generators 和 Makefile Generators 保持一致。 
- 在 cmake.org 上提供的预编译二进制文件现在支持 - liblzma多线程。请参阅- CPACK_THREADS和- CPACK_ARCHIVE_THREADS变量。
更新¶
自 CMake 3.21.0 以来所做的更改包括以下内容。
3.21.1¶
- Visual Studio 17 2022生成器现在基于“Visual Studio 2022 Preview 2”。之前它基于“Preview 1.1”。
3.21.2¶
- 已正确生成启用 - CUDA_SEPARABLE_COMPILATION的- CUDA目标在非根目录中。
- Visual Studio 17 2022生成器现在基于“Visual Studio 2022 Preview 3.1”。之前它基于“Preview 2”。
3.21.3¶
- Visual Studio 17 2022生成器现在基于“Visual Studio 2022 Preview 4”。之前它基于“Preview 3.1”。
- AMD ROCm 平台 - hipcc编译器在 CMake 3.21.0 到 3.21.2 中被识别为一个独立的编译器,ID 为- ROCMClang。由于这导致了回归,因此已将其移除。改为- hipcc不再可用作- HIP编译器,因为它会干扰 CMake 需要传递给 Clang 的标志。请直接使用 Clang。
- hipcc可以再次用作- CXX编译器,并被视为它在底层选择的任何编译器,正如 CMake 3.20 及更早版本那样。
 
3.21.4¶
- Visual Studio 17 2022生成器现在基于“Visual Studio 2022”发布候选版本。之前它基于预览版本。
3.21.5, 3.21.6, 3.21.7¶
这些版本未对已记录的功能或接口进行任何更改。为了支持生态系统更改和/或修复回归,进行了一些实现更新。
