CMake 3.18 发行说明

自 CMake 3.17 以来的更改包括以下内容。

新功能

语言

  • 现在可以在非 Windows 平台上的 Clang 编译器中使用 CUDA 语言进行编译。可分离编译在任何平台上尚不支持。

命令行

  • cmake(1) 新增了通过 --profiling-output--profiling-format 参数对 CMake 脚本进行性能分析的支持。

  • cmake(1) 新增了一个 cat 命令行选项,可用于连接文件并将它们打印到标准输出。

命令

  • add_library()add_executable() 命令支持创建引用非 GLOBAL 导入目标别名目标

  • 新增了 cmake_language() 命令,用于对脚本化或内置命令进行元操作,包括一个用于 CALL 其他命令的模式,以及用于就地评估 CMake 脚本的 EVAL CODE

  • execute_process() 命令新增了 ECHO_OUTPUT_VARIABLEECHO_ERROR_VARIABLE 选项。

  • export() 命令现在如果在未指定 APPEND 的情况下多次使用相同的 FILE,会引发错误。请参见策略 CMP0103

  • file() 命令新增了 ARCHIVE_CREATEARCHIVE_EXTRACT 子命令,以将 cmake(1)-E tar 功能暴露给 CMake 脚本代码。

  • 创建了 file(CONFIGURE) 子命令,以复制 configure_file() 的功能,而无需依赖磁盘上已有的文件作为输入。内容而是通过字符串传递。

  • file(UPLOAD) 命令新增了 TLS_VERIFYTLS_CAINFO 选项,用于控制服务器证书验证。

  • find_program()find_library()find_path()find_file() 命令新增了 REQUIRED 选项,如果找不到任何内容,则会停止处理并显示错误消息。

  • 带有 SOURCE 范围的 get_property() 命令新增了 DIRECTORYTARGET_DIRECTORY 选项,用于从提供的目录范围获取属性。

  • get_source_file_property() 命令新增了 DIRECTORYTARGET_DIRECTORY 选项,用于从提供的目录范围获取属性。

  • list() 命令的 SORT 操作新增了 NATURAL 排序选项,用于使用自然顺序排序(请参见 strverscmp(3) 手册)。

  • 带有 SOURCE 范围的 set_property() 命令新增了 DIRECTORYTARGET_DIRECTORY 选项,用于在提供的目录范围设置属性。

  • set_source_files_properties() 命令新增了 DIRECTORYTARGET_DIRECTORY 选项,用于在提供的目录范围设置属性。

  • string() 命令新增了 HEX 子命令,用于将字符串转换为其十六进制表示。

变量

  • 新增了 CMAKE_CUDA_ARCHITECTURES 变量,用于指定 CUDA 输出架构。鼓励用户使用此变量,而不是手动指定选项,因为这种方法与编译器无关。当 CMAKE_CUDA_COMPILER_IDNVIDIA 时,此变量会自动初始化。此变量用于初始化新的 CUDA_ARCHITECTURES 目标属性。请参见策略 CMP0104

  • 新增了 CMAKE_PCH_WARN_INVALID 变量,用于初始化 PCH_WARN_INVALID 目标属性,以允许移除预编译头文件无效警告。

