CMake 3.29 发布说明¶
自 CMake 3.28 以来的更改包括以下内容。
新功能¶
命令行¶
生成器¶
Visual Studio Generators 现在支持通过
CMAKE_GENERATOR_TOOLSET中的fortran=字段在 Intel oneAPI Fortran 编译器 (ifx) 和 Intel 经典 Fortran 编译器 (ifort) 之间进行选择。
基于文件的 API¶
cmake-file-api(7)"codemodel" v2 的version字段已更新至 2.7。cmake-file-api(7)"codemodel" v2 的 "target" 对象新增了 "launchers" 字段。
编译器¶
现在可以使用 Windows 上的 LLVM/Clang 类 GNU 前端 (
clang++) 来编译CUDA语言源文件。现在可以使用面向 Windows 上的 GNU ABI (MinGW) 的编译器来编译 Objective C (
OBJC) 和 Objective C++ (OBJCXX)。这些编译器包括 GNU 编译器 (gcc和g++) 以及 LLVM/Clang 类 GNU 前端 (clang和clang++)。现在通过
compiler idTIClang支持 TI Clang 编译器。
命令¶
add_custom_command(TARGET) 签名现在支持通过 别名目标 添加构建事件。
新增了
cmake_language(EXIT)子命令,用于以指定退出码终止cmake -P脚本。新增了
export(SETUP)子命令,用于配置导出集。其TARGET选项的XCFRAMEWORK_LOCATION设置指定了一个.xcframework的位置,该位置可以替换已安装的目标。if()命令新增了IS_READABLE、IS_WRITABLE和IS_EXECUTABLE测试,用于检查文件或目录权限。try_compile()和try_run()命令新增了LINKER_LANGUAGE选项,用于在生成的测试项目中指定LINKER_LANGUAGE目标属性。
变量¶
新增了
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选项,用于从文件中读取要运行或排除的测试。
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。在 Windows 上,当针对 MSVC ABI 时,
find_library()命令现在在首先考虑.lib文件名之后,可以接受.a文件名。这与针对 GNU ABI 的现有行为是对称的,在 GNU ABI 的情况下,该命令在首先考虑.a之后接受.lib文件名。在 Windows 上,当针对 MSVC ABI 时,
find_library()命令现在在考虑.lib之前,会考虑.dll.lib文件名。这是 Rust 工具链为 MSVC ABI 创建的 DLL 导入库的默认后缀。当使用 IntelLLVM (2021.4 及以上版本) 时,
Ninja和NMake Makefiles生成器现在在系统包含中使用-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中于 3.29 版本新增的CPACK_WIX_INSTALL_SCOPE变量现在默认为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¶
这些版本未对已记录的功能或接口进行任何更改。为了支持生态系统更改和/或修复回归,进行了一些实现更新。