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
)。