CMake 3.17 发布说明¶
自 CMake 3.16 以来的更改包括以下内容。
新功能¶
生成器¶
cmake(1)
新增了一个Ninja Multi-Config
生成器,它类似于Ninja
生成器,但可用于一次构建多个配置。Visual Studio 生成器 支持了每个配置的源文件。以前只有 命令行构建工具生成器 支持它们。
Visual Studio 生成器(针对 VS 2010 及以上版本)现在支持在
CMAKE_GENERATOR_TOOLSET
设置中指定项目文件的VCTargetsPath
值。Visual Studio 生成器(针对 VS 2010 及以上版本)现在支持 .NET Standard 和 .NET Core。请参阅
DOTNET_TARGET_FRAMEWORK
目标属性以及相关的CMAKE_DOTNET_TARGET_FRAMEWORK
变量。
语言¶
Compile Features
功能现在为 CUDA 语言标准级别(例如cuda_std_03
、cuda_std_14
)提供了元特性。请参阅CMAKE_CUDA_KNOWN_FEATURES
。
编译器¶
IBM XL Fortran 编译器现在得到了
Ninja
生成器的支持。
命令行¶
cmake(1)
新增了--debug-find
命令行选项,以启用关于find_*
命令搜索位置的额外可读输出。cmake(1)
新增了--trace-format
命令行选项,可用于设置--trace
的输出格式。当前支持旧的易读格式和新的 JSON 格式。新的 JSON 格式比现有格式更容易自动解析。cmake(1)
新增了一个-E rm
命令行工具,可用于删除目录和文件。它取代了现有的-E remove
和-E remove_directory
工具,并且具有更好的语义。
命令¶
add_custom_command()
命令现在可以解释DEPENDS
参数中相对于当前二进制目录指定的路径。foreach()
命令新增了ZIP_LISTS
选项,用于同时迭代多个列表。当使用
cmake -P
运行脚本 时,现在允许使用load_cache(READ_WITH_PREFIX)
命令模式。message()
命令现在可以输出CMAKE_MESSAGE_CONTEXT
变量中提供的上下文信息(用于NOTICE
及以下级别)。通过新的--log-context
命令行选项或CMAKE_MESSAGE_CONTEXT_SHOW
变量启用此输出。message()
命令新增了CHECK_START
、CHECK_PASS
和CHECK_FAIL
关键字。target_compile_options()
命令现在更能一致地遵守BEFORE
关键字。请参阅策略CMP0101
。
变量¶
新增了
CMAKE_CTEST_ARGUMENTS
变量,用于指定在使用生成的构建系统的test
(或RUN_TESTS
)目标运行 CTest 时传递的命令行参数列表。以下变量现在定义在
function()
内部新增了
CMAKE_CUDA_RUNTIME_LIBRARY
变量和CUDA_RUNTIME_LIBRARY
目标属性,用于在链接使用 CUDA 的目标时选择 CUDA 运行时库。新增了
CMAKE_FIND_DEBUG_MODE
变量,用于在 cmake 运行期间向标准错误输出额外的find_*
调用信息。输出旨在供人工阅读,不用于解析。CMAKE_EXPORT_COMPILE_COMMANDS
变量现在从CMAKE_EXPORT_COMPILE_COMMANDS
环境变量获取初始值,如果没有显式配置。如果
CMAKE_<LANG>_COMPILER_LAUNCHER
变量未显式设置,现在从CMAKE_<LANG>_COMPILER_LAUNCHER
环境变量获取初始值。CMAKE_MESSAGE_LOG_LEVEL
变量现在可以用于在 CMake 运行之间持久化日志级别,这与仅适用于特定运行的--log-level
命令行选项不同。新增了
CMAKE_XCODE_SCHEME_ENVIRONMENT
变量,用于初始化XCODE_SCHEME_ENVIRONMENT
目标属性。新增了
CMAKE_XCODE_SCHEME_WORKING_DIRECTORY
变量和相关的XCODE_SCHEME_WORKING_DIRECTORY
目标属性,用于告诉Xcode
生成器设置Custom Working Directory
方案选项的值。
属性¶
创建了
AIX_EXPORT_ALL_SYMBOLS
目标属性和相关的CMAKE_AIX_EXPORT_ALL_SYMBOLS
变量,用于在 AIX 上可选地显式禁用共享库符号的自动导出。新增了
DEPRECATION
目标属性,用于将目标标记为已弃用。如果链接的目标被标记为已弃用,则在生成时会发出带有弃用消息的警告。INSTALL_NAME_DIR
目标属性现在支持生成器表达式
。特别是,$<INSTALL_PREFIX>
生成器表达式可用于设置相对于安装时前缀的目录。新增了目标属性
MACHO_COMPATIBILITY_VERSION
和MACHO_CURRENT_VERSION
,分别用于设置 Mach-O 二进制文件的compatibility_version
和current_version
。为了向后兼容,如果未设置这些属性,将分别使用SOVERSION
和VERSION
作为后备。新增了
VS_DOTNET_DOCUMENTATION_FILE
目标属性,用于告知 Visual Studio 生成器 在.csproj
文件中生成DocumentationFile
引用。
模块¶
ExternalProject
模块的ExternalProject_Add()
命令新增了GIT_SUBMODULES_RECURSE
选项,用于指定是否递归更新 Git 子模块。默认值为开启,以保持现有行为。新增了
FindCUDAToolkit
模块,用于查找 CUDA Toolkit 而不启用 CUDA 作为语言。FindCURL
模块现在可以通过 CURL 的 cmake 构建系统生成的CURLConfig.cmake
包配置文件来查找 CURL。它还新增了CURL_NO_CURL_CMAKE
选项来禁用此行为。FindFLEX
模块的flex_target()
命令现在以CMAKE_CURRENT_BINARY_DIR
作为工作目录来运行flex
。请参阅策略CMP0098
。FindLibArchive
模块现在为 libarchive 提供了一个导入的目标。FindPython
模块现在可以查找由conda
管理的活动虚拟环境中的 Python 组件。FindPython3
和FindPython
模块分别新增了变量Python3_SOABI
和Python_SOABI
,用于提供模块的标准扩展后缀。此外,命令Python3_add_library()
和Python_add_library()
新增了WITH_SOABI
选项,以SOABI
的值为库后缀添加前缀。FindLibXml2
模块现在为xmllint
可执行文件提供了一个导入的目标。
Autogen¶
CTest¶
当
ctest(1)
使用-C <cfg>
调用时,CTEST_CONFIGURATION_TYPE
变量现在是从命令行设置的。ctest(1)
工具新增了对 Dr. Memory 的支持,用于运行内存检查。ctest(1)
工具新增了--no-tests=<[error|ignore]>
选项,用于在未找到测试时显式设置和统一直接调用与脚本模式之间的行为。ctest(1)
工具新增了--repeat <mode>:<n>
选项,用于指定重复测试的条件。这扩展了现有的--repeat-until-fail <n>
选项,增加了until-pass
和after-timeout
的模式。ctest_test()
命令新增了REPEAT <mode>:<n>
选项,用于指定重复测试的条件。
CPack¶
CPack DragNDrop Generator
现在可以使用CPACK_DMG_<component>_FILE_NAME
变量来设置将组件打包到各自的 DMG 文件时的自定义文件名。CPack DragNDrop Generator
现在可以处理 RTF 格式的许可证文件。当设置了CPACK_DMG_SLA_DIR
变量时,会考虑<language>.license.rtf
,但仅作为备选,当找不到纯文本(.txt
)文件时使用,以保持向后兼容。CPack NSIS Generator
新增了变量CPACK_NSIS_MUI_HEADERIMAGE
,用于设置标题图像。为了不破坏现有设置,如果新变量未设置,它仍然默认为CPACK_PACKAGE_ICON
。CPack NSIS Generator
现在支持CPACK_NSIS_UNINSTALL_NAME
。这可用于指定卸载程序的名称。CPack NSIS Generator
现在支持CPACK_NSIS_WELCOME_TITLE
和CPACK_NSIS_WELCOME_TITLE_3LINES
。这些可用于指定欢迎页面的标题并以 3 行显示。CPack NSIS Generator
现在支持CPACK_NSIS_FINISH_TITLE
和CPACK_NSIS_FINISH_TITLE_3LINES
。这些可用于指定完成页面的标题并以 3 行显示。CPack productbuild Generator
现在支持CPACK_PRODUCTBUILD_BACKGROUND
变量,用于为 macOS 安装程序指定背景图像。
其他¶
如果终端支持颜色,
ccmake(1)
现在会根据条目类型使用颜色显示缓存值。ccmake(1)
现在在配置和生成期间显示消息和进度条。如果发生任何错误或警告,它将保留显示的输出。
已弃用和已移除的功能¶
为策略
CMP0068
和CMP0069
(CMP0067
及以下版本已弃用)添加了显式的弃用诊断。cmake-policies(7)
手册解释说,所有策略的 OLD 行为都已弃用,项目应迁移到 NEW 行为。CPack
PackageMaker
生成器已弃用,因为 Xcode 不再分发 PackageMaker 工具。未经文档化的OSXX11
生成器也已弃用。CMake 命令行工具
-E remove
和-E remove_directory
已弃用,推荐使用新的-E rm
工具。旧工具在命名的路径不存在时即使没有force
选项也总是返回 0,并且无法在不破坏兼容性的情况下修复,因此已被取代。CPack NSIS Generator
现在要求 NSIS 3.0 或更高版本。
其他更改¶
file API
索引文件现在发出一个multiConfig
标志,指定生成器是否支持多输出配置。目标链接属性
INTERFACE_LINK_OPTIONS
、INTERFACE_LINK_DIRECTORIES
和INTERFACE_LINK_DEPENDS
现在对于静态库上的私有依赖项是可传递的。请参阅策略CMP0099
。在使用 MinGW 工具时,
find_library()
命令默认不再查找.dll
文件。相反,它期望.dll.a
导入库可用。MinGW Makefiles
生成器不再因为环境中PATH
中存在sh.exe
而发出错误。Ninja
生成器现在优先选择PATH
中第一个出现的 ninja 构建工具,无论其名称是ninja-build
、ninja
还是samu
。以前是优先选择PATH
中第一个出现的这些名称。使用 SDCC 时,现在优先使用
sdar
工具而不是sdcclib
作为库管理器。后者已被 SDCC 3.2.0 弃用,并在 SDCC 3.8.6 中移除。使用 SDCC 时,默认标志不再包含任何特定于目标平台的标志。以前默认标志是为 8051 硬编码的。
CMAKE_VS_GLOBALS
变量的值现在在编译器识别期间以及由add_custom_target()
命令创建的目标中生效。Xcode
生成器不再硬编码-Wmost
、-Wno-four-char-constants
和-Wno-unknown-pragmas
警告标志。
更新¶
自 CMake 3.17.0 以来的更改包括以下内容。
3.17.1¶
CMake 3.17.0 更新了
CPack NSIS Generator
,其中包含需要 NSIS 3.0 或更高版本进行的更改。CMake 3.17.1 现在强制使用足够新版本的 NSIS。
3.17.3¶
如果未设置
OBJC
或OBJCXX
环境变量,Objective C 或 C++ 编译器的选择现在会考虑CC
或CXX
环境变量。FindPkgConfig
模块现在将以-isystem
为前缀的包含目录提取到*_INCLUDE_DIRS
变量和INTERFACE_INCLUDE_DIRECTORIES
目标属性中。以前它们会被放入*_CFLAGS_OTHER
变量和INTERFACE_COMPILE_OPTIONS
目标属性中。
3.17.5¶
CMAKE_AUTOMOC_PATH_PREFIX
的默认值已更改为OFF
,因为此功能可能会破坏具有不同包含目录中同名头文件的现有项目。这恢复了与 CMake 3.15 及更低版本的兼容性。在 3.16.9 中,默认值也已更改为OFF
。