CMake 3.17 发行说明¶
自 CMake 3.16 以来的更改包括以下内容。
新特性¶
生成器¶
cmake(1)
获得了Ninja Multi-Config
生成器,它类似于Ninja
生成器,但可用于一次构建多个配置。Visual Studio 生成器 学习了支持每个配置的源文件。以前只有 命令行构建工具生成器 支持它们。
用于 VS 2010 及更高版本的 Visual Studio 生成器 现在支持在
CMAKE_GENERATOR_TOOLSET
设置中为项目文件指定VCTargetsPath
值。用于 VS 2010 及更高版本的 Visual Studio 生成器 学习了支持 .NET Standard 和 .NET Core。 请参阅
DOTNET_TARGET_FRAMEWORK
目标属性和相关的CMAKE_DOTNET_TARGET_FRAMEWORK
变量。
语言¶
编译特性
功能现在为 CUDA 语言标准级别提供元特性(例如cuda_std_03
,cuda_std_14
)。 请参阅CMAKE_CUDA_KNOWN_FEATURES
。
编译器¶
Ninja
生成器现在支持 IBM XL Fortran 编译器。
命令行¶
命令¶
add_custom_command()
命令学习了解释DEPENDS
参数中相对于当前二进制目录指定的路径。foreach()
命令学习了一个新的ZIP_LISTS
选项,用于同时迭代多个列表。当使用
cmake -P
来 运行脚本 时,现在允许使用load_cache(READ_WITH_PREFIX)
命令模式。message()
命令学习了为日志级别NOTICE
及以下级别输出在CMAKE_MESSAGE_CONTEXT
变量中提供的上下文。 使用新的--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
环境变量获取其初始值。与仅适用于该特定运行的
--log-level
命令行选项不同,CMAKE_MESSAGE_LOG_LEVEL
变量现在可用于在 CMake 运行之间持久化日志级别。添加了
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 作为语言的情况下查找 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¶
当使用
-C <cfg>
调用ctest(1)
时,现在从命令行设置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 生成器
学习了使用CPACK_DMG_<component>_FILE_NAME
变量,以在将组件打包到其自己的 DMG 中时设置自定义文件名。CPack DragNDrop 生成器
学习了处理 RTF 格式的许可文件。 当设置CPACK_DMG_SLA_DIR
变量时,会考虑<language>.license.rtf
,但仅在未找到纯文本 (.txt
) 文件时才作为回退,以保持向后兼容性。CPack NSIS 生成器
获得了一个新的变量CPACK_NSIS_MUI_HEADERIMAGE
以设置标题图像。 为了不破坏现有设置,如果未设置新变量,它仍然默认为CPACK_PACKAGE_ICON
。CPack NSIS 生成器
现在支持CPACK_NSIS_UNINSTALL_NAME
。 这可以用于指定卸载程序的名称。CPack NSIS 生成器
现在支持CPACK_NSIS_WELCOME_TITLE
和CPACK_NSIS_WELCOME_TITLE_3LINES
。 这些可以用于指定欢迎页面标题并以 3 行显示。CPack NSIS 生成器
现在支持CPACK_NSIS_FINISH_TITLE
和CPACK_NSIS_FINISH_TITLE_3LINES
。 这些可以用于指定完成页面标题并以 3 行显示。CPack productbuild 生成器
获得了对CPACK_PRODUCTBUILD_BACKGROUND
变量的支持,以指定 macOS 安装程序的背景图像。
其他¶
已弃用和移除的特性¶
为策略
CMP0068
和策略CMP0069
(CMP0067
及以下版本已弃用)添加了显式弃用诊断。cmake-policies(7)
手册解释说,所有策略的 OLD 行为都已弃用,项目应移植到 NEW 行为。CPack
PackageMaker
生成器已被弃用,因为 Xcode 不再分发 PackageMaker 工具。 未记录在案的OSXX11
生成器也已被弃用。已
cmake(1)
命令行工具-E remove
和-E remove_directory
已被弃用,推荐使用新的-E rm
工具。即使没有强制选项,旧工具在指定的路径不存在时总是返回 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
导入库可用。如果环境的
PATH
中存在sh.exe
,MinGW Makefiles
生成器不再发出错误。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 现在强制使用足够新的版本。
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
。