属性

  • 新增了 CUDA_ARCHITECTURES 目标属性,用于指定 CUDA 输出架构。鼓励用户使用此属性,而不是手动指定选项,因为这种方法与编译器无关。此属性由新的 CMAKE_CUDA_ARCHITECTURES 变量初始化。请参见策略 CMP0104

  • 新增了 Fortran_PREPROCESS 目标属性和 Fortran_PREPROCESS 源文件属性,用于控制 Fortran 源文件的预处理。

  • 新增了 FRAMEWORK_MULTI_CONFIG_POSTFIX_<CONFIG> 目标属性和相关的 CMAKE_FRAMEWORK_MULTI_CONFIG_POSTFIX_<CONFIG> 变量,以允许在使用多配置生成器时,向框架文件名添加后缀。

  • OBJECT_OUTPUTS 源文件属性现在支持 生成器表达式

  • 新增了 PCH_WARN_INVALID 目标属性,以允许移除预编译头文件无效警告。

  • 新增了 UNITY_BUILD_MODE 目标属性,用于告知生成器使用哪种算法来对包含的源文件进行分组。

  • 新增了 VS_SOURCE_SETTINGS_<tool> 目标属性,用于告知 Visual Studio 生成器(针对 VS 2010 及更高版本)使用 <tool> 向非构建源文件添加元数据。

  • 新增了 VS_SETTINGS 源文件属性,用于告知 Visual Studio 生成器(针对 VS 2010 及更高版本)向非构建源文件添加元数据。

  • 新增了 VS_PLATFORM_TOOLSET 目标属性,用于告知 Visual Studio 生成器(针对 VS 2010 及更高版本)覆盖平台工具集。

  • 新增了 VS_SOLUTION_DEPLOY 目标属性,用于告知 Visual Studio 生成器(针对 VS 2010 及更高版本)将目标标记为部署,即使不在 Windows Phone/Store/CE 下构建。

模块

  • 新增了 CheckLinkerFlag 模块,以提供检查链接器标志有效性的功能。

  • ExternalProject 模块的 ExternalProject_Add() 命令新增了 GIT_REMOTE_UPDATE_STRATEGY 关键字。这可用于指定 git 更新期间失败的 rebase 操作应如何处理。还新增了 CMAKE_EP_GIT_REMOTE_UPDATE_STRATEGY 变量作为全局默认值,并且 ExternalProjectFetchContent 模块都支持该变量。

  • FetchContent 模块的 FetchContent_Declare() 命令现在支持 SOURCE_SUBDIR 选项。可用于指示 FetchContent_MakeAvailable() 在不同位置查找 CMakeLists.txt 文件。

  • FindBLAS 模块现在提供了一个导入目标。

  • FindCUDAToolkit 模块

    • 新增了 CUDAToolkit_LIBRARY_ROOT 变量,该变量是包含 nvvm 目录和 version.txt 的目录。

    • CUDA 编译器检测期间使用的工具包和库根。

  • FindLAPACK 模块现在提供了一个导入目标。

  • FindPython3FindPython2FindPython 模块

    • 新增了为 cmake-gui(1)ccmake(1) 的交互式编辑创建每个工件的缓存变量的可能性。

    • Development 组件下新增了子组件 Development.ModuleDevelopment.Embed

    • 新增了指定要查找的 Python 实现的能力,包括 IronPythonPyPy

  • FindRuby 模块的输入和输出变量均已从 RUBY_ 重命名为 Ruby_,以与其他查找模块保持一致。如果提供了旧大小写的输入变量,则会予以保留,并且旧大小写的输出变量始终提供。

  • FindSWIG 模块现在接受目标语言作为 COMPONENTSOPTIONAL_COMPONENTS 参数传递给 find_package

  • GoogleTest 模块的 gtest_discover_tests() 命令

    • 新增了 DISCOVERY_MODE 选项,用于控制测试发现步骤的运行时间。它提供了一个新的 PRE_TEST 设置,可以在测试时而不是构建时运行发现。新的 CMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE 变量可用于全局更改默认设置。

    • 新增了一个可选参数 XML_OUTPUT_DIR。设置后,JUnit XML 测试结果将存储在该目录中。

  • FindLibXslt 模块现在提供导入目标。

  • UseSWIG 模块现在支持 Fortran 作为目标语言,前提是 SWIG_EXECUTABLESWIG-Fortran

生成器表达式

  • 新增了 $<DEVICE_LINK:...>$<HOST_LINK:...> 生成器表达式,用于管理设备和主机链接步骤。

  • 新增了 $<LINK_LANGUAGE:...>$<LINK_LANG_AND_ID:...> 生成器表达式。

CTest

  • ctest(1) 新增了 CTEST_RESOURCE_SPEC_FILE 变量,可用于指定 资源规范文件

  • ctest(1) 新增了 --stop-on-failure 选项,可用于在测试失败后停止运行测试。

  • ctest_test() 命令新增了 STOP_ON_FAILURE 选项,可用于在测试失败后停止运行测试。

  • CTestCoverageCollectGCOV 模块的 ctest_coverage_collect_gcov() 命令新增了 TARBALL_COMPRESSION 选项,用于控制收集结果的 tarball 的压缩。

