CMake 3.27 发布说明¶
自 CMake 3.26 以来的更改包括以下内容。
新功能¶
调试器¶
cmake(1)
现在支持 CMake 语言的交互式调试。请参阅--debugger
选项。
预设¶
cmake-presets(7)
文件现在支持模式版本7
。cmake-presets(7)
现在支持include
字段中的$penv{}
宏展开。
生成器¶
Makefile 和 Ninja 生成器现在支持使用
--dependency-file
链接器标志,该标志由 GNU Binutils 2.35 和 LLVM 的 LLD 12.0.0 添加,以便链接器读取的文件在更改时(通常是修改时间戳)会导致重新链接。请参阅CMAKE_LINK_DEPENDS_USE_LINKER
变量。VS 14 (2015) 及更高版本的 Visual Studio 生成器学会了使用
CMAKE_GENERATOR_PLATFORM
变量中的version=
字段显式选择 Windows SDK 版本。请参阅 Visual Studio 平台选择。
语言¶
现在
CXX
语言将源文件扩展名.ccm
、.cxxm
和.c++m
视为 C++。
基于文件的 API¶
CMake 文件 API "codemodel" 版本 2 的
version
字段已更新为 2.6。CMake 文件 API "codemodel" 版本 2 的 "target" 对象中的 "compileGroups" 对象新增了一个 "frameworks" 字段。
平台¶
现在可以为 macOS 上的共享库创建 Apple 文本桩(即
.tbd
文件)。请参阅ENABLE_EXPORTS
属性。
命令¶
add_custom_command() 命令新增了一个 `DEPENDS_EXPLICIT_ONLY` 选项,用于告知 Ninja 生成器不添加其附加到的目标所隐含的任何依赖项。新增了 `CMAKE_ADD_CUSTOM_COMMAND_DEPENDS_EXPLICIT_ONLY` 变量,以便在所有调用 `add_custom_command()` 命令时启用 `DEPENDS_EXPLICIT_ONLY`。
新增了 `cmake_file_api()` 命令,供项目为当前 CMake 运行添加 CMake 文件 API 查询。
`find_package()` 命令现在搜索由大写 `
_ROOT` CMake 变量和大写 ` _ROOT` 环境变量指定的 Prefixes。请参阅策略 CMP0144。 install(CODE) 和 install(SCRIPT) 命令现在支持 `$<INSTALL_PREFIX>` 生成器表达式。
变量¶
新增了 `CMAKE_DLL_NAME_WITH_SOVERSION` 变量和相关的 `DLL_NAME_WITH_SOVERSION` 目标属性,用于在 Windows 上可选地将 `SOVERSION` 追加到共享库的 `.dll` 部分的文件名。
新增了 `CMAKE_VS_DEBUGGER_COMMAND`、`CMAKE_VS_DEBUGGER_COMMAND_ARGUMENTS`、`CMAKE_VS_DEBUGGER_ENVIRONMENT` 和 `CMAKE_VS_DEBUGGER_WORKING_DIRECTORY` 变量,用于初始化相应的目标属性。
新增了 `CMAKE_VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION` 变量,用于在创建所有目标时初始化 `VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION` 目标属性。
属性¶
在“目标库”中新增了 `CUDA_CUBIN_COMPILATION` 目标属性,用于支持编译为 `.cubin` 文件而不是主机目标文件。目前仅支持 NVIDIA。
在“目标库”中新增了 `CUDA_FATBIN_COMPILATION` 目标属性,用于支持编译为 `.fatbin` 文件而不是主机目标文件。目前仅支持 NVIDIA。
在“目标库”中新增了 `CUDA_OPTIX_COMPILATION` 目标属性,用于支持编译为 `.optixir` 文件而不是主机目标文件。目前仅支持 NVIDIA。
`
_CLANG_TIDY`、` _CPPCHECK`、` _CPPLINT` 和 ` _INCLUDE_WHAT_YOU_USE` 目标属性现在支持生成器表达式。 `
_LINKER_LAUNCHER` 目标属性现在支持生成器表达式。 新增了 `SKIP_LINTING` 源文件属性,用于抑制特定源文件上的目标范围代码检查。
模块¶
`FindCUDAToolkit` 模块现在为 `cudla` 提供了导入目标,并为 CUPTI 的 `nvperf` 和 `pcsampling` 组件提供了导入目标。
`FindDoxygen` 模块的 `doxygen_add_docs()` 命令新增了 `CONFIG_FILE` 选项,用于指定自定义 doxygen 配置文件。
`FindOpenGL` 模块增加了对 `GLES2` 和 `GLES3` 组件的支持。
`FindwxWidgets` 模块现在提供了一个导入目标。
生成器表达式¶
新增了 `COMPILE_ONLY` 生成器表达式,用于指定仅编译的使用要求,没有链接要求。
为列表的查询、转换和排序操作新增了 `$<LIST:...>` 生成器表达式。
`$<PATH:...>` 的分解和转换操作的生成器表达式学会了逐元素处理路径列表。
新增了 `TARGET_IMPORT_FILE`、`TARGET_IMPORT_FILE_BASE_NAME`、`TARGET_IMPORT_FILE_PREFIX`、`TARGET_IMPORT_FILE_SUFFIX`、`TARGET_IMPORT_FILE_NAME` 和 `TARGET_IMPORT_FILE_DIR` 生成器表达式。这些表达式会展开为目标链接器导入文件的详细信息。
新增了 `TARGET_RUNTIME_DLL_DIRS` 生成器表达式。它会展开为 `TARGET_RUNTIME_DLLS` 中包含 DLL 的目录列表。
自动生成¶
新增了 `CMAKE_AUTOMOC_EXECUTABLE`、`CMAKE_AUTORCC_EXECUTABLE` 和 `CMAKE_AUTOUIC_EXECUTABLE` 变量,用于在创建目标时初始化相应的目标属性。
新增了 `AUTOGEN_USE_SYSTEM_INCLUDE` 目标属性和相应的 `CMAKE_AUTOGEN_USE_SYSTEM_INCLUDE` 变量,用于显式控制自动生成头文件是否被视为系统头文件。
新增了 `INTERFACE_AUTOMOC_MACRO_NAMES` 目标属性,用于指定 `moc` 的宏名称作为传递性使用要求。
CTest¶
新增了 `TIMEOUT_SIGNAL_NAME` 和 `TIMEOUT_SIGNAL_GRACE_PERIOD` 测试属性,用于指定测试超时时发送给测试进程的 POSIX 信号。
CPack¶
新增了 CPack Inno Setup 生成器,用于使用 Inno Setup 进行打包。
已弃用和移除的功能¶
对 CMake 3.5 以前版本的兼容性现已弃用,并将在未来版本的 CMake 中移除。设置策略版本为较旧值的 `cmake_minimum_required()` 或 `cmake_policy()` 调用现在会发出弃用诊断。
已弃用“附加生成器”。IDE 可以使用 CMake 文件 API 来查看 CMake 生成的项目构建树。
已根据策略 CMP0146 移除了自 CMake 3.10 起已弃用的 `FindCUDA` 模块。请将项目移植到 CMake 的一流 CUDA 语言支持。
已根据策略 CMP0148 移除了自 CMake 3.12 起已弃用的 `FindPythonInterp` 和 `FindPythonLibs` 模块。请将项目移植到 `FindPython3`、`FindPython2` 或 `FindPython`。
已根据策略 CMP0145 弃用了 `Dart` 和 `FindDart` 模块。请将项目移植到 `CTest` 模块。
Visual Studio 9 2008 生成器现已弃用,并将在未来版本的 CMake 中移除。
其他更改¶
`cmake --build $dir --verbose` 现在将打印用于执行构建的工作目录和命令行。
`ExternalProject` 和 `FetchContent` 模块现在将相对 `GIT_REPOSITORY` 路径解析为相对于父项目远程的路径,而不是作为相对的本地文件系统路径。请参阅策略 CMP0150。
当 `UPDATE_DISCONNECTED` 选项启用时,“ExternalProject”的 `configure` 步骤不再在每次构建时重新运行。它仅在 `download`、`update` 或 `patch` 步骤的详细信息更改时重新运行。
“ExternalProject”的 `update` 和 `patch` 步骤现在始终在它们的详细信息更改时重新运行,即使 `UPDATE_DISCONNECTED` 选项已启用。如果使用 `GIT` 下载方法,并且 `GIT_TAG` 已更改为本地尚不知道的提交,现在会发出错误,而不是默默地使用之前的 `GIT_TAG`。
`FindPython`、`FindPython2` 和 `FindPython3` 模块现在支持 Windows ARM64 平台。
`file(GET_RUNTIME_DEPENDENCIES)` 命令现在会保留 Windows 上报告的 DLL 名称的大小写。它们仍然会转换为小写以进行过滤匹配。
`SYSTEM` 目标属性现在对 Apple Frameworks 生效。
VS 15.8 (2017) 及更高版本的 Visual Studio 生成器现在并行构建自定义命令。请参阅策略 CMP0147。
VS 14 (2015) 及更高版本的 Visual Studio 生成器现在倾向于选择最新的 Windows SDK,如策略 CMP0149 所述,当目标为任何版本的 Windows 时。在 CMake 3.27.[0-1] 中,此偏好仅限于目标为 Windows 10 及更高版本。
更新¶
自 CMake 3.27.0 以来的更改包括以下内容。
3.27.1¶
此版本未对文档功能或接口进行任何更改。进行了一些实现更新以支持生态系统更改和/或修复回归。
3.27.2¶
VS 14 (2015) 及更高版本的 Visual Studio 生成器现在倾向于选择最新的 Windows SDK,如策略 CMP0149 所述,当目标为任何版本的 Windows 时。在 CMake 3.27.[0-1] 中,此偏好仅限于目标为 Windows 10 及更高版本。
VS 14 (2015) 及更高版本的 Visual Studio 生成器现在支持在 `CMAKE_GENERATOR_PLATFORM` 变量中使用 `version=8.1` 来选择 Windows 8.1 SDK。在 CMake 3.27.[0-1] 中,`version=` 字段仅限于选择 Windows 10 SDK。
3.27.3、3.27.4、3.27.5、3.27.6、3.27.7、3.27.8¶
这些版本未对已记录的功能或接口进行任何更改。为了支持生态系统更改和/或修复回归,进行了一些实现更新。
3.27.9¶
CMake 文件 API "codemodel" 版本 2 "target" 对象 `fileSets` 字段由 CMake 3.26.0 引入,其 `baseDirectories` 成员中的条目错误地表示为绝对路径,即使它们位于顶级源目录内。这已在 CMake 3.26.6 中修复,现在已在 3.27.9 中修复。客户端必须更新为预期顶级源目录下的相对路径。
Ninja 生成器中的 Fortran 模块依赖项扫描已由 CMake 3.27.0 更新为使用精确排序依赖项。这本应修复在将模块源移至不同目标时发生的细微重建失败。此后,已发现一些使用目标库时精确排序依赖项计算错误的案例。其中一些案例已在 3.27.x 补丁系列中逐步修复,但之后又发现了一些更细微的案例。为了避免在 3.27 版本系列中进一步变动,已将原始更改回滚并推迟到未来版本的 CMake 中。