CMake 4.1 发布说明¶
自 CMake 4.0 以来进行的更改包括以下内容。
新特性¶
基于文件的 API¶
cmake-file-api(7)v1 现在在构建系统生成失败时会写入部分回复。请参阅v1 回复错误索引。
生成器¶
Makefile 生成器和Ninja 生成器现在支持为
Fortran、CUDA和HIP添加链接器启动器。详情请参阅CMAKE_<LANG>_LINKER_LAUNCHER变量和<LANG>_LINKER_LAUNCHER目标属性。
命令行¶
cmake --build命令行工具与
Xcode生成器一起使用时,现在可以检测第三方工具是否将生成的.xcodeproj包装在.xcworkspace中,并通过工作区而不是直接驱动构建。
配置日志¶
cmake-configure-log(7)现在会报告来自find_package()(在CONFIG模式下)、find_path()、find_file()、find_library()和find_program()命令的事件,这些事件会在首次调用时、结果在“未找到”和“已找到”之间切换时,或者通过--debug-find命令行选项显式启用时报告。请参阅事件类型 find和事件类型 find_package。日志记录也可以通过CMAKE_FIND_DEBUG_MODE和CMAKE_FIND_DEBUG_MODE_NO_IMPLICIT_CONFIGURE_LOG变量控制。
编译器¶
现在支持来自Wind River Systems的Diab编译器,版本5.9.x+,
编译器 ID为Diab,支持语言为ASM、C和CXX。
现在支持Renesas 编译器,
编译器 ID为Renesas,支持语言为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 生成器和Ninja 生成器对于C和CXX语言,在编译时同时运行IARicstat工具。
环境变量¶
添加了
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目标属性现在支持生成器 表达式。
模块¶
FindASPELL模块现在提供了一个版本变量、导入目标和组件,用于可选地单独选择Aspell库和可执行文件。FindBLAS和FindLAPACK模块现在支持NVIDIA性能库(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 生成器新增了选项CPACK_NUGET_SYMBOL_PACKAGE,用于生成包含PDB文件的NuGet符号包。CPack RPM 生成器新增了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导入目标。FindGCCXML模块已通过策略CMP0188弃用。请将项目移植到CastXML。CMakeDetermineVSServicePack模块已通过策略CMP0196弃用。请将项目移植到CMAKE_<LANG>_COMPILER_VERSION变量。
其他更改¶
ExternalProject模块不再检查URL存档文件扩展名。现在允许cmake -E tar可以提取的任何存档类型。模块
FindPython3、FindPython2和FindPython现在在交叉编译模式下强制执行artifacts的一致性。这可以防止混合主机和目标artifacts。请参阅策略CMP0190。GNUInstallDirs模块现在在安装到特殊前缀时,更倾向于将SYSCONFDIR、LOCALSTATEDIR和RUNSTATEDIR默认设置为绝对路径。请参阅策略CMP0192。GNUInstallDirs模块现在将CMAKE_INSTALL_*变量(对于安装前缀/,带前导usr/)缓存起来。请参阅策略CMP0193。install(TARGETS)命令不再忽略在调用时尚未定义的文件集。target_sources(FILE_SET)和install(TARGETS)的顺序不再具有语义相关性。启用
ASM不再意外地成功使用MSVC的clC编译器作为汇编器。请参阅策略CMP0194。MSVC链接
-machine:标志不再添加到CMAKE_*_LINKER_FLAGS变量中。请参阅策略CMP0197。TARGET_PROPERTY生成器表达式现在会传递性地评估LINK_LIBRARIES和INTERFACE_LINK_LIBRARIES目标属性。请参阅策略CMP0189。