CMake 3.21 发行说明¶
自 CMake 3.20 以来的更改包括以下内容。
新增功能¶
预设 (Presets)¶
cmake-presets(7)增加了在配置预设中指定安装前缀 (install prefix) 的支持。cmake-presets(7)增加了条件化启用预设 (conditional enabling of presets) 的支持。cmake-presets(7)增加了对${hostSystemName}宏的支持。cmake-presets(7)增加了省略generator和binaryDir字段的支持。
生成器¶
增加了
Visual Studio 17 2022生成器。Makefile Generators 和
Ninja生成器学会了在链接器旁边为C,CXX,OBJC, 和OBJCXX语言添加链接器启动器工具 (linker launcher tools)。有关详细信息,请参见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命令行选项来指定工具链文件 (toolchain file)。cmake(1)的-E capabilities输出,对于某些生成器,现在可能包含一个supportedPlatforms字段,列出了在CMAKE_GENERATOR_PLATFORM中已知的受支持平台。现在,打印到终端的消息可能会根据消息类型着色。
编译器¶
现在支持 Fujitsu 编译器,在传统模式 (
Trad) 下使用编译器 IDFujitsu,在Clang模式下使用编译器 IDFujitsuClang。
平台¶
CMake 现在支持 MSYS 运行时环境,类似于 CYGWIN。
基于文件的 API¶
cmake-file-api(7)"codemodel" 版本 2 的version字段已更新至 2.3。cmake-file-api(7)"codemodel" 版本 2 增加了一个新的 "directory" 对象,其中包含目录级别的信息。这包括由install()命令生成的安装程序列表。
命令¶
add_custom_command()命令的DEPFILE选项现在可以使用
生成器表达式(generator expressions),现在得到了 VS 2012 及以上版本的 Visual Studio Generators 的支持,并且
现在得到了
Xcode生成器的支持。
add_custom_command(TARGET)命令(用于 Build Events)增加了对解析目标依赖的生成器表达式的支持。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目录属性,用于获取当前目录中创建的 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模块现在提供了导入目标 (imported targets)。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)增加了关于其捕获 Additional Test Measurements 能力的文档。ctest(1)学会了在运行时识别附加到测试的文件。以前只能在配置时使用ATTACHED_FILES或ATTACHED_FILES_ON_FAIL测试属性来附加文件。有关更多信息,请参见 Additional Test Measurements。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变量自动添加ARMClang的 CPU/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生成器表达式引用对象库时,现在将对象文件放在链接行上所有库之前,无论其指定的顺序如何。有关详细信息,请参见关于 Linking Object Libraries via $<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 中被识别为具有 IDROCMClang的独立编译器。这已被移除,因为它导致了回归。改为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¶
这些版本未对已记录的功能或接口进行任何更改。为了支持生态系统更改和/或修复回归,进行了一些实现更新。