CMake 3.16 发行说明

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

新功能

语言

  • CMake 支持 Objective C (OBJC) 和 Objective C++ (OBJCXX) 语言。可以通过 project()enable_language() 命令启用它们。当启用 OBJCOBJCXX 时,扩展名为 .m.mm 的源文件将分别被编译为 Objective C 或 C++。否则,它们将被视为普通的 C++ 源文件,就像之前一样。

编译器

  • Solaris 上现在支持 Clang 编译器。

平台

  • 在 AIX 上,使用 ENABLE_EXPORTS 目标属性的可执行文件现在除了可执行文件外,还会生成一个扩展名为 .imp 的链接器导入文件。使用 target_link_libraries() 将可执行文件链接到其符号的插件(通过 add_library() 使用 MODULE 选项创建)现在使用导入文件进行链接。install(TARGETS) 命令现在将导入文件作为 ARCHIVE 构件进行安装。

  • 在 AIX 上,运行时链接不再是默认启用的。CMake 为链接器提供了足够的信息以提前解析所有符号。可以通过将 -Wl,-G 添加到链接标志(例如,在 CMAKE_SHARED_LINKER_FLAGSCMAKE_MODULE_LINKER_FLAGS 变量中)来手动启用共享库和/或可加载模块的运行时链接。可以通过将 -Wl,-brtl 添加到链接标志(例如,在 CMAKE_EXE_LINKER_FLAGS 变量中)来手动启用可执行文件的运行时链接。

命令行

  • cmake(1) -E 现在支持 truefalse 命令,它们不执行任何操作,但分别返回退出代码 0 和 1。

  • cmake(1) 增加了 --trace-redirect=<file> 命令行选项,该选项可用于将 --trace 输出重定向到文件而不是 stderr

  • 命令行选项 cmake(1) --loglevel 已重命名为 --log-level,以使其与其他命令行选项保持一致。为保持向后兼容性,仍然支持 --loglevel 选项。

命令

变量

属性

模块

Autogen

  • 在使用 AUTOMOC 时,新的变量 CMAKE_AUTOMOC_PATH_PREFIX 或目标属性 AUTOMOC_PATH_PREFIX 可被启用以生成 moc-p 路径前缀选项。这确保了 moc 输出文件在不同的构建设置下是相同的(假定 moc 编译的头文件位于 include directory 中)。同时,它也确保了当源目录和/或构建目录是符号链接时 moc 输出文件能够正确编译。

CTest

CPack

已弃用和已移除的功能

其他更改

  • cmake(1) -C <initial-cache> 选项现在使用 CMAKE_SOURCE_DIRCMAKE_BINARY_DIR 设置为顶级源和构建树来评估初始缓存脚本。

  • cmake(1) -E remove_directory 命令行工具,当提供指向目录的符号链接时,现在只删除该符号链接。它不再删除被链接目录的内容。

  • ctest(1) 命令行选项 --build-makeprogram 现在指定了在使用 Ninja 生成器或 Makefile 生成器 配置项目时使用的 make 程序。

  • 命令 ExternalProjectExternalProject_Add() 命令已更新,以便 GIT_SUBMODULES "" 不初始化任何子模块。请参阅策略 CMP0097

  • 模块 FindGTest 已更新,以识别 GTest 1.8.1 生成的 MSVC 构建树。

  • 命令 project() 不再剥离版本组件中的前导零。请参阅策略 CMP0096

  • Qt 压缩帮助文件的名称现为 CMake.qch,文件名中不再包含发行版本号。当 CMake 就地升级时,此文件的名称和位置将保持不变。像 IDE、帮助查看器等工具现在应该可以在一个固定的位置引用此文件,该位置在 CMake 升级后仍然有效。

  • 生成的用于安装的 CMake 脚本中的 RPATH 条目已正确转义。请参阅策略 CMP0095

  • 在 Windows 上使用 CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS 时,自动生成的导出项现在仅在提供符号的对象文件更新时才会更新。

更新

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

3.16.2

  • CMake 3.16.0 和 3.16.1 使用 AUTOMOC 处理了 .hh 文件。这是自 CMake 3.15 及更早版本以来的行为更改,可能会破坏现有项目,因此已在 3.16.2 中恢复。

3.16.5

  • 模块 FindPythonFindPython2FindPython3 不再为 Python{,2,3}_LIBRARY_RELEASEPython{,2,3}_LIBRARY_DEBUG 创建缓存条目。这些值总是从其他结果计算得出,因此不应缓存。这些条目由 CMake 3.16.0 到 3.16.4 创建,但它们总是 FORCE 设置的,用户无法对其进行有意义的编辑。

    此外,这些模块不再公开其内部 _Python* 缓存条目。CMake 3.16.0 到 3.16.4 意外地将其显示为高级缓存条目。

3.16.7

3.16.9

  • CMAKE_AUTOMOC_PATH_PREFIX 的默认值已更改为 OFF,因为此功能可能会破坏具有不同包含目录中同名头文件的现有项目。这恢复了与 CMake 3.15 及更低版本的兼容性。