CMake 3.18 发行说明¶
自 CMake 3.17 以来的更改包括以下内容。
新功能¶
语言¶
现在可以在非 Windows 平台上的 Clang 编译器中使用
CUDA语言进行编译。可分离编译在任何平台上尚不支持。
命令行¶
命令¶
add_library()和add_executable()命令支持创建引用非GLOBAL导入目标 的 别名目标。新增了
cmake_language()命令,用于对脚本化或内置命令进行元操作,包括一个用于CALL其他命令的模式,以及用于就地评估 CMake 脚本的EVAL CODE。execute_process()命令新增了ECHO_OUTPUT_VARIABLE和ECHO_ERROR_VARIABLE选项。export()命令现在如果在未指定APPEND的情况下多次使用相同的FILE,会引发错误。请参见策略CMP0103。file()命令新增了ARCHIVE_CREATE和ARCHIVE_EXTRACT子命令,以将cmake(1)的-E tar功能暴露给 CMake 脚本代码。创建了
file(CONFIGURE)子命令,以复制configure_file()的功能,而无需依赖磁盘上已有的文件作为输入。内容而是通过字符串传递。file(UPLOAD)命令新增了TLS_VERIFY和TLS_CAINFO选项,用于控制服务器证书验证。find_program()、find_library()、find_path()和find_file()命令新增了REQUIRED选项,如果找不到任何内容,则会停止处理并显示错误消息。带有
SOURCE范围的get_property()命令新增了DIRECTORY和TARGET_DIRECTORY选项,用于从提供的目录范围获取属性。get_source_file_property()命令新增了DIRECTORY和TARGET_DIRECTORY选项,用于从提供的目录范围获取属性。list()命令的SORT操作新增了NATURAL排序选项,用于使用自然顺序排序(请参见strverscmp(3)手册)。带有
SOURCE范围的set_property()命令新增了DIRECTORY和TARGET_DIRECTORY选项,用于在提供的目录范围设置属性。set_source_files_properties()命令新增了DIRECTORY和TARGET_DIRECTORY选项,用于在提供的目录范围设置属性。string()命令新增了HEX子命令,用于将字符串转换为其十六进制表示。
变量¶
新增了
CMAKE_CUDA_ARCHITECTURES变量,用于指定 CUDA 输出架构。鼓励用户使用此变量,而不是手动指定选项,因为这种方法与编译器无关。当CMAKE_CUDA_COMPILER_ID为NVIDIA时,此变量会自动初始化。此变量用于初始化新的CUDA_ARCHITECTURES目标属性。请参见策略CMP0104。新增了
CMAKE_PCH_WARN_INVALID变量,用于初始化PCH_WARN_INVALID目标属性,以允许移除预编译头文件无效警告。
属性¶
新增了
CUDA_ARCHITECTURES目标属性,用于指定 CUDA 输出架构。鼓励用户使用此属性,而不是手动指定选项,因为这种方法与编译器无关。此属性由新的CMAKE_CUDA_ARCHITECTURES变量初始化。请参见策略CMP0104。新增了
Fortran_PREPROCESS目标属性和Fortran_PREPROCESS源文件属性,用于控制 Fortran 源文件的预处理。新增了
FRAMEWORK_MULTI_CONFIG_POSTFIX_<CONFIG>目标属性和相关的CMAKE_FRAMEWORK_MULTI_CONFIG_POSTFIX_<CONFIG>变量,以允许在使用多配置生成器时,向框架文件名添加后缀。OBJECT_OUTPUTS源文件属性现在支持生成器表达式。新增了
PCH_WARN_INVALID目标属性,以允许移除预编译头文件无效警告。新增了
UNITY_BUILD_MODE目标属性,用于告知生成器使用哪种算法来对包含的源文件进行分组。新增了
VS_SOURCE_SETTINGS_<tool>目标属性,用于告知 Visual Studio 生成器(针对 VS 2010 及更高版本)使用<tool>向非构建源文件添加元数据。新增了
VS_SETTINGS源文件属性,用于告知 Visual Studio 生成器(针对 VS 2010 及更高版本)向非构建源文件添加元数据。新增了
VS_PLATFORM_TOOLSET目标属性,用于告知 Visual Studio 生成器(针对 VS 2010 及更高版本)覆盖平台工具集。新增了
VS_SOLUTION_DEPLOY目标属性,用于告知 Visual Studio 生成器(针对 VS 2010 及更高版本)将目标标记为部署,即使不在 Windows Phone/Store/CE 下构建。
模块¶
新增了
CheckLinkerFlag模块,以提供检查链接器标志有效性的功能。ExternalProject模块的ExternalProject_Add()命令新增了GIT_REMOTE_UPDATE_STRATEGY关键字。这可用于指定 git 更新期间失败的 rebase 操作应如何处理。还新增了CMAKE_EP_GIT_REMOTE_UPDATE_STRATEGY变量作为全局默认值,并且ExternalProject和FetchContent模块都支持该变量。FetchContent模块的FetchContent_Declare()命令现在支持SOURCE_SUBDIR选项。可用于指示FetchContent_MakeAvailable()在不同位置查找CMakeLists.txt文件。FindBLAS模块现在提供了一个导入目标。FindCUDAToolkit 模块
新增了
CUDAToolkit_LIBRARY_ROOT变量,该变量是包含nvvm目录和version.txt的目录。在
CUDA编译器检测期间使用的工具包和库根。
FindLAPACK模块现在提供了一个导入目标。FindPython3、FindPython2和FindPython模块新增了为
cmake-gui(1)和ccmake(1)的交互式编辑创建每个工件的缓存变量的可能性。在
Development组件下新增了子组件Development.Module和Development.Embed。新增了指定要查找的 Python 实现的能力,包括
IronPython和PyPy。
FindRuby模块的输入和输出变量均已从RUBY_重命名为Ruby_,以与其他查找模块保持一致。如果提供了旧大小写的输入变量,则会予以保留,并且旧大小写的输出变量始终提供。FindSWIG模块现在接受目标语言作为COMPONENTS和OPTIONAL_COMPONENTS参数传递给find_package。GoogleTest模块的gtest_discover_tests()命令新增了
DISCOVERY_MODE选项,用于控制测试发现步骤的运行时间。它提供了一个新的PRE_TEST设置,可以在测试时而不是构建时运行发现。新的CMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE变量可用于全局更改默认设置。新增了一个可选参数
XML_OUTPUT_DIR。设置后,JUnit XML 测试结果将存储在该目录中。
FindLibXslt模块现在提供导入目标。UseSWIG模块现在支持 Fortran 作为目标语言,前提是SWIG_EXECUTABLE是 SWIG-Fortran。
生成器表达式¶
新增了
$<DEVICE_LINK:...>和$<HOST_LINK:...>生成器表达式,用于管理设备和主机链接步骤。新增了
$<LINK_LANGUAGE:...>和$<LINK_LANG_AND_ID:...>生成器表达式。
CTest¶
ctest(1)新增了--stop-on-failure选项,可用于在测试失败后停止运行测试。ctest_test()命令新增了STOP_ON_FAILURE选项,可用于在测试失败后停止运行测试。CTestCoverageCollectGCOV模块的ctest_coverage_collect_gcov()命令新增了TARBALL_COMPRESSION选项,用于控制收集结果的 tarball 的压缩。
CPack¶
CPack Archive Generator的TXZ格式支持CPACK_ARCHIVE_THREADS变量,以启用并行压缩。需要 CMake 使用的liblzma支持。CPack NSIS Generator新增了CPACK_NSIS_MANIFEST_DPI_AWARE变量,用于声明安装程序是 DPI 感知的。CPack RPM Generator新增了CPACK_RPM_PRE_TRANS_SCRIPT_FILE和CPACK_RPM_POST_TRANS_SCRIPT_FILE变量,用于指定事务前和事务后脚本。
其他¶
cmake-gui(1)现在从CMAKE_GENERATOR环境变量填充其生成器选择控件的默认值。此外,环境变量CMAKE_GENERATOR_PLATFORM和CMAKE_GENERATOR_TOOLSET用于填充其各自的控件默认值。ccmake(1)支持读取CCMAKE_COLORS环境变量来定制颜色。编译特性功能现在支持 MSVC 19.27 和 19.28 中的 C11 特性可用性,包括对c_restrict、c_static_assert特性以及-std:c11标志的支持。
已弃用和已删除的特性¶
已通过策略
CMP0106弃用Documentation模块。该模块本质上是 VTK 代码,CMake 不应再分发。为策略
CMP0070和CMP0071(CMP0069及更早版本已弃用)添加了显式的弃用诊断。cmake-policies(7)手册解释了所有策略的 OLD 行为已被弃用,项目应迁移到 NEW 行为。
其他更改¶
在 Windows 上,当未显式指定编译器时,
Ninja和Ninja Multi-Config生成器现在会选择PATH环境变量列出的目录中找到的第一个编译器(不限名称)。LINK_OPTIONS和INTERFACE_LINK_OPTIONS目标属性现在用于设备链接步骤。请参见策略CMP0105。创建覆盖现有目标的
ALIAS目标现在会引发错误。请参见策略CMP0107。将目标通过别名链接到自身现在会引发错误。请参见策略
CMP0108。FindPackageHandleStandardArgs模块的REQUIRED_VARS选项在指定HANDLE_COMPONENTS时现在是可选的。source_group()命令现在也识别正斜杠作为子组分隔符,而不仅仅是反斜杠。ctest(1)现在记录它为每个测试设置的环境变量(无论是由于ENVIRONMENT属性还是 资源分配 功能),并将此日志提交给 CDash。它不会记录在 CTest 外部设置的环境变量。当从源代码构建 CMake 本身且不使用系统提供的 libcurl 时,现在为支持通过
http(s)进行网络通信的命令(如file(DOWNLOAD)、file(UPLOAD)和ctest_submit())启用 HTTP/2 支持。在cmake.org上提供的预编译二进制文件现在支持 HTTP/2。cmake-file-api(7)“codemodel”版本 2 的version字段已更新为 2.1。cmake-file-api(7)“codemodel”版本 2 “target”对象在compileGroups对象中新增了precompileHeaders字段。
更新¶
自 CMake 3.18.0 以来的更改包括以下内容。
3.18.1¶
当
CMAKE_OSX_ARCHITECTURES未定义时,Xcode生成器现在选择$(NATIVE_ARCH_ACTUAL)作为默认架构(Xcode 的ARCHS设置)。这对于 Xcode 12 选择主机的架构是必需的,而旧版本的 Xcode 默认也会这样做。在 CMake 3.18.0 中,
add_test()命令新增了支持测试名称中的特殊字符的功能。此功能在发行说明中被意外遗漏。不幸的是,此修复破坏了先前为了规避限制而使用手动引用或转义的现有项目。此修复已在 3.18.1 中回滚,但可能在未来版本的 CMake 中重新引入,并带有兼容性策略。
3.18.2¶
CMAKE_AUTOMOC_PATH_PREFIX的默认值已更改为OFF,因为此功能可能会破坏具有不同包含目录中同名头文件的现有项目。这恢复了与 CMake 3.15 及更早版本的兼容性。默认值在 3.16.9 和 3.17.5 中也已更改为OFF。编译特性功能已针对 MSVC 19.27 进行了更新,如上所述(c_restrict)。
3.18.3¶
编译特性功能已针对 MSVC 19.28 进行了更新,如上所述(c_static_assert)。