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¶
“codemodel” version 2 的
cmake-file-api(7)的 `version` 字段已更新为 2.6。“codemodel” version 2 的
cmake-file-api(7)的 “compileGroups” 对象中的 “target” 对象获得了一个新的 “frameworks” 字段。
平台¶
现在可以为 macOS 上的共享库创建 Apple 基于文本的存根(即 `.tbd` 文件)。请参阅
ENABLE_EXPORTS属性。
命令¶
命令 `add_custom_command()` 获得了一个新的 `DEPENDS_EXPLICIT_ONLY` 选项,用于告知 Ninja Generators 不添加与其所连接目标相关的任何隐式依赖项。添加了变量
CMAKE_ADD_CUSTOM_COMMAND_DEPENDS_EXPLICIT_ONLY以在所有 `add_custom_command()` 调用中启用 `DEPENDS_EXPLICIT_ONLY`。添加了命令 `cmake_file_api()`,供项目为当前 CMake 运行添加
CMake 文件 API查询。命令 `find_package()` 现在会搜索由大写
<PACKAGENAME>_ROOTCMake 变量和大写<PACKAGENAME>_ROOT环境变量指定的目录。请参阅策略CMP0144。命令 `install(CODE)` 和 `install(SCRIPT)` 现在支持生成器表达式
$<INSTALL_PREFIX>。
变量¶
变量
CMAKE_DLL_NAME_WITH_SOVERSION和相关的目标属性DLL_NAME_WITH_SOVERSION已添加,以选择性地将SOVERSION追加到 Windows 上共享库的 `.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。目标属性
<LANG>_CLANG_TIDY、<LANG>_CPPCHECK、<LANG>_CPPLINT和<LANG>_INCLUDE_WHAT_YOU_USE现在支持生成器表达式。目标属性
<LANG>_LINKER_LAUNCHER现在支持生成器表达式。添加了源文件属性
SKIP_LINTING,用于在特定源文件上抑制目标范围的代码检查。
模块¶
模块
FindCUDAToolkit现在为 `cudla` 提供了一个导入目标,并为 CUPTI 的 `nvperf` 和 `pcsampling` 组件提供了导入目标。模块
FindDoxygen的命令 `doxygen_add_docs()` 获得了一个 `CONFIG_FILE` 选项,用于指定自定义 doxygen 配置文件。模块
FindOpenGL增加了对组件 `GLES2` 和 `GLES3` 的支持。模块
FindwxWidgets现在提供了一个导入目标。
生成器表达式¶
添加了生成器表达式
COMPILE_ONLY,用于指定编译使用要求,而无需任何链接要求。添加了生成器表达式
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,以显式控制是否将 autogen 头文件视为系统头文件。添加了目标属性
INTERFACE_AUTOMOC_MACRO_NAMES,用于指定 `moc` 的宏名称作为传递性使用要求。
CTest¶
添加了测试属性
TIMEOUT_SIGNAL_NAME和TIMEOUT_SIGNAL_GRACE_PERIOD,用于指定在测试进程超时时向其发送的 POSIX 信号。
CPack¶
添加了
CPack Inno Setup Generator,用于使用 Inno Setup 进行打包。
已弃用和移除的功能¶
与 CMake 3.5 及更早版本的兼容性现已弃用,并将在未来的 CMake 版本中移除。调用设置策略版本为较旧值的 `cmake_minimum_required()` 或 `cmake_policy()` 现在会发出弃用诊断。
附加生成器已被弃用。IDE 可以使用
cmake-file-api(7)来查看 CMake 生成的项目构建树。模块
FindCUDA(自 CMake 3.10 起已弃用)已根据策略CMP0146移除。请将项目迁移到 CMake 的一流 `CUDA` 语言支持。模块
FindPythonInterp和FindPythonLibs(自 CMake 3.12 起已弃用)已根据策略CMP0148移除。请将项目迁移到FindPython3、FindPython2或FindPython。生成器 `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。
更新¶
自 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 3.26.0 引入的
cmake-file-api(7)"codemodel" version 2 "target" 对象的 `fileSets` 字段,其 `baseDirectories` 成员中的条目错误地表示为绝对路径,即使它们位于顶级源目录内。这在 CMake 3.26.6 中已修复,并在 3.27.9 中也已修复。客户端需要更新以期望顶级源目录下的相对路径。在 CMake 3.27.0 中,Ninja Generators 中的 Fortran 模块依赖项扫描已更新为使用精确排序依赖项。这本应修复在模块源在目标之间移动时出现的微妙的重新构建失败。此后,人们发现了一些在使用 对象库 时精确排序依赖项计算不正确的情况。其中一些情况已在 3.27.x 补丁系列中逐步修复,但此后又发现了一些更微妙的情况。为了避免 3.27 发布系列中进一步的变动,已撤销原始更改,并将其推迟到未来的 CMake 版本。