CMake 3.11 发行说明

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

新功能

平台

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

生成器

命令

变量

特性

模块

  • 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 模块学会了支持 FLAME blislibflame

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

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

  • GenerateExportHeader 模块 GENERATE_EXPORT_HEADER 命令获得了 INCLUDE_GUARD_NAME 选项来更改写入生成的导出标头的包含保护符号的名称。此外,它现在在生成的导出标头的 include guard 上的结束 #endif 之后添加注释。

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

自动生成器

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

C测试

  • ctest_start() 命令不再设置 CTEST_RUN_CURRENT_SCRIPT,因为如果从函数内部调用它,则会出现范围问题。相反,它在 CTest 中设置了一个内部变量。但是,在全局范围内将 CTEST_RUN_CURRENT_SCRIPT 设置为 0 仍然会阻止脚本在最后重新运行。

包装

其他

  • 别名目标 现在可以将使用 GLOBAL 选项创建的 Imported Targets 别名为 :command:`add_library

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

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

弃用和删除的功能

  • 为策略“CMP0037”到“CMP0054”添加了明确的弃用诊断(“CMP0036”及以下已弃用)。 cmake-policies(7) 手册解释说所有策略的旧行为都已弃用,项目应该移植到新行为。

  • KDevelop3 生成器已被删除。

其他变化

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

  • FindOpenGL 模块现在更喜欢 GLVND 库(如果可用)。请参阅政策:policy: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”驱动器损坏,这已被恢复。