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下)和编译器 IDFujitsuClang(在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¶
这些版本未对已记录的功能或接口进行任何更改。为了支持生态系统更改和/或修复回归,进行了一些实现更新。