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
字段,其中列出了在CMAKE_GENERATOR_PLATFORM
中已知受支持的平台。打印到终端的消息现在可能会根据消息类型进行着色。
编译器¶
现在使用编译器 ID
Fujitsu
(以传统模式Trad
)和编译器 IDFujitsuClang
(以Clang
模式)支持富士通编译器。
平台¶
CMake 现在支持 MSYS 运行时环境,类似于 CYGWIN。
基于文件的 API¶
cmake-file-api(7)
“代码模型”版本 2 的version
字段已更新为 2.3。cmake-file-api(7)
“代码模型”版本 2 获得了一个新的“directory”对象,其中包含目录级信息。这包括由install()
命令生成的安装程序列表。
命令¶
add_custom_command()
命令的DEPFILE
选项现在可以使用
生成器表达式
,现在受 VS 2012 及更高版本的 Visual Studio 生成器 支持,并且
现在受
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
标志或toolchain file
设置,则保持不变,即使它仍然包含版本号。类似的CMAKE_HOST_SYSTEM_NAME
版本去除行为(也未记录)已提前移至project()
或enable_language()
调用之前。ARMClang
cpu/arch 编译和链接标志不再根据CMAKE_SYSTEM_PROCESSOR
变量或未记录的CMAKE_SYSTEM_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 生成器 现在使用绝对路径将源文件和包含目录传递给编译器。这使得诊断消息和调试符号更加一致,并与 Makefile 生成器 匹配。
当使用 VS 9 或更高版本中的
nmake
时,NMake Makefiles
生成器现在会将生成的 makefile 编码为带有 BOM 的 UTF-8。针对 VS 2010 及更高版本的 Visual Studio 生成器 现在将每个源文件的预处理器定义放在目标范围的预处理器定义之后。这使得 VS 与 Ninja 生成器 和 Makefile 生成器 保持一致。
在 cmake.org 上提供的预编译二进制文件现在支持
liblzma
多线程。请参阅CPACK_THREADS
和CPACK_ARCHIVE_THREADS
变量。
更新¶
自 CMake 3.21.0 以来进行的更改包括以下内容。
3.21.1¶
Visual Studio 17 2022
生成器现在基于“Visual Studio 2022 预览版 2”。之前它基于“预览版 1.1”。
3.21.2¶
启用了
CUDA_SEPARABLE_COMPILATION
的CUDA
目标现在可以在非根目录中正确生成。Visual Studio 17 2022
生成器现在基于“Visual Studio 2022 预览版 3.1”。之前它基于“预览版 2”。
3.21.3¶
Visual Studio 17 2022
生成器现在基于“Visual Studio 2022 预览版 4”。之前它基于“预览版 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¶
这些版本没有对已记录的功能或接口进行任何更改。进行了一些实现更新以支持生态系统更改和/或修复回归。