CMake 3.29 发布说明¶
自 CMake 3.28 以来的更改包括以下内容。
新特性¶
命令行¶
生成器¶
Visual Studio 生成器 现在支持在使用
CMAKE_GENERATOR_TOOLSET
中的fortran=
字段时,在 Intel oneAPI Fortran 编译器 (ifx
) 和 Intel classic Fortran 编译器 (ifort
) 之间进行选择。
基于文件的 API¶
cmake-file-api(7)
"codemodel" 版本 2version
字段已更新至 2.7。cmake-file-api(7)
"codemodel" 版本 2 "target" 对象获得了一个新的 "launchers" 字段。
编译器¶
Windows 上类似 GNU 的 LLVM/Clang 前端 (
clang++
) 现在可以用于编译CUDA
语言源文件。面向 Windows (MinGW) 上 GNU ABI 的编译器现在可以用于编译 Objective C (
OBJC
) 和 Objective C++ (OBJCXX
)。 这些包括 GNU 编译器 (gcc
和g++
) 以及类似 GNU 的 LLVM/Clang 前端 (clang
和clang++
)。现在支持基于 TI Clang 的编译器,其
compiler id
为TIClang
。
命令¶
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
。The
ctest_test()
命令新增了INCLUDE_FROM_FILE
和EXCLUDE_FROM_FILE
选项,用于运行或排除在文件中命名的测试。
CPack¶
CPack DEB 生成器
CPACK_DEBIAN_FILE_NAME
变量现在可以不带任何后缀设置,并且会自动添加.deb
后缀。CPack RPM 生成器
CPACK_RPM_FILE_NAME
变量现在可以不带任何后缀设置,并且会自动添加.rpm
后缀。CPack WIX 生成器
新增了一个变量CPACK_WIX_INSTALL_SCOPE
,用于控制 WiX MSI 安装程序的InstallScope
属性。
其他更改¶
CMake 学会了根据链接器功能对链接行上的库进行去重。 请参阅策略
CMP0156
。add_test()
命令现在仅在交叉编译时才遵守CMAKE_CROSSCOMPILING_EMULATOR
。 请参阅策略CMP0158
。在 Windows 上,当以 MSVC ABI 为目标时,
find_library()
命令现在在首先考虑.lib
之后接受.a
文件名。 这与以 GNU ABI 为目标时的现有行为对称,在该行为中,该命令在首先考虑.a
之后接受.lib
文件名。在 Windows 上,当以 MSVC ABI 为目标时,
find_library()
命令现在在.lib
之前考虑.dll.lib
文件名。 这是 Rust 工具链为 MSVC ABI 创建的 DLL 导入库的默认后缀。Ninja
和NMake Makefiles
生成器现在为系统 include 使用-external:I
标志,当使用版本 2021.4 及更高版本的 IntelLLVM 时。-external:W0
标志也用于版本 2022.2 及更高版本。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 生成器
的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 恢复默认值以实现兼容性。 项目可以通过设置CPACK_WIX_INSTALL_SCOPE
按照自己的计划过渡到perMachine
。
3.29.6、3.29.7、3.29.8、3.29.9¶
这些版本未对已记录的功能或接口进行任何更改。 进行了一些实现更新以支持生态系统更改和/或修复回归。