CMake 3.29 发布说明¶
自 CMake 3.28 以来的更改包括以下内容。
新功能¶
命令行¶
生成器¶
Visual Studio 生成器 现在支持在 Intel oneAPI Fortran 编译器 (
ifx) 和 Intel 经典 Fortran 编译器 (ifort) 之间进行选择,使用CMAKE_GENERATOR_TOOLSET中的fortran=字段。
基于文件的 API¶
基于文件的 API 的 "codemodel" 版本 2 的
version字段已更新至 2.7。cmake-file-api(7)。基于文件的 API 的 "codemodel" 版本 2 的 "target" 对象增加了 "launchers" 字段。
cmake-file-api(7)。
编译器¶
现在可以使用 Windows 上的 LLVM/Clang 类 GNU 前端 (
clang++) 来编译CUDA语言源文件。现在可以使用 Windows 上的 GNU ABI 目标编译器 (MinGW) 来编译 Objective C (
OBJC) 和 Objective C++ (OBJCXX)。这些包括 GNU 编译器 (gcc和g++) 和 LLVM/Clang 类 GNU 前端 (clang和clang++)。现在支持 TI Clang 基于编译器的
compiler idTIClang。
命令¶
现在 add_custom_command(TARGET) 签名支持通过 别名目标 添加构建事件。
添加了
cmake_language(EXIT)子命令以终止cmake -P脚本,并指定退出码。添加了
export(SETUP)子命令来配置导出集。其TARGET选项的XCFRAMEWORK_LOCATION设置指定了一个.xcframework的位置,该位置可以用于替换已安装的目标。if()命令增加了新的测试IS_READABLE、IS_WRITABLE和IS_EXECUTABLE来检查文件或目录权限。if()。try_compile()和try_run()命令增加了LINKER_LANGUAGE选项,以在生成的测试项目中指定LINKER_LANGUAGE目标属性。try_compile()try_run()。
变量¶
添加了
CMAKE_INSTALL_PREFIX环境变量,以提供CMAKE_INSTALL_PREFIX变量的默认值。添加了
CMAKE_LINKER_TYPE变量和相应的LINKER_TYPE目标属性,以指定在某些工具链中使用哪个链接器。添加了
CMAKE_<LANG>_COMPILER_LINKER、CMAKE_<LANG>_COMPILER_LINKER_ID、CMAKE_<LANG>_COMPILER_LINKER_VERSION和CMAKE_<LANG>_COMPILER_LINKER_FRONTEND_VARIANT变量,用于描述语言链接步骤使用的链接器。变量
CMAKE_PROJECT_INCLUDE、CMAKE_PROJECT_INCLUDE_BEFORE、CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE和CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE_BEFORE变量现在支持 分号分隔的列表,其中包含按顺序包含的 CMake 语言文件。这些变量还可以引用在CMAKE_MODULE_PATH中找到或内置于 CMake 中的模块名称。添加了
CMAKE_SKIP_TEST_ALL_DEPENDENCY变量,用于控制test(或RUN_TESTS) 构建系统目标是否依赖于all(或ALL_BUILD) 目标。添加了
CMAKE_TEST_LAUNCHER变量和相应的TEST_LAUNCHER目标属性,以指定由add_test()命令添加的测试调用时,可执行目标使用的启动器。
属性¶
CROSSCOMPILING_EMULATOR目标属性现在支持生成器表达式。UNITY_BUILD目标属性现在支持 Objective C (OBJC) 和 Objective C++ (OBJCXX) 语言。添加了
XCODE_EMBED_XPC_SERVICES目标属性,用于告诉Xcode生成器哪些目标要放在 "Embed XPC Resources" 构建阶段。
模块¶
模块
CMakePackageConfigHelpers增加了新的函数generate_apple_platform_selection_file()和generate_apple_architecture_selection_file(),分别用于生成包含另一个 Apple 平台特定文件或包含 Apple 平台包的特定架构实现的文件的文件。模块
FindOpenGL现在可以找到与 GL include 目录不同的 GLU include 目录。新的OPENGL_INCLUDE_DIRS结果变量提供了所有 include 目录。
CTest¶
ctest(1)增加了--http-header选项,用于在提交到 CDash 时添加自定义头部。ctest(1)增加了--tests-from-file和--exclude-from-file选项,用于运行或排除文件中命名的测试。现在可以省略
ctest -j选项的值,让 ctest 选择默认的并行度级别,或者使用0让 ctest 使用无限制的并行度。相应的CTEST_PARALLEL_LEVEL环境变量,如果设置为空字符串,现在等同于传递没有值的-j。ctest_test()命令增加了INCLUDE_FROM_FILE和EXCLUDE_FROM_FILE选项,用于运行或排除文件中命名的测试。ctest_test()。
CPack¶
CPack DEB Generator的CPACK_DEBIAN_FILE_NAME变量现在可以不带任何后缀进行设置,会自动添加.deb后缀。CPack RPM Generator的CPACK_RPM_FILE_NAME变量现在可以不带任何后缀进行设置,会自动添加.rpm后缀。CPack WIX Generator增加了一个新变量CPACK_WIX_INSTALL_SCOPE,用于控制 WiX MSI 安装程序的InstallScope属性。
其他更改¶
CMake 已学会根据链接器功能对链接行上的库进行去重。参见策略
CMP0156。在跨平台编译时,
add_test()命令现在只尊重CMAKE_CROSSCOMPILING_EMULATOR。参见策略CMP0158。add_test()。在 Windows 上,当针对 MSVC ABI 时,
find_library()命令现在在首先考虑.lib文件名之后,接受.a文件名。这与针对 GNU ABI 的现有行为对称,在后一种情况下,该命令在首先考虑.a之后,接受.lib文件名。find_library()。在 Windows 上,当针对 MSVC ABI 时,
find_library()命令现在在考虑.lib之前,会考虑.dll.lib文件名。这是 Rust 工具链为 MSVC ABI 创建的 DLL 导入库的默认后缀。find_library()。当使用 IntelLLVM(版本 2021.4 及以上)时,
Ninja和NMake Makefiles生成器现在对系统 include 使用-external:I标志。从 2022.2 版本开始,还使用-external:W0标志。create_test_sourcelist()命令现在为生成的驱动程序源文件提供完整路径。CPACK_PRODUCTBUILD_DOMAINS变量现在默认为 true。参见策略CMP0161。
更新¶
自 CMake 3.29.0 以来的更改包括以下内容。
3.29.1¶
变量
CMAKE_LINKER_TYPE和相应的LINKER_TYPE目标属性现在可与Swift语言的编译器一起使用。
3.29.2, 3.29.3, 3.29.4¶
这些版本未对已记录的功能或接口进行任何更改。为了支持生态系统更改和/或修复回归,进行了一些实现更新。
3.29.5¶
CPack WIX Generator的CPACK_WIX_INSTALL_SCOPE变量(在 3.29 中新增)现在默认为NONE。这恢复了与 3.28 及更早版本的兼容性:在没有自定义 WiX 模板的情况下,它会生成仅为当前用户创建开始菜单和卸载条目的安装程序,即使它们是为所有用户安装的。在 3.29.0 到 3.29.4 版本中,
CPACK_WIX_INSTALL_SCOPE默认为perMachine。这会创建 MSI 安装程序,默认情况下为所有用户创建开始菜单和卸载条目。虽然此行为本身更好,但这些安装程序不能干净地替换使用 3.28 及更低版本生成的 MSI 安装程序创建的现有安装。3.29.5 版本为了兼容性将默认值恢复。项目可以自行安排过渡到perMachine,方法是设置CPACK_WIX_INSTALL_SCOPE。
3.29.6, 3.29.7, 3.29.8, 3.29.9¶
这些版本未对已记录的功能或接口进行任何更改。为了支持生态系统更改和/或修复回归,进行了一些实现更新。