CMake 3.17 发行说明¶
自 CMake 3.16 以来所做的更改包括以下内容。
新功能¶
生成器¶
cmake(1)获得了一个Ninja Multi-Config生成器,它类似于Ninja生成器,但可用于一次构建多个配置。Visual Studio 生成器 学会了支持每个配置源。以前只有 命令行构建工具生成器 支持它们。
VS 2010 及更高版本的 Visual Studio Generators 现在支持在 CMAKE_GENERATOR_TOOLSET 设置中为项目文件指定 VCTargetsPath` 值。
Visual Studio 生成器 for VS 2010 and above learned to support .NET Standard and .NET Core. See the
DOTNET_TARGET_FRAMEWORKtarget property and associatedCMAKE_DOTNET_TARGET_FRAMEWORKvariable.
语言¶
Compile Features功能现在为 CUDA 语言标准级别(例如cuda_std_03、cuda_std_14)提供元特征。请参阅:prop_gbl:CMAKE_CUDA_KNOWN_FEATURES。
编译器¶
Ninja 生成器现在支持 IBM XL Fortran 编译器。
命令行¶
命令¶
add_custom_command()命令学会了解释相对于当前二进制目录指定的DEPENDS参数中的路径。foreach()命令学习了一个新的ZIP_LISTS选项来同时迭代多个列表。load_cache(READ_WITH_PREFIX)命令模式在使用cmake -P到 Run a Script 时被允许。message()命令学会输出在CMAKE_MESSAGE_CONTEXT变量中为日志级别NOTICE及以下提供的上下文。使用新的--log-context命令行选项或 CMAKE_MESSAGE_CONTEXT_SHOW 变量启用此输出。message()命令获得了新的关键字CHECK_START、CHECK_PASS和CHECK_FAIL。target_compile_options()命令现在更一致地支持BEFORE关键字。请参阅政策:policy: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生成器设置“自定义工作目录”架构选项的值。
特性¶
AIX_EXPORT_ALL_SYMBOLS目标属性和关联的CMAKE_AIX_EXPORT_ALL_SYMBOLS变量的创建是为了选择性地显式禁用从 AIX 上的共享库自动导出符号。添加了
DEPRECATION目标属性以将目标标记为已弃用。如果链接的目标被标记为已弃用,则会在生成时发出带有弃用消息的警告。INSTALL_NAME_DIR目标属性现在支持generator expressions。特别是,$<INSTALL_PREFIX>生成器表达式可用于设置相对于安装时前缀的目录。添加了目标属性
MACHO_COMPATIBILITY_VERSION和MACHO_CURRENT_VERSION以分别为 Mach-O 二进制文件设置compatibility_version和curent_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。请参阅政策:policy:CMP0098。
FindLibArchive模块现在为 libarchive 提供了一个导入的目标。FindPython 模块已经学会在由 conda 管理的活动虚拟环境中查找 Python 组件。
FindPython3和FindPython模块分别获得变量Python3_SOABI和Python_SOABI为模块提供标准扩展后缀。此外,命令Python3_add_library()和Python_add_library()获得了选项WITH_SOABI以SOABI的值作为库后缀的前缀。FindLibXml2模块现在为xmllint可执行文件提供了一个导入的目标。
自动生成器¶
C测试¶
CTEST_CONFIGURATION_TYPE变量现在在使用``-C <cfg>`` 调用ctest(1)时从命令行设置。ctest(1)工具获得了对 Dr. Memory 运行 memcheck 运行的支持。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 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 安装程序的背景图像。
其他¶
弃用和删除的功能¶
为策略“CMP0068”和策略“CMP0069”添加了明确的弃用诊断(“CMP0067”及以下已弃用)。
cmake-policies(7)手册解释说所有策略的旧行为都已弃用,项目应该移植到新行为。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现在可以通过对静态库的私有依赖项传递。请参阅政策:policy:CMP0099。使用 MinGW 工具时,
find_library()命令默认不再查找 .dll` 文件。相反,它期望.dll.a导入库可用。如果环境的 PATH 中存在 sh.exe,MinGW Makefiles 生成器不再发出错误。
Ninja生成器现在更喜欢第一个 ninja 构建工具出现在PATH中,无论它被称为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。