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 id
TIClang
支持 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¶
这些版本未对已记录的功能或接口进行任何更改。为了支持生态系统更改和/或修复回归,进行了一些实现更新。