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
变量自动添加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
生成器表达式引用对象库时,现在会将对象文件放在链接行上的所有库之前,无论其指定的顺序如何。有关详细信息,请参阅关于 通过 $<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¶
这些版本未对已记录的功能或接口进行任何更改。为了支持生态系统更改和/或修复回归,进行了一些实现更新。