CMake 3.13 发布说明¶
自 CMake 3.12 起所做的更改包括以下内容。
新功能¶
生成器¶
适用于 VS 2010 及更高版本的 Visual Studio 生成器 增加了对
INTERPROCEDURAL_OPTIMIZATION
目标属性和支持的CheckIPOSupported
模块的支持。Xcode
生成器学会了配置更多 Xcode Scheme 字段。请参阅CMAKE_XCODE_GENERATE_SCHEME
变量。Green Hills MULTI
生成器已更新通过
CMAKE_GENERATOR_PLATFORM
添加了对架构选择的支持:例如arm
、ppc
和86
。通过
CMAKE_GENERATOR_TOOLSET
添加了对工具集选择的支持,例如comp_201205
、comp_201510
、comp_201722_beta
。通过
GHS_TARGET_PLATFORM
添加了对平台选择的支持,例如integrity
、linux
、standalone
等。不再检查是否安装了基于
arm
的编译器,但确保gbuild.exe
正确存在。不再硬编码 ARM 文件、BSP、工具集或 OS 位置。
命令行¶
命令¶
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()
。
变量¶
添加了
CMAKE_AUTOGEN_VERBOSE
变量,以在 CMake 项目代码中选择性地增加AUTOMOC
、AUTOUIC
和AUTORCC
的详细程度。添加了
CMAKE_VS_GLOBALS
变量,用于在创建目标时初始化VS_GLOBAL_<variable>
目标属性。
属性¶
添加了
DEPLOYMENT_ADDITIONAL_FILES
目标属性,以告知Visual Studio 9 2008
生成器为部署到 WinCE 设备进行远程调试指定其他文件。创建了
INTERFACE_LINK_DEPENDS
目标属性,用于指定对文件的传递性链接依赖。LINK_DEPENDS
目标属性学会了支持生成器表达式
。请参阅LINK_DEPENDS
。添加了
LINK_DIRECTORIES
和INTERFACE_LINK_DIRECTORIES
目标属性,用于收集目标及其依赖项的链接目录。使用target_link_directories()
命令设置它们。添加了
LINK_OPTIONS
和INTERFACE_LINK_OPTIONS
目标属性,用于收集目标及其依赖项的链接选项。使用target_link_options()
命令设置它们。添加了
LINK_OPTIONS
目录属性,用于收集在当前目录下创建的目标的链接选项。使用add_link_options()
命令设置它。创建了
STATIC_LIBRARY_OPTIONS
目标属性,用于指定创建静态库时使用的归档器选项。创建了
VS_DEBUGGER_COMMAND_ARGUMENTS
目标属性,用于使用 Visual Studio 生成器 为 VS 2010 及更高版本设置调试命令行参数。创建了
VS_DEBUGGER_ENVIRONMENT
目标属性,用于使用 Visual Studio 生成器 为 VS 2010 及更高版本设置调试环境。VS_DEBUGGER_COMMAND
和VS_DEBUGGER_WORKING_DIRECTORY
目标属性现在支持生成器表达式。
模块¶
FindBoost
模块增加了一个Boost_ARCHITECTURE
选项,用于指定特定于 Boost 架构的库文件名片段。FindCURL
模块学会了分别查找调试和发布变体。FindMatlab
模块增加了新的组件ENGINE_LIBRARY
和DATAARRAY_LIBRARY
,分别用于请求查找 Matlab C++ Engine 和 DataArray 库。FindMatlab
模块现在显式地在 Visual Studio 中导出 mexFunction。FindMatlab
模块增加了一个新的MCC_COMPILER
组件,用于请求查找 Matlab Compiler 插件。FindPkgConfig
模块增加了一个选项,用于在全局范围内创建导入的目标。FindPkgConfig
模块增加了对版本检查中的<
和>
运算符的支持,以及已经支持的运算符>=
、<=
和=
。FindPython3
、FindPython2
和FindPython
模块增加了控制 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 的功能。
已弃用和已删除的功能¶
为策略
CMP0055
至CMP0063
(CMP0054
及更早的策略已弃用)添加了明确的弃用诊断。cmake-policies(7)
手册解释了所有策略的 OLD 行为已被弃用,项目应迁移到 NEW 行为。
其他更改¶
在
cmake.org
上提供的预编译二进制文件现在包含 qthelp 格式的文档。option()
命令现在会优先考虑同名的现有普通变量,而不会创建缓存条目(或设置其类型)并删除普通变量。请参阅策略CMP0077
。请参阅option()
。Makefile 生成器 学会了在
make clean
过程中移除自定义命令和自定义目标的副产品。target_sources()
命令现在将相对源文件路径解释为相对于当前源目录。这简化了从子目录中逐步构建目标源的过程。添加了CMP0076
策略以提供与旧行为的向后兼容性,以防需要。请参阅target_sources()
。BundleUtilities
模块不再允许在配置时包含。这总之是一个错误。请参阅策略CMP0080
。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
行为下)会错误地将这些依赖项的使用要求传播给链接该静态库的依赖项。此问题已修复。