CMake 3.18 发行说明¶
自 CMake 3.17 以来的更改包括以下内容。
新特性¶
语言¶
现在可以使用 Clang 在非 Windows 平台上编译
CUDA
语言。在任何平台上尚不支持可分离编译。
命令行¶
命令¶
add_library()
和add_executable()
命令学会了创建引用非GLOBAL
导入目标 的 别名目标。添加了
cmake_language()
命令,用于对脚本或内置命令进行元操作,首先是CALL
其他命令的模式,以及EVAL CODE
以就地评估 CMake 脚本。execute_process()
命令获得了ECHO_OUTPUT_VARIABLE
和ECHO_ERROR_VARIABLE
选项。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
选项,以从提供的目录作用域获取属性。具有
DIRECTORY
和TARGET_DIRECTORY
选项的get_source_file_property()
命令获得了DIRECTORY
和TARGET_DIRECTORY
选项,以从提供的目录作用域获取属性。list()
操作SORT
获得了NATURAL
排序选项,以使用自然顺序进行排序(请参阅strverscmp(3)
手册)。具有
SOURCE
作用域的set_property()
命令获得了DIRECTORY
和TARGET_DIRECTORY
选项,以在提供的目录作用域中设置属性。具有
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>
目标属性,以告知用于 VS 2010 及更高版本的 Visual Studio 生成器 使用<tool>
向非构建源文件添加元数据。添加了
VS_SETTINGS
源文件属性,以告知用于 VS 2010 及更高版本的 Visual Studio 生成器 向非构建源文件添加元数据。添加了
VS_PLATFORM_TOOLSET
目标属性,以告知用于 VS 2010 及更高版本的 Visual Studio 生成器 覆盖平台工具集。添加了
VS_SOLUTION_DEPLOY
目标属性,以告知用于 VS 2010 及更高版本的 Visual Studio 生成器 即使在不为 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
模块现在提供导入的目标。-
获得了变量
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
模块现在接受目标语言作为find_package
的COMPONENTS
和OPTIONAL_COMPONENTS
参数。GoogleTest
模块gtest_discover_tests()
命令获得了一个新的
DISCOVERY_MODE
选项,用于控制何时运行测试发现步骤。它提供了一个新的PRE_TEST
设置,以便在测试时而不是构建时运行发现。可以使用新的CMAKE_GTEST_DISCOVER_TESTS_DISCOVERY_MODE
变量来全局更改默认值。获得了一个新的可选参数
XML_OUTPUT_DIR
。设置后,JUnit XML 测试结果将存储在该目录中。
FindLibXslt
模块现在提供导入的目标。如果
SWIG_EXECUTABLE
是 SWIG-Fortran,UseSWIG
模块现在支持 Fortran 作为目标语言。
生成器表达式¶
添加了
$<DEVICE_LINK:...>
和$<HOST_LINK:...>
生成器表达式,以管理设备和主机链接步骤。添加了
$<LINK_LANGUAGE:...>
和$<LINK_LANG_AND_ID:...>
生成器表达式。
CTest¶
ctest(1)
获得了一个新的CTEST_RESOURCE_SPEC_FILE
变量,该变量可用于指定 资源规范文件。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
变量,以指定 pre- 和 post-transaction 脚本。
其他¶
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
标志的支持。
已弃用和移除的特性¶
Documentation
模块已通过CMP0106
弃用。此模块本质上是 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
。如果指定了
HANDLE_COMPONENTS
,则FindPackageHandleStandardArgs
模块选项REQUIRED_VARS
现在是可选的。source_group()
命令现在也识别正斜杠作为子组分隔符,而不仅仅是反斜杠。ctest(1)
现在记录它为每个测试设置的环境变量,无论是由于ENVIRONMENT
属性还是 资源分配 功能,并将此日志提交到 CDash。它不记录在 CTest 外部设置的环境变量。当从源代码构建 CMake 自身且不使用系统提供的 libcurl 时,现在为通过
http(s)
支持网络通信的命令启用了 HTTP/2 支持,例如file(DOWNLOAD)
、file(UPLOAD)
和ctest_submit()
。在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)
作为默认架构(XcodeARCHS
设置)。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
)。