CMake 3.16 发行说明

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

新特性

语言

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

编译器

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

平台

  • 在 AIX 上,使用 ENABLE_EXPORTS 目标属性的可执行文件现在除了可执行文件之外,还会生成一个扩展名为 .imp 的链接器导入文件。使用 add_library()MODULE 选项创建的插件,使用 target_link_libraries() 链接到可执行文件以获取其符号的插件,现在使用导入文件进行链接。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 程序。

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

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

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

  • Qt 压缩帮助文件现在命名为 CMake.qch,其中不再包含文件名中的发行版本。当 CMake 就地升级时,此文件的名称和位置将保持不变。诸如 IDE、帮助查看器等工具现在应该能够在固定的位置引用此文件,该位置在 CMake 升级过程中保持有效。

  • RPATH 条目在用于安装的生成的 CMake 脚本中被正确转义。请参阅策略 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

  • 现在,如果未设置 OBJCOBJCXX 环境变量,则 Objective C 或 C++ 编译器的选择现在会考虑 CCCXX 环境变量。

  • FindPkgConfig 模块现在将以 -isystem 为前缀的包含目录提取到 *_INCLUDE_DIRS 变量和 INTERFACE_INCLUDE_DIRECTORIES 目标属性中。以前,它们会被放置在 *_CFLAGS_OTHER 变量和 INTERFACE_COMPILE_OPTIONS 目标属性中。

3.16.9

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