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选项,用于更改写入到生成的导出头部的包含保护符号的名称。此外,它现在会在生成的导出头部的包含保护上添加一个关闭#endif后的注释。

  • UseJava 模块 add_jar 命令获得 GENERATE_NATIVE_HEADERS 选项,用于使用 javac -h(对于 javac 1.8 及以上版本)生成原生头文件。它取代 create_javah,后者不再适用于 JDK 1.10 及以上版本,由于 JEP 313 删除 javah 工具。

Autogen

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

CTest

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 驱动器故障而恢复。