CMake 3.11 发行说明

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

新特性

平台

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

生成器

命令

变量

属性

模块

  • 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 选项,用于更改写入生成的导出头文件的 include guard 符号的名称。 此外,它现在在生成的导出头文件的 include guard 的结尾 #endif 上添加注释。

  • UseJava 模块 add_jar 命令获得了 GENERATE_NATIVE_HEADERS 选项,用于为 1.8 或更高版本的 javac 使用 javac -h 生成原生头文件。 这取代了 create_javah,由于 JEP 313 移除了 javah 工具,create_javah 不再适用于 JDK 1.10 及更高版本。

Autogen

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

CTest

CPack

其他

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

  • 接口库 现在可以在其上设置自定义属性,如果它们以下划线 (_) 或小写 ASCII 字符开头。 最初的意图是仅允许对 INTERFACE 库有意义的属性,但它也阻止了自定义属性的使用。

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

已弃用和移除的特性

  • 为策略 CMP0037CMP0054 添加了显式弃用诊断信息(CMP0036 及以下版本已弃用)。cmake-policies(7) 手册解释说,所有策略的旧行为都已被弃用,项目应移植到新行为。

  • 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 引入了对 Windows 上代码路径中解析符号链接的支持,这些代码路径通常在 UNIX 上执行此操作。由于 subst 驱动器上的崩溃,此更改已被还原。