CMake 3.10 发行说明¶
自 CMake 3.9 以来所做的更改包括以下内容。
新功能¶
平台¶
现在支持 flang Fortran 编译器,编译器 ID 为
Flang。为“Midipix”添加了一个新的最小平台文件。
添加了对 MSVC ARM64 架构的支持。 Visual Studio 2017 Update 4 及更高版本提供了 ARM64 工具链。
改进了对 IAR ARM 编译器的支持。
生成器¶
Makefile 生成器 和
Ninja生成器学会了添加编译器启动器工具,如 ccache 以及用于CUDA语言(C和CXX的编译器)以前支持)。有关详细信息,请参阅CMAKE_<LANG>_COMPILER_LAUNCHER变量和<LANG>_COMPILER_LAUNCHER目标属性。CodeBlocksextra 生成器学会了有选择地从生成的项目中排除项目根目录之外的文件。请参阅CMAKE_CODEBLOCKS_EXCLUDE_EXTERNAL_FILES变量。
命令¶
cmake_host_system_information()命令学习了更多密钥以获取有关处理器功能和主机操作系统版本的信息。configure_file()命令学会了支持缩进的``# cmakedefine`` 和``# cmakedefine01``。#字符和cmakedefine/cmakedefine01之间的空格和/或制表符现在可以理解并保留在输出中。execute_process()命令获得了一个RESULTS_VARIABLE选项,用于在给出多个COMMAND参数时收集进程管道中所有子进程的结果列表。include_guard()命令的引入是为了防止 CMake 脚本被多次包含。该命令支持DIRECTORY和GLOBAL选项来调整相应的包含保护范围。如果没有给出选项,则包含 guard 类似于基本的基于变量的检查。string()命令学习了一个新的PREPEND子命令。string(TIMESTAMP)命令现在支持完整工作日名称的 %A` 和完整月份名称的 %B``。
变量¶
添加了
CMAKE_DIRECTORY_LABELS变量以指定目录中所有测试的标签。
特性¶
<LANG>_CPPCHECK目标属性和支持CMAKE_<LANG>_CPPCHECK变量被引入来告诉 Makefile 生成器 和Ninja生成器运行 `` cppcheck`` 与``C`` 和``CXX`` 语言的编译器。添加了
LABELS目录属性以指定目录中所有目标和测试的标签。添加了
TEST_INCLUDE_FILES目录属性,以列出在使用ctest(1)运行测试时要包含的任意数量的文件。这概括了TEST_INCLUDE_FILE属性。添加了
VS_DOTNET_REFERENCEPROP_<refname>_TAG_<tagname>目标属性以支持 C# 目标中引用程序集的自定义 XML 标记。添加了源文件属性
VS_SHADER_OUTPUT_HEADER_FILE和VS_SHADER_VARIABLE_NAME以使用 Visual Studio Generators 指定 `.hlsl`` 源的更多细节。
模块¶
FindCurses模块获得了一个CURSES_NEED_WIDE选项来请求宽字符变体。FindEXPAT模块现在提供导入的目标。FindFreetype模块现在提供导入的目标。FindMPI获得了许多新功能,包括:特定于语言的组件已添加到模块中。
现在支持更多的 MPI 环境。
改进了对 Fortran 的环境支持。
用户现在可以细粒度地控制 MPI 选择过程,包括将自定义参数传递给 MPI 编译器。
已实施的 MPI 标准的版本现已公开。
现在可以检测 MPI-2 C++ 绑定,如果需要也可以抑制。
现在正在检测和验证可用的 Fortran 绑定。
可以请求各种 MPI-3 信息,包括各个绑定的库版本和 Fortran 功能。
支持静态链接的 MPI 实现。
添加了一个
FindOpenACC模块来检测编译器对 OpenACC 的支持。目前仅支持 PGI、GNU 和 Cray 编译器。FindOpenGL模块在 Linux 上获得了对 GLVND 的支持。FindOpenMP 模块获得了对特定语言组件的支持。
添加了
FindPatch模块以查找patch命令行可执行文件。FindProtobuf模块protobuf_generate_cpp()命令获得了一个DESCRIPTORS选项来生成描述符文件。GoogleTest模块获得了一个新命令gtest_discover_tests()实现动态(构建时)测试发现。与源解析方法不同,动态发现在构建时执行测试(以“列出可用测试”模式)以发现测试。这对于不寻常的标记测试方式非常稳健,为参数化测试等高级功能提供了更好的支持,并且不需要重新运行 CMake 来发现测试可执行文件中添加或删除的测试。请注意,在 CMake 3.10.3 中进行了一项重大更改,以解决TIMEOUT关键字的歧义(请参阅:ref:发行说明 3.10.3)。InstallRequiredSystemLibraries模块获得了对安装英特尔编译器运行时的支持。
自动生成器¶
将
AUTOMOC或AUTOUIC与多配置生成器(例如:generator:Xcode)一起使用时,包括*.moc、moc_*.cpp和 `` ui_*.h`` 文件在``<AUTOGEN_BUILD_DIR>/include_<CONFIG>`` 而不是``<AUTOGEN_BUILD_DIR>/include`` 中生成。使用
AUTOMOC或AUTOUIC时,也会处理GENERATED的源文件。在早期版本中,它们被AUTOMOC和AUTOUIC忽略了。请参阅政策:policy:CMP0071。使用
AUTOMOC时,CMake 在源文件中搜索字符串``Q_OBJECT``、Q_GADGET或``Q_NAMESPACE`` 以确定是否需要对其进行``moc`` 处理。新的CMAKE_AUTOMOC_MACRO_NAMES变量和AUTOMOC_MACRO_NAMES目标属性可以设置为注册要搜索的其他字符串(宏名称)。使用
AUTOMOC时,新的CMAKE_AUTOMOC_COMPILER_PREDEFINES变量和AUTOMOC_COMPILER_PREDEFINES目标属性指定是启用还是禁用编译器预定义文件``moc_predefs.h`` 的生成。
C测试¶
CTEST_LABELS_FOR_SUBPROJECTSCTest 模块变量和 CTest 脚本变量被添加以指定应被 CDash 视为子项目的标签列表。要在 CTest 模块和 ctest 命令行 仪表板客户端 模式(例如ctest -S)中使用此值,请在CTestConfig.cmake配置文件中设置它。
包装¶
为 FreeBSD
pkg(8)添加了一个CPack FreeBSD Generator。CPack DEB 生成器在 Windows 上启用。虽然功能不全(由于缺少外部 UNIX 工具),但这将允许构建基本的跨平台 Debian 软件包。CPack DEB Generator学会了在Version信息属性中设置包发布版本。请参阅CPACK_DEBIAN_PACKAGE_RELEASE变量。CPack DEB Generator学会了更严格的符合 Debian 规则的包版本检查。CPackIFW模块cpack_ifw_configure_component()和cpack_ifw_configure_component_group()命令获得了新的REPLACES和CHECKABLE选项。CPack IFW Generator获得了新的CPACK_IFW_PACKAGE_FILE_EXTENSION变量来自定义目标二进制格式。CPack IFW Generator获得了新的CPACK_IFW_REPOSITORIES_DIRECTORIES变量来指定将用于解析和重新打包依赖组件的其他存储库目录。此功能仅在使用 QtIFW 3.1 或更高版本时可用。CPack RPM Generator和CPack DEB Generator学会了设置包纪元版本。请参阅CPACK_RPM_PACKAGE_EPOCH和CPACK_DEBIAN_PACKAGE_EPOCH变量。
其他¶
cmake(1)-E模式获得了对sha1sum、sha224sum、sha256sum、sha384sum和sha512sum的支持.graphviz 输出现在区分不同的依赖类型“PUBLIC”、“PRIVATE”和“INTERFACE”,并在输出图中将它们表示为实线、虚线和点线边缘。
弃用和删除的功能¶
不再支持使用 C++98 编译器构建 CMake 本身。 CMake 现在使用 C++11 实现。
在 HP-UX 上构建 CMake 的支持已被删除,等待更好地支持 C++11 和 libuv 端口。请参阅`CMake 问题 17137`_。使用 CMake 3.9 或更低版本来支持 HP-UX。
其他变化¶
在 FreeBSD 上,名为“c++”的 C++ 编译器现在是首选的默认编译器。
file(GENERATE)命令现在解释相对于调用者的当前二进制文件和源目录分别赋予其OUTPUT和INPUT参数的相对路径。请参阅政策:policy:CMP0070。get_filename_component()PROGRAM模式语义已被修改为不允许在程序路径中出现未加引号的空格,同时也接受参数。虽然在技术上与旧行为不兼容,但预计在具有正确引用的命令行的典型用例下的行为不会改变。
更新¶
自 CMake 3.10.0 以来所做的更改包括以下内容。
3.10.1¶
cmake-server(7)codemodel响应crossReferences由 3.10.0 添加的字段由于内存使用过多而被删除。将需要另一种方法来提供回溯信息。
3.10.3¶
CMake 3.10.1 在 GoogleTest 模块中的 gtest_discover_tests 添加了一个 TIMEOUT 选项。该关键字与
TIMEOUT测试属性冲突,后者是使用命令的PROPERTIES关键字设置的常见属性之一,通常会导致合法但意外的行为。在 CMake 3.10.3 中将关键字更改为“DISCOVERY_TIMEOUT”以解决此问题。gtest_discover_tests()命令的TIMEOUT关键字在 3.10.1 和 3.10.2 中的不明确行为尚未保留。