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。