CMake 4.1 发布说明¶
自 CMake 4.0 以来的更改包括以下内容。
新功能¶
基于文件的 API¶
当构建系统生成失败并出现错误时,
cmake-file-api(7)v1 现在会写入部分回复。请参阅 v1 回复错误索引。
生成器¶
Makefile Generators 和 Ninja Generators 获得了对使用
Fortran、CUDA和HIP添加链接器启动器的支持。有关详细信息,请参阅CMAKE_<LANG>_LINKER_LAUNCHER变量和<LANG>_LINKER_LAUNCHER目标属性。
命令行¶
当使用
Xcode生成器时,cmake --build 命令行工具现在可以检测到第三方工具何时将生成的.xcodeproj文件包装在.xcworkspace文件中,并改为通过工作区驱动构建。
配置日志¶
当首次调用
find_package()(以CONFIG模式)、find_path()、find_file()、find_library()和find_program()命令时,cmake-configure-log(7)现在会报告这些命令的事件,当它们的搜索结果在“未找到”和“已找到”之间转换时,或者当它们通过--debug-find命令行选项显式启用时。请参阅 事件类型 find 和 事件类型 find_package。日志记录还可以由CMAKE_FIND_DEBUG_MODE和CMAKE_FIND_DEBUG_MODE_NO_IMPLICIT_CONFIGURE_LOG变量控制。
编译器¶
现在支持 Wind River Systems 的 Diab 编译器,版本 5.9.x+,使用
compiler idDiab,支持语言ASM、C和CXX。
现在支持 Renesas 编译器,使用
compiler idRenesas,支持语言ASM和C。
命令¶
现在可以调用
add_dependencies()命令而无需指定依赖项。现在
cmake_pkg_config()命令支持IMPORT和POPULATE子命令,用于将 CMake 目标与基于 pkg-config 的依赖项进行接口集成。现在
project()命令对COMPAT_VERSION关键字提供了实验性支持,该支持由CMAKE_EXPERIMENTAL_EXPORT_PACKAGE_INFO启用。
变量¶
添加了
CMAKE_FIND_REQUIRED变量,用于指示find_package()、find_path()、find_file()、find_library()和find_program()默认是REQUIRED的。这些命令还增加了一个OPTIONAL关键字,用于忽略对特定调用的变量。现在为大多数编译器填充了
CMAKE_<LANG>_COMPILER_ARCHITECTURE_ID变量,并将其公开供公开使用。添加了
CMAKE_<LANG>_ICSTAT变量和相应的<LANG>_ICSTAT目标属性,用于指示 Makefile Generators 和 Ninja Generators 与编译器一起运行 IARicstat工具,用于C和CXX语言。
环境变量¶
添加了
CMAKE_<LANG>_IMPLICIT_LINK_LIBRARIES_EXCLUDE环境变量,用于可选地排除从CMAKE_<LANG>_IMPLICIT_LINK_LIBRARIES检测到的库集中排除特定库。
属性¶
添加了
AUTOMOC_INCLUDE_DIRECTORIES目标属性和相关的CMAKE_AUTOMOC_INCLUDE_DIRECTORIES变量,用于覆盖从目标传递性包含目录自动发现 moc 包含。现在,当在源目录上设置
MACOSX_PACKAGE_LOCATION源文件属性时,该属性会生效,并将整个目录树复制到 bundle 中。现在
PDB_NAME和COMPILE_PDB_NAME目标属性支持generator expressions。
模块¶
现在
FindASPELL模块提供了版本变量、导入的目标和组件,用于单独选择 Aspell 库和可执行文件。现在
FindBLAS和FindLAPACK模块支持 NVIDIA Performance Libraries (NVPL)。现在
FindProtobuf模块的protobuf_generate(DEPENDENCIES)命令参数现在可以接受多个值。现在
FindProtobuf模块的protobuf_generate_cpp()和protobuf_generate_python()命令,以及它们的Protobuf_IMPORT_DIRS和PROTOBUF_GENERATE_CPP_APPEND_PATH提示变量,现在已弃用,取而代之的是protobuf_generate()命令。
正则表达式¶
现在
string(REGEX MATCHALL)、string(REGEX REPLACE)和list(TRANSFORM REPLACE)命令在重复搜索中最多匹配一次正则表达式^锚点,位于输入的开头。请参阅策略CMP0186。现在
string(REGEX REPLACE)命令允许引用未匹配的组。它们将被替换为空字符串。现在
string(REGEX MATCH)、string(REGEX MATCHALL)和string(REGEX REPLACE)命令允许零长度匹配。
CTest¶
ctest(1)增加了--schedule-random-seed选项,用于指定数字随机种子,使ctest --schedule-random具有确定性,以便于重现。
CPack¶
CPack NuGet Generator增加了CPACK_NUGET_SYMBOL_PACKAGE选项,用于生成包含 PDB 文件的 NuGet 符号包。CPack RPM Generator增加了CPACK_RPM_PACKAGE_ENHANCES、CPACK_RPM_PACKAGE_RECOMMENDS和CPACK_RPM_PACKAGE_SUPPLEMENTS变量,用于指定相应的 RPM spec 字段。
已弃用和移除的功能¶
现在
FindGTest模块的结果变量GTEST_INCLUDE_DIRS、GTEST_LIBRARIES、GTEST_MAIN_LIBRARIES和GTEST_BOTH_LIBRARIES已弃用,取而代之的是使用GTest::gtest和GTest::gtest_main导入的目标。通过策略
CMP0188,FindGCCXML模块已被弃用。请改为将项目移植到 CastXML。通过策略
CMP0196,CMakeDetermineVSServicePack模块已被弃用。请改为使用CMAKE_<LANG>_COMPILER_VERSION变量。
其他更改¶
ExternalProject模块不再检查URL归档文件扩展名。现在允许cmake -E tar提取的任何归档类型。现在,在交叉编译模式下,
FindPython3、FindPython2和FindPython模块会强制执行工件在交叉编译模式下的不混用。这可以防止混合主机和目标工件。请参阅策略CMP0190。当安装到特殊前缀时,
GNUInstallDirs模块现在更倾向于将SYSCONFDIR、LOCALSTATEDIR和RUNSTATEDIR默认设置为绝对路径。请参阅策略CMP0192。GNUInstallDirs模块现在将安装前缀为/的CMAKE_INSTALL_*变量缓存,并在其前面加上usr/。请参阅策略CMP0193。现在
install(TARGETS)命令不再忽略在调用时尚未定义的 `file set`。现在target_sources(FILE_SET)和install(TARGETS)的顺序不再具有语义相关性。现在启用
ASM不会意外地使用MSVC的clC 编译器作为汇编器。请参阅策略CMP0194。MSVC 链接器
-machine:标志不再添加到CMAKE_*_LINKER_FLAGS变量中。请参阅策略CMP0197。现在
TARGET_PROPERTY生成器表达式会传递性地计算LINK_LIBRARIES和INTERFACE_LINK_LIBRARIES目标属性。请参阅策略CMP0189。
更新¶
自 CMake 4.1.0 以来的更改包括以下内容。
4.1.1¶
此版本未对文档功能或接口进行任何更改。进行了一些实现更新以支持生态系统更改和/或修复回归。
4.1.2¶
现在,当评估生成器表达式时,
file(GENERATE)命令在每次调用时使用策略CMP0189的值。以前,它使用目录的CMakeLists.txt结束时的值,就像所有其他生成器表达式评估一样。
4.1.3¶
当使用
Xcode生成器为 macOS 构建时,如果CMAKE_OSX_DEPLOYMENT_TARGET比 macOS SDK 版本旧,它将再次默认设置为主机的 macOS 版本,就像 CMake 4.0 版本之前那样。当其
TIMEOUT超时时,execute_process()命令再次终止子进程。这在 CMake 3.29 中意外回归。