CPack

  • CPack Archive GeneratorTXZ 格式支持 CPACK_ARCHIVE_THREADS 变量,以启用并行压缩。需要 CMake 使用的 liblzma 支持。

  • CPack NSIS Generator 新增了 CPACK_NSIS_MANIFEST_DPI_AWARE 变量,用于声明安装程序是 DPI 感知的。

  • CPack RPM Generator 新增了 CPACK_RPM_PRE_TRANS_SCRIPT_FILECPACK_RPM_POST_TRANS_SCRIPT_FILE 变量,用于指定事务前和事务后脚本。

其他

已弃用和已删除的特性

  • 已通过策略 CMP0106 弃用 Documentation 模块。该模块本质上是 VTK 代码,CMake 不应再分发。

  • 为策略 CMP0070CMP0071CMP0069 及更早版本已弃用)添加了显式的弃用诊断。cmake-policies(7) 手册解释了所有策略的 OLD 行为已被弃用,项目应迁移到 NEW 行为。

其他更改

  • 在 Windows 上,当未显式指定编译器时,NinjaNinja Multi-Config 生成器现在会选择 PATH 环境变量列出的目录中找到的第一个编译器(不限名称)。

  • LINK_OPTIONSINTERFACE_LINK_OPTIONS 目标属性现在用于设备链接步骤。请参见策略 CMP0105

  • 创建覆盖现有目标的 ALIAS 目标现在会引发错误。请参见策略 CMP0107

  • 将目标通过别名链接到自身现在会引发错误。请参见策略 CMP0108

  • FindPackageHandleStandardArgs 模块的 REQUIRED_VARS 选项在指定 HANDLE_COMPONENTS 时现在是可选的。

  • source_group() 命令现在也识别正斜杠作为子组分隔符,而不仅仅是反斜杠。

  • ctest(1) 现在记录它为每个测试设置的环境变量(无论是由于 ENVIRONMENT 属性还是 资源分配 功能),并将此日志提交给 CDash。它不会记录在 CTest 外部设置的环境变量。

  • 当从源代码构建 CMake 本身且不使用系统提供的 libcurl 时,现在为支持通过 http(s) 进行网络通信的命令(如 file(DOWNLOAD)file(UPLOAD)ctest_submit())启用 HTTP/2 支持。在 cmake.org 上提供的预编译二进制文件现在支持 HTTP/2。

  • cmake-file-api(7) “codemodel”版本 2 的 version 字段已更新为 2.1。

  • cmake-file-api(7) “codemodel”版本 2 “target”对象在 compileGroups 对象中新增了 precompileHeaders 字段。

更新

自 CMake 3.18.0 以来的更改包括以下内容。

3.18.1

  • CMAKE_OSX_ARCHITECTURES 未定义时,Xcode 生成器现在选择 $(NATIVE_ARCH_ACTUAL) 作为默认架构(Xcode 的 ARCHS 设置)。这对于 Xcode 12 选择主机的架构是必需的,而旧版本的 Xcode 默认也会这样做。

  • 在 CMake 3.18.0 中,add_test() 命令新增了支持测试名称中的特殊字符的功能。此功能在发行说明中被意外遗漏。不幸的是,此修复破坏了先前为了规避限制而使用手动引用或转义的现有项目。此修复已在 3.18.1 中回滚,但可能在未来版本的 CMake 中重新引入,并带有兼容性策略。

3.18.2

  • CMAKE_AUTOMOC_PATH_PREFIX 的默认值已更改为 OFF,因为此功能可能会破坏具有不同包含目录中同名头文件的现有项目。这恢复了与 CMake 3.15 及更早版本的兼容性。默认值在 3.16.9 和 3.17.5 中也已更改为 OFF

  • 编译特性 功能已针对 MSVC 19.27 进行了更新,如上所述(c_restrict)。

3.18.3

  • 编译特性 功能已针对 MSVC 19.28 进行了更新,如上所述(c_static_assert)。