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
中已知支持的平台。打印到终端的消息现在可以按消息类型着色。
编译器¶
现在支持富士通编译器,在传统 (
Trad
) 模式下使用编译器 IDFujitsu
,在Clang
模式下使用编译器 IDFujitsuClang
。
平台¶
CMake 现在支持 MSYS 运行时环境,很像 CYGWIN。
基于文件的 API¶
cmake-file-api(7)
“codemodel” 版本 2version
字段已更新至 2.3。cmake-file-api(7)
“codemodel” 版本 2 获得了一个新的 “directory” 对象,其中包含目录级信息。 这包括由install()
命令生成的安装程序列表。
命令¶
add_custom_command()
命令DEPFILE
选项现在可以使用
generator expressions
,现在受 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
。
其他更改¶
The
find_file()
,find_path()
,find_program()
, 和find_library()
命令以相同的方式处理缓存变量,而无需考虑它们的定义方式。 有关详细信息,请参阅策略CMP0125
。The
find_file()
,find_path()
,find_program()
, 和find_library()
命令获得了NO_CACHE
选项,用于将查找结果存储在普通变量中。The
list()
命令的GET
,INSERT
,SUBLIST
, 和REMOVE_AT
子命令现在在基于策略CMP0121
的设置,当给定任何无效(即非整数)值作为其索引参数时会报错。The
set(CACHE)
命令不再删除同名的普通变量(如果有)。 有关详细信息,请参阅策略CMP0126
。target_link_libraries()
调用通过TARGET_OBJECTS
生成器表达式引用对象库,现在将对象文件放在链接行上所有库的前面,而与其指定的顺序无关。 有关详细信息,请参阅关于 通过 $<TARGET_OBJECTS> 链接对象库 的文档。The Ninja Generators 现在使用绝对路径将源文件和包含目录传递给编译器。 这使得诊断消息和调试符号更加一致,并与 Makefile Generators 匹配。
The
NMake Makefiles
生成器现在在使用 VS 9 或更高版本的nmake
时,将生成的 makefile 编码为带有 BOM 的 UTF-8。The Visual Studio Generators 对于 VS 2010 及更高版本,现在将每个源文件的预处理器定义放在目标范围的预处理器定义之后。 这使得 VS 与 Ninja Generators 和 Makefile Generators 一致。
The 在 cmake.org 上提供的预编译二进制文件现在支持
liblzma
多线程。 请参阅CPACK_THREADS
和CPACK_ARCHIVE_THREADS
变量。
更新¶
CMake 3.21.0 以来所做的更改包括以下内容。
3.21.1¶
The
Visual Studio 17 2022
生成器现在基于 “Visual Studio 2022 Preview 2”。 之前它基于 “Preview 1.1”。
3.21.2¶
CUDA
目标启用了CUDA_SEPARABLE_COMPILATION
后,现在可以在非根目录中正确生成。The
Visual Studio 17 2022
生成器现在基于 “Visual Studio 2022 Preview 3.1”。 之前它基于 “Preview 2”。
3.21.3¶
The
Visual Studio 17 2022
生成器现在基于 “Visual Studio 2022 Preview 4”。 之前它基于 “Preview 3.1”。The AMD ROCm Platform
hipcc
编译器被 CMake 3.21.0 到 3.21.2 识别为一个具有 idROCMClang
的不同编译器。 这已被删除,因为它导致了回归。 相反,hipcc
可能不再用作HIP
编译器,因为它会干扰 CMake 需要传递给 Clang 的标志。 请直接使用 Clang。hipcc
可以再次用作CXX
编译器,并且被视为它在底层选择的任何编译器,就像 CMake 3.20 及更早版本所做的那样。
3.21.4¶
The
Visual Studio 17 2022
生成器现在基于 “Visual Studio 2022” 发行候选版本。 之前它基于预览版本。
3.21.5, 3.21.6, 3.21.7¶
这些版本未对已记录的功能或接口进行任何更改。 进行了一些实现更新以支持生态系统更改和/或修复回归。