CMake 3.10 发行说明¶
自 CMake 3.9 以来做出的更改包括以下内容。
新增功能¶
平台¶
现已支持 flang Fortran 编译器,编译器 ID 为
Flang
。已添加
Midipix
的新的最小平台文件。已添加对 MSVC ARM64 架构的支持。Visual Studio 2017 Update 4 及以上版本提供了 ARM64 工具链。
对 IAR ARM 编译器的支持已经得到改善。
生成器¶
Makefile 生成器 和
Ninja
生成器已经学会针对CUDA
语言(之前支持C
和CXX
)添加 ccache 之类的编译器启动工具以及编译器。请参阅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 -S
)中使用此值,在CTestConfig.cmake
配置文件中进行设置。
CPack¶
为 FreeBSD
pkg(8)
添加了一个CPack FreeBSD Generator
。CPack DEB Generator
已在 Windows 上启用。虽然尚未完全具有特色功能(由于缺少外部 UNIX 工具),但此功能将允许构建基本的跨平台 Debian 软件包。CPack DEB Generator
学会了在Version
信息属性中设置软件包发布版本。请参阅CPACK_DEBIAN_PACKAGE_RELEASE
变量。学会了更加严格的包版本检查,该检查与 Debian 规则相符。
CPack DEB Generator
模块
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 本身。现使用 C++11 实现 CMake。
放弃在 HP-UX 上构建 CMake,直到 C++11 和 libuv 端口获得更好的支持。请参见 CMake 问题 17137。请改用 CMake 3.9 或更低版本以支持 HP-UX。
其他更改¶
在 FreeBSD 上,C++ 编译器命名为
c++
现在是首选默认值。file(GENERATE)
命令现在相对于调用方的当前二进制和源目录解释提供给其OUTPUT
和INPUT
参数的相对路径。请参见策略CMP0070
。get_filename_component()
PROGRAM
模式语义已经过修订,在接受参数的同时不容忍程序路径中出现未加引号的空格。虽然技术上与旧行为不兼容,但预计采用带引号正确命令行的典型用例下的行为未发生变化。
更新¶
自 CMake 3.10.0 以来所做的变更包括以下内容。
3.10.1¶
cmake-server(7)
codemodel
响应交叉引用字段(由 3.10.0 添加)现已废除,原因是内存使用过多。需要采用其他方法来提供回溯信息。
3.10.3¶
CMake 3.10.1 添加了一个
TIMEOUT
选项到gtest_discover_tests()
中,该选项来自GoogleTest
模块。该关键字与TIMEOUT
测试属性冲突,该属性是使用命令的PROPERTIES
关键字设置的常见属性之一,这通常会导致合法但非预期的行为。在 CMake 3.10.3 中,该关键字被更改为DISCOVERY_TIMEOUT
,以解决此问题。3.10.1 和 3.10.2 中gtest_discover_tests()
命令的TIMEOUT
关键字的不明确行为尚未保留。