CMake 3.18 版本说明¶
自 CMake 3.17 以来的更改包括以下内容。
新特性¶
语言¶
CUDA
语言现在可以使用 Clang 在非 Windows 平台上编译。 可分离编译目前在任何平台上都不受支持。
命令行¶
命令¶
add_library()
和add_executable()
命令学会了创建引用非GLOBAL
导入的目标 的 别名目标。cmake_language()
命令被添加用于对脚本化或内置命令的元操作,从CALL
其他命令的模式开始,以及EVAL CODE
用于就地评估 CMake 脚本。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
选项,如果什么也没找到,它将停止处理并显示错误消息。get_property()
命令使用SOURCE
范围获得了DIRECTORY
和TARGET_DIRECTORY
选项,以从提供的目录范围获取属性。get_source_file_property()
命令获得了DIRECTORY
和TARGET_DIRECTORY
选项,以从提供的目录范围获取属性。list()
操作SORT
获得了NATURAL
排序选项,以使用自然顺序排序(请参阅strverscmp(3)
手册)。set_property()
命令使用SOURCE
范围获得了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
源文件属性支持generator expressions
。添加了
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
模块现在提供了一个导入目标。该
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)
新增了一个CTEST_RESOURCE_SPEC_FILE
变量,可用于指定一个 资源规范文件。ctest(1)
新增了一个--stop-on-failure
选项,可用于在一次测试失败后停止运行测试。The
ctest_test()
命令新增了一个STOP_ON_FAILURE
选项,可用于在一次测试失败后停止运行测试。The
CTestCoverageCollectGCOV
模块的ctest_coverage_collect_gcov()
命令新增了一个TARBALL_COMPRESSION
选项,用于控制收集到的结果的压缩包的压缩方式。
CPack¶
The
CPack Archive Generator
的TXZ
格式新增了CPACK_ARCHIVE_THREADS
变量来启用并行压缩。需要 CMake 使用的liblzma
支持。The
CPack NSIS Generator
新增了一个变量CPACK_NSIS_MANIFEST_DPI_AWARE
来声明安装程序是 DPI 感知的。The
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
环境变量来定制颜色。The
Compile Features
功能现在认识到 MSVC 19.27 和 19.28 中 C11 特征的可用性,包括对c_restrict
、c_static_assert
特征和-std:c11
标志的支持。
弃用和移除的特性¶
The
Documentation
模块已经被CMP0106
弃用。这个模块本质上是 VTK 代码,CMake 不应该再发布它了。针对策略
CMP0070
和策略CMP0071
新增了一个显式弃用诊断(CMP0069
及以下已经过时)。Thecmake-policies(7)
手册解释说,所有策略的 OLD 行为都是过时的,项目应该移植到 NEW 行为。
其他变更¶
在 Windows 上,The
Ninja
和Ninja Multi-Config
生成器,如果没有显式指定编译器,现在会选择PATH
环境变量中列出的目录中找到的第一个编译器(无论名称)。The
LINK_OPTIONS
和INTERFACE_LINK_OPTIONS
目标属性现在用于设备链接步骤。参见策略CMP0105
。创建覆盖现有目标的
ALIAS
目标现在会引发错误。参见策略CMP0107
。通过别名将目标链接到自身现在会引发错误。参见策略
CMP0108
。The
FindPackageHandleStandardArgs
模块选项REQUIRED_VARS
现在是可选的,如果指定了HANDLE_COMPONENTS
。The
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
。如上所述 (
c_restrict
),Compile Features
功能已针对 MSVC 19.27 更新。
3.18.3¶
如上所述 (
c_static_assert
),Compile Features
功能已针对 MSVC 19.28 更新。