CMake 3.11 发布说明

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

新功能

平台

  • TI C/C++ 编译器现在受 Ninja 生成器的支持。

生成器

命令

变量

属性

模块

  • CheckIncludeFiles 模块的 check_include_files() 命令获得了一个 LANGUAGE 选项,用于指定是使用 C 还是 CXX 编译器进行检查。

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

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

  • ExternalProject 模块获得了 NETRCNETRC_FILE 选项,用于指定 .netrc 文件的使用。

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

  • FindBLASFindLAPACK 模块学会了支持 FLAME blislibflame

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

  • 添加了一个 FindIconv 模块来查找 iconv 支持。

  • GenerateExportHeader 模块的 generate_export_header 命令获得了一个 INCLUDE_GUARD_NAME 选项,用于更改生成导出头文件中包含保护符号的名称。此外,它现在会在生成导出头文件包含保护的结束 #endif 之后添加一个注释。

  • UseJava 模块的 add_jar 命令获得了一个 GENERATE_NATIVE_HEADERS 选项,用于使用 javac -hjavac 1.8 或更高版本生成原生头文件。这取代了 create_javah,因为 javah 工具已从 JDK 1.10 及更高版本中移除(JEP 313)。

自动生成

  • 在使用 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

  • CheckIncludeFile 模块的 check_include_file() 命令、CheckIncludeFileCXX 模块的 check_include_file_cxx() 命令以及 CheckIncludeFiles 模块的 check_include_files() 命令在 CMake 3.11.0 中被赋予了遵守 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 驱动器上的中断,此功能已被撤销。