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
目标属性。CodeBlocks
额外生成器学会了选择性地从生成的项目中排除项目根目录之外的文件。请参阅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
选项来调整相应的包含保护范围。如果没有给出选项,则包含保护类似于基本的基于变量的检查。string()
命令学习了一个新的PREPEND
子命令。string(TIMESTAMP)
命令现在支持%A
表示完整的工作日名称,%B
表示完整的月份名称。
变量¶
添加了
CMAKE_DIRECTORY_LABELS
变量,用于为目录中的所有测试指定标签。
属性¶
引入了
<LANG>_CPPCHECK
目标属性和支持的CMAKE_<LANG>_CPPCHECK
变量,以告知 Makefile 生成器 和Ninja
生成器使用C
和CXX
语言的编译器运行cppcheck
。添加了
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 生成器 指定.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
关键字的歧义(请参阅 3.10.3)。InstallRequiredSystemLibraries
模块获得了对安装 Intel 编译器运行时的支持。
Autogen¶
当使用
AUTOMOC
或AUTOUIC
与多配置生成器(例如Xcode
)时,包含的*.moc
、moc_*.cpp
和ui_*.h
文件在<AUTOGEN_BUILD_DIR>/include_<CONFIG>
而不是<AUTOGEN_BUILD_DIR>/include
中生成。当使用
AUTOMOC
或AUTOUIC
时,GENERATED
的源文件也将被处理。早期版本中的AUTOMOC
和AUTOUIC
忽略了它们。请参阅策略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
的生成。
CTest¶
添加了
CTEST_LABELS_FOR_SUBPROJECTS
CTest 模块变量和 CTest 脚本变量,用于指定应被 CDash 视为子项目的标签列表。要在 CTest 模块和 ctest 命令行 Dashboard Client 模式(例如ctest -S
)中使用此值,请在CTestConfig.cmake
配置文件中设置它。
CPack¶
为 FreeBSD
pkg(8)
添加了CPack FreeBSD 生成器
。在 Windows 上启用了
CPack DEB 生成器
。虽然功能不完全(由于缺少外部 UNIX 工具),但这将允许构建基本的跨平台 Debian 软件包。CPack DEB 生成器
学会了在Version
信息属性中设置软件包发行版本。请参阅CPACK_DEBIAN_PACKAGE_RELEASE
变量。CPack DEB 生成器
学会了更严格的软件包版本检查,该检查符合 Debian 规则。CPackIFW
模块cpack_ifw_configure_component()
和cpack_ifw_configure_component_group()
命令获得了新的REPLACES
和CHECKABLE
选项。CPack IFW 生成器
获得了新的CPACK_IFW_PACKAGE_FILE_EXTENSION
变量,用于自定义目标二进制格式。CPack IFW 生成器
获得了新的CPACK_IFW_REPOSITORIES_DIRECTORIES
变量,用于指定将用于解析和重新打包依赖组件的其他存储库目录。此功能仅在使用 QtIFW 3.1 或更高版本时可用。CPack RPM 生成器
和CPack DEB 生成器
学会了设置软件包 epoch 版本。请参阅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 Issue 17137。对于 HP-UX 支持,请改用 CMake 3.9 或更低版本。
其他更改¶
在 FreeBSD 上,名为
c++
的 C++ 编译器现在是首选默认编译器。file(GENERATE)
命令现在相对于调用者的当前二进制目录和源目录分别解释传递给其OUTPUT
和INPUT
参数的相对路径。请参阅策略CMP0070
。get_filename_component()
PROGRAM
模式语义已修订为不容忍程序路径中未加引号的空格,同时接受参数。虽然在技术上与旧行为不兼容,但预计在使用正确引号的命令行的一般用例下的行为没有改变。
更新¶
自 CMake 3.10.0 以来的更改包括以下内容。
3.10.1¶
CMake 3.10.0 添加的
cmake-server(7)
codemodel
响应交叉引用字段已删除,原因是内存使用过多。将需要另一种方法来提供回溯信息。
3.10.3¶
CMake 3.10.1 为来自
GoogleTest
模块的gtest_discover_tests()
添加了TIMEOUT
选项。该关键字与TIMEOUT
测试属性冲突,后者是通常会使用命令的PROPERTIES
关键字设置的常见属性之一,通常会导致合法但意外的行为。在 CMake 3.10.3 中,该关键字已更改为DISCOVERY_TIMEOUT
以解决此问题。CMake 3.10.1 和 3.10.2 中gtest_discover_tests()
命令的TIMEOUT
关键字的歧义行为未被保留。