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生成器。Makefile 生成器 和
Ninja生成器学会了添加链接器启动器工具以及用于C、CXX、OBJC和 ``OBJCXX 的链接器``语言。有关详细信息,请参阅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字段列表已知支持的平台 :variable:` CMAKE_GENERATOR_PLATFORM`。打印到终端的消息现在可以按消息类型着色。
编译器¶
Fujitsu 编译器现在支持在传统 (
Trad) 模式下使用编译器 IDFujitsu,在``Clang`` 模式下使用编译器 IDFujitsuClang。
平台¶
CMake 现在支持 MSYS 运行时环境,很像 CYGWIN。
基于文件的 API¶
cmake-file-api(7)"codemodel" version 2version字段已更新为 2.3。cmake-file-api(7)“代码模型”版本 2 获得了一个包含目录级信息的新“目录”对象。这包括由install()命令生成的安装程序列表。
命令¶
add_custom_command()命令``DEPFILE`` 选项:现在可以使用
generator expressions,Visual Studio Generators 现在支持 VS 2012 及更高版本,并且
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目录属性以获取在当前目录中创建的 进口目标 列表。添加了:prop_tgt:XCODE_EMBED_APP_EXTENSIONS <XCODE_EMBED_<type>> 目标属性,以告知:generator:Xcode 生成器嵌入应用程序扩展,例如 iMessage 贴纸包。嵌入的各个方面可以使用
XCODE_EMBED_APP_EXTENSIONS_PATH、XCODE_EMBED_APP_EXTENSIONS_CODE_SIGN_ON_COPY和 :prop_tgt 进行自定义 :XCODE_EMBED_APP_EXTENSIONS_REMOVE_HEADERS_ON_COPY <XCODE_EMBED_<type>_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 选项,以允许使用非可选命名空间显式命名资源。
UseSWIG模块现在使用CSharp语言的标准库命名约定。请参阅政策:policy:CMP0122。
生成器表达式¶
添加了一个新的
TARGET_RUNTIME_DLLS生成器表达式。
C测试¶
ctest(1)学会了在运行时识别附加到测试的文件。以前只能通过使用ATTACHED_FILES或ATTACHED_FILES_ON_FAIL测试属性在配置时将文件附加到测试。有关更多信息,请参阅 附加测试测量。ctest(1)获得了一个--output-junit选项,用于将测试结果写入 JUnit XML 文件。ctest_build()命令获得了一个PARALLEL_LEVEL选项。
包装¶
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标志或toolchain 文件设置,则它保持不变,即使它仍然包含版本号。类似的CMAKE_HOST_SYSTEM_NAME版本剥离行为,也未记录,已在调用project()或enable_language()之前移动。不再根据 CMAKE_SYSTEM_PROCESSOR 变量或未记录的 CMAKE_SYSTEM_ARCH 变量自动添加
ARMClangcpu/arch 编译和链接标志。它们必须明确指定。请参阅政策:policy:CMP0123。
其他变化¶
find_file()、find_path()、find_program()和find_library()命令以相同的方式处理缓存变量,无论它们是如何定义的。有关详细信息,请参阅政策:policy:CMP0125。find_file()、find_path()、find_program()和find_library()命令获得了选项NO_CACHE以将查找结果存储在普通变量中。foreach()命令现在在循环范围内隔离循环变量。有关详细信息,请参阅政策:policy:CMP0124。list()命令的GET、INSERT、SUBLIST和REMOVE_AT子命令现在错误并给出无效(即非整数)值作为任何它们的索引参数基于策略设置:policy:CMP0121。set(CACHE)命令不再删除同名的普通变量(如果有的话)。请参阅政策:policy:CMP0126。target_link_libraries()通过TARGET_OBJECTS生成器表达式调用引用目标库现在将目标文件放在链接行上所有库之前,无论它们的指定顺序如何。有关详细信息,请参阅有关 通过 $<TARGET_OBJECTS> 链接对象库的文档。忍者生成器 现在使用绝对路径将源文件和包含目录传递给编译器。这使得诊断消息和调试符号更加一致,并且与 Makefile Generators 相匹配。
当使用 VS 9 或更高版本的
nmake时,NMake Makefiles生成器现在将生成的 makefiles 编码为带有 BOM 的 UTF-8。VS 2010 及更高版本的 Visual Studio 生成器 现在将每个源预处理器定义放在目标范围预处理器定义之后。这使得 VS 与 忍者生成器 和 Makefile 生成器 保持一致。
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”。CMake 3.21.0 到 3.21.2 将 AMD ROCm 平台“hipcc”编译器标识为具有 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¶
这些版本未对记录的功能或界面进行任何更改。进行了一些实施更新以支持生态系统更改和/或修复回归。