CMake 3.11 版本说明

自 CMake 3.10 起进行的更改包括以下内容。

新功能

平台

  • TI C/C++ 编译器现已由 Ninja 生成器支持。

生成器

命令

变量

属性

模块

  • CheckIncludeFiles 模块的 check_include_files() 命令新增了 LANGUAGE 选项,用于指定使用 CCXX 编译器进行检查。

  • CMakePackageConfigHelpers 模块的 write_basic_package_version_file() 命令的 COMPATIBILITY 参数新增了 SameMinorVersion 模式。

  • ExternalProject 模块已学会替换注释、命令、工作目录和副产品中的 <DOWNLOAD_DIR>

  • ExternalProject 模块新增了 NETRCNETRC_FILE 选项,用于指定使用 .netrc 文件。

  • 新增了 FetchContent 模块,该模块支持在配置时使用 ExternalProject_Add() 支持的任何下载/更新方法来填充内容。这允许内容在配置阶段立即使用,例如与 add_subdirectory() 等一起使用。它充分支持分层项目结构,允许父项目覆盖子项目的详细内容,并确保整个项目树中的内容不会被重复填充。

  • FindBLASFindLAPACK 模块已学会支持 FLAMEblislibflame

  • FindDoxygen 模块的 doxygen_add_docs() 命令现在支持一个新的 DOXYGEN_VERBATIM_VARS 列表变量。该列表中的任何 DOXYGEN_... 变量都将绕过自动引用逻辑,在将其传输到输出 Doxyfile 时保持其内容不变。

  • 添加了 FindIconv 模块来定位 iconv 支持。

  • GenerateExportHeader 模块的 generate_export_header 命令新增了 INCLUDE_GUARD_NAME 选项,用于更改生成导出头文件时写入的包含保护符号的名称。此外,它现在会在生成导出头文件的包含保护的末尾添加一个注释。

  • UseJava 模块的 add_jar 命令新增了 GENERATE_NATIVE_HEADERS 选项,用于使用 javac -h(适用于 1.8 及以上版本)生成本机头文件。这取代了 create_javah,因为 JEP 313 移除了 javah 工具,该工具不再适用于 JDK 1.10 及以上版本。

Autogen

  • 在使用 AUTOMOCAUTOUIC 时,CMake 现在启动多个并行的 mocuic 进程以缩短构建时间。新增了 CMAKE_AUTOGEN_PARALLEL 变量和 AUTOGEN_PARALLEL 目标属性,用于指定要启动的并行 mocuic 进程的数量。默认值是从主机上的 CPU 数量派生的。

CTest

  • ctest_start() 命令不再设置 CTEST_RUN_CURRENT_SCRIPT,因为如果该命令从函数内部调用,会存在作用域问题。相反,它在 CTest 中设置了一个内部变量。但是,在全局作用域将 CTEST_RUN_CURRENT_SCRIPT 设置为 0 仍然可以阻止脚本在末尾被重新运行。

CPack

其他

  • 现在 别名目标 可以别名使用 GLOBAL 选项创建的(与 add_library() 一起)导入目标

  • 现在可以为 接口库 设置自定义属性,前提是这些属性以一下划线(_)或小写 ASCII 字符开头。最初的意图是只允许对 INTERFACE 库有意义的属性,但这同时也阻止了自定义属性的使用。

  • 添加了 cmake(1)--open <dir> 命令行选项,用于打开生成的 IDE 项目,如 Visual Studio 解决方案或 Xcode 项目。

已弃用和已删除的特性

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

  • 移除了 KDevelop3 生成器。

其他更改

  • 策略 CMP0037 不再保留与可选功能(如 testpackage)关联的目标名称,除非启用了相应的功能。

  • FindOpenGL 模块现在优先使用 GLVND 库(如果可用)。请参阅策略 CMP0072

  • CMAKE_OSX_DEPLOYMENT_TARGET 变量中设置的最小部署目标,之前仅适用于 macOS,而不考虑选定的 SDK。现在它已正确设置为 CMAKE_OSX_SYSROOT 选择的目标平台。例如,如果 sysroot 变量指定了 iOS SDK,则 CMAKE_OSX_DEPLOYMENT_TARGET 中的值将被解释为最小 iOS 版本。

  • Xcode 生成器为每个 project() 命令生成一个项目文件的行为,现在可以通过 CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY 变量来控制。这对于加速大型项目的 CMake 生成步骤以及绕过 ZERO_CHECK 逻辑中的错误可能很有用。

  • 由于 CMakeCache.txt 格式不支持值中的换行符,包含换值现在在写入文件前被截断。此外,会在缓存文件中写入一个警告注释,并在控制台上向用户显示警告消息。

更新

自 CMake 3.11.0 起进行的更改包括以下内容。

3.11.1

  • 在 CMake 3.11.0 中,CheckIncludeFile 模块的 check_include_file() 命令、CheckIncludeFileCXX 模块的 check_include_file_cxx() 命令以及 CheckIncludeFiles 模块的 check_include_files() 命令被告知要遵守 CMAKE_REQUIRED_LIBRARIES 变量。由于现有项目的检查行为发生变化,此功能已被撤销。未来可能会通过一个兼容性策略来恢复。

3.11.2

  • 再次调用 add_library() 创建一个不可全局可见的导入目标的别名时,会再次引发错误,这与 3.11.0 之前的行为相同。此诊断因允许别名全局可见导入目标而意外地从 CMake 3.11.0 和 3.11.1 中移除。

  • FindQt4 模块的 qt4_wrap_cppqt4_wrap_uiqt4_add_resources 宏现在会在其生成的文件的 SKIP_AUTOMOCSKIP_AUTOUIC 上进行设置。这些文件永远不需要被 moc 或 uic 处理,并且我们必须明确说明这一点,以考虑到策略 CMP0071

3.11.3

  • CMake 3.11.0 在通常会在 UNIX 上执行的代码路径中增加了对 Windows 上符号链接的支持。由于在 subst 驱动器上的破坏,此功能已被撤销。