CMake 3.13 发布说明

自 CMake 3.12 起所做的更改包括以下内容。

新功能

生成器

命令行

  • cmake(1) 命令获得了 -S <source_dir> 命令行选项来指定源目录的位置。此选项可独立于 -B 使用。请参阅 cmake(1)

  • cmake(1) 命令获得了 -B <build_dir> 命令行选项来指定构建目录的位置。此选项可独立于 -S 使用。请参阅 cmake(1)

  • cmake(1) -E create_symlink 命令现在可以在 Windows 上使用。请参阅 cmake(1)

命令

  • add_custom_command()add_custom_target() 命令学会了支持 WORKING_DIRECTORY 选项中的生成器表达式。请参阅 add_custom_command()add_custom_target()

  • 创建了 add_link_options() 命令以在当前目录中添加链接选项。请参阅 add_link_options()

  • install(TARGETS) 命令学会了安装在当前目录之外创建的目标。请参阅 install(TARGETS)

  • link_directories() 命令增加了控制插入位置的选项。请参阅 link_directories()

  • list(SORT) 命令增加了控制用于对条目进行排序的比较操作的选项。请参阅 list(SORT)

  • math() 命令增加了十六进制的选项。请参阅 math()

  • 创建了 target_link_directories() 命令来为目标及其依赖项指定链接目录。请参阅 target_link_directories()

  • 创建了 target_link_options() 命令来为目标及其依赖项指定链接选项。请参阅 target_link_options()

  • target_link_libraries() 命令现在可以被调用来修改在当前目录之外创建的目标。请参阅策略 CMP0079。请参阅 target_link_libraries()

变量

属性

模块

  • FindBoost 模块增加了一个 Boost_ARCHITECTURE 选项,用于指定特定于 Boost 架构的库文件名片段。

  • FindCURL 模块学会了分别查找调试和发布变体。

  • FindMatlab 模块增加了新的组件 ENGINE_LIBRARYDATAARRAY_LIBRARY,分别用于请求查找 Matlab C++ Engine 和 DataArray 库。

  • FindMatlab 模块现在显式地在 Visual Studio 中导出 mexFunction。

  • FindMatlab 模块增加了一个新的 MCC_COMPILER 组件,用于请求查找 Matlab Compiler 插件。

  • FindPkgConfig 模块增加了一个选项,用于在全局范围内创建导入的目标。

  • FindPkgConfig 模块增加了对版本检查中的 <> 运算符的支持,以及已经支持的运算符 >=<==

  • FindPython3FindPython2FindPython 模块增加了控制 macOS (Framework) 和 Windows (Registry) 上资源查找顺序的能力。

  • FindSubversion 模块的 Subversion_WC_INFO 命令增加了 IGNORE_SVN_FAILURE 选项,以抑制失败,例如当源树不受 Subversion 控制时。

  • UseSWIG 模块学会了为 SWIG 编译管理 INCLUDE_DIRECTORIES 目标属性。

CTest

  • ctest(1) 命令增加了 --progress 选项,用于在输出到终端时启用实时测试进度摘要。请参阅 ctest(1)

CPack

  • CPack DEB Generator 模块在设置 CPACK_DEBIAN_DEBUGINFO_PACKAGE 时,学会了将调试符号拆分到相应的 .ddeb 包中。

  • CPack DEB Generator 模块在打包文件时,学会了尊重 SOURCE_DATE_EPOCH 环境变量。这对于生成可重现的包很有用。

  • CPack 增加了一个新的 CPack External Generator,用于以其他软件可以理解的格式导出 CPack 元数据。该生成器的目的是允许外部打包软件在无法完成整个打包过程时利用 CPack 的功能。

已弃用和已删除的功能

  • 为策略 CMP0055CMP0063CMP0054 及更早的策略已弃用)添加了明确的弃用诊断。 cmake-policies(7) 手册解释了所有策略的 OLD 行为已被弃用,项目应迁移到 NEW 行为。

其他更改

  • cmake.org 上提供的预编译二进制文件现在包含 qthelp 格式的文档。

  • option() 命令现在会优先考虑同名的现有普通变量,而不会创建缓存条目(或设置其类型)并删除普通变量。请参阅策略 CMP0077。请参阅 option()

  • Makefile 生成器 学会了在 make clean 过程中移除自定义命令和自定义目标的副产品。

  • target_sources() 命令现在将相对源文件路径解释为相对于当前源目录。这简化了从子目录中逐步构建目标源的过程。添加了 CMP0076 策略以提供与旧行为的向后兼容性,以防需要。请参阅 target_sources()

  • BundleUtilities 模块不再允许在配置时包含。这总之是一个错误。请参阅策略 CMP0080

  • UseSWIG 模块已更改其目标命名策略。请参阅策略 CMP0078

  • LINK_DIRECTORIES 目标属性现在期望绝对路径。请参阅策略 CMP0081

  • CPack 生成器已移至文档的独立部分,而不是将其文档保留在其内部实现模块中。这些内部实现模块现在也不再可供可能错误地包含它们的脚本使用,因为它们本就不应可用。

更新

自 CMake 3.13.0 起所做的更改包括以下内容。

3.13.2

  • CMake 3.13.0 包含一项更改,将编译器隐式包含目录传递给 AUTOMOC 工具。此更改已被撤销,因为它导致现有构建出现回归,需要在后续版本中重新引入。

3.13.3

  • 已修复 Visual Studio 15 2017 生成器,使其在安装 VS 2019 时也能正常工作。

  • CMake 现在会检查运行 CMake 时是否指定了至少一个源目录或二进制目录,并在两者都缺失时发出错误。这始终是文档的要求,但之前的实现意外地接受了两者均未指定但提供了其他参数的情况,并默默地将当前工作目录用作源和构建树。

3.13.4

  • 3.13.3 添加的关于未指定源目录或二进制目录的错误已降级为警告。虽然这从未是预期、文档化或支持的行为,但一些项目依赖于它。在 3.13.x 系列的剩余版本中,错误已降级为警告,以便允许过渡期,但在后续版本中可能会再次成为致命错误。依赖于旧行为的脚本可以通过显式指定源树路径(即使只是 .)来轻松修复,并继续与所有 CMake 版本兼容。

3.13.5

  • 在 CMake 3.13.0 到 3.13.4 版本中,调用 target_link_libraries() 来向在另一个目录中创建的静态库添加 PRIVATE 依赖项(在策略 CMP0079 NEW 行为下)会错误地将这些依赖项的使用要求传播给链接该静态库的依赖项。此问题已修复。