CMake 3.27 发行说明¶
自 CMake 3.26 以来的更改包括以下内容。
新特性¶
调试器¶
cmake(1)
现在支持 CMake 语言的交互式调试。请参阅--debugger
选项。
预设¶
cmake-presets(7)
文件现在支持 schema 版本7
。cmake-presets(7)
现在支持$penv{}
宏展开在include
字段中。
生成器¶
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-file-api(7)
“codemodel” 版本 2version
字段已更新至 2.6。cmake-file-api(7)
“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()
命令现在搜索由大写<PACKAGENAME>_ROOT
CMake 变量和大写<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 的目录列表。
Autogen¶
添加了
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_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
步骤的详细信息更改时才会重新运行。即使启用了
UPDATE_DISCONNECTED
选项,如果ExternalProject
update
和patch
步骤的任何详细信息发生更改,它们现在始终重新运行。如果使用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" 版本 2 "target" 对象的fileSets
字段,但其baseDirectories
成员的条目被错误地表示为绝对路径,即使它们位于顶层源目录中。 这在 CMake 3.26.6 中得到了修复,现在在 3.27.9 中也得到了修复。 客户端必须更新以期望顶层源目录下的相对路径。CMake 3.27.0 更新了 Ninja Generators 中的 Fortran 模块依赖项扫描,以使用精确的排序规则依赖项。 这本应修复在目标之间移动模块源时发生的细微重建失败。 从那时起,已经发现了几种在使用 Object Libraries 时,精确排序规则依赖项计算不正确的情况。 其中一些情况已通过 3.27.x 补丁系列逐步修复,但此后又发现了其他更微妙的情况。 为了避免 3.27 版本系列中进一步的变动,原始更改已被还原并推迟到 CMake 的未来版本。