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
的cl
C编译器作为汇编器。请参阅策略CMP0194
。MSVC链接
-machine:
标志不再添加到CMAKE_*_LINKER_FLAGS
变量中。请参阅策略CMP0197
。TARGET_PROPERTY
生成器表达式现在会传递性地评估LINK_LIBRARIES
和INTERFACE_LINK_LIBRARIES
目标属性。请参阅策略CMP0189
。