CMake 3.29 发行说明¶
自 CMake 3.28 以来的更改包括:
新功能¶
命令行¶
生成器¶
Visual Studio 生成器 现在支持使用
CMAKE_GENERATOR_TOOLSET
中的fortran=
字段来选择 Intel oneAPI Fortran 编译器 (ifx
) 和 Intel 经典 Fortran 编译器 (ifort
)。
基于文件的 API¶
cmake-file-api(7)
“codemodel”版本 2 的version
字段已更新至 2.7。cmake-file-api(7)
“codemodel”版本 2 的“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++
)。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 包含目录不同的 GLU 包含目录。一个新的OPENGL_INCLUDE_DIRS
结果变量提供所有的包含目录。
CTest¶
ctest(1)
增加了一个--http-header
选项,以在提交到 CDash 时添加自定义头。ctest(1)
增加了--tests-from-file
和--exclude-from-file
选项来运行或排除文件中命名的测试。ctest(1)
现在支持在 POSIX 系统上 与 job 服务器集成。现在
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 导入库的默认后缀。从 2021.4 版本开始,
Ninja
和NMake Makefiles
生成器现在使用-external:I
标志作为系统包含,当时使用的是 2021.4 版本的 IntelLLVM。从 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 恢复了此默认值以保持兼容性。项目可以通过设置CPACK_WIX_INSTALL_SCOPE
来按自己的时间表过渡到perMachine
。
3.29.6、3.29.7、3.29.8¶
这些版本未更改已记录的功能或接口。已执行一些实现更新来支持生态系统变更和/或修复回归。