CMake 3.18 发行说明¶
自 CMake 3.17 以来所做的更改包括以下内容。
新功能¶
语言¶
现在可以在非 Windows 平台上使用 Clang 编译
CUDA语言。任何平台尚不支持可分离编译。
命令行¶
命令¶
add_library()和add_executable()命令学会了创建 别名目标 引用非GLOBAL进口目标。cmake_language()命令被添加用于脚本或内置命令的元操作,从模式开始以``CALL`` 其他命令,以及``EVAL CODE`` 以就地评估 CMake 脚本.execute_process()命令获得了ECHO_OUTPUT_VARIABLE和ECHO_ERROR_VARIABLE选项。export()命令现在会在没有APPEND的情况下多次使用相同的FILE时引发错误。请参阅政策:policy: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 目标属性。请参阅政策:policy:CMP0104。添加了
CMAKE_PCH_WARN_INVALID变量来初始化PCH_WARN_INVALID目标属性,以允许删除预编译标头无效警告。
特性¶
添加了
CUDA_ARCHITECTURES目标属性以指定 CUDA 输出架构。鼓励用户使用它而不是手动指定选项,因为这种方法与编译器无关。该属性由新的 CMAKE_CUDA_ARCHITECTURES 变量初始化。请参阅政策:policy: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>目标属性已添加,以告诉 Visual Studio 生成器 for VS 2010 及更高版本使用<tool>将元数据添加到非构建的源文件。添加了
VS_SETTINGS源文件属性,告诉 Visual Studio 生成器 for VS 2010 及更高版本将元数据添加到非构建的源文件。添加了
VS_PLATFORM_TOOLSET目标属性,告诉 Visual Studio 生成器 for 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模块现在提供导入的目标。如果 SWIG_EXECUTABLE 是 SWIG-Fortran,那么 UseSWIG 模块现在支持 Fortran 作为目标语言。
生成器表达式¶
添加了
$<DEVICE_LINK:...>和$<HOST_LINK:...>生成器表达式来管理设备和主机链接步骤。添加了
$<LINK_LANGUAGE:...>和$<LINK_LANG_AND_ID:...>生成器表达式。
C测试¶
ctest(1)获得了一个新的CTEST_RESOURCE_SPEC_FILE变量,可用于指定:ref:资源规范文件 <ctest-resource-specification-file>。ctest(1)获得了一个--stop-on-failure选项,可以用来在测试失败后停止运行测试。ctest_test()命令获得了一个STOP_ON_FAILURE选项,该选项可用于在测试失败后停止运行测试。CTestCoverageCollectGCOV模块ctest_coverage_collect_gcov()命令获得了一个TARBALL_COMPRESSION选项来控制对收集结果的 tarball 的压缩。
包装¶
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环境变量来自定义颜色。Compile Features功能现在知道 MSVC 19.27 和 19.28 中 C11 功能的可用性,包括对c_restrict、c_static_assert功能的支持和-std:c11标志。
弃用和删除的功能¶
Documentation模块已通过CMP0106弃用。该模块本质上是 CMake 不应再发布的 VTK 代码。为策略“CMP0070”和策略“CMP0071”添加了明确的弃用诊断(“CMP0069”及以下已弃用)。
cmake-policies(7)手册解释说所有策略的旧行为都已弃用,项目应该移植到新行为。
其他变化¶
在 Windows 上,
Ninja和Ninja Multi-Config生成器,当未明确指定编译器时,现在选择在 ``PATH` 列出的目录中找到的第一个编译器(任何名称) ` 环境变量。LINK_OPTIONS和INTERFACE_LINK_OPTIONS目标属性现在用于设备链接步骤。请参阅政策:policy:CMP0105。创建覆盖现有目标的“ALIAS”目标现在会引发错误。请参阅政策:policy:CMP0107。
通过别名将目标链接到自身现在会引发错误。请参阅政策:policy:CMP0108。
如果指定了“HANDLE_COMPONENTS”,则 FindPackageHandleStandardArgs 模块选项“REQUIRED_VARS”现在是可选的。
source_group()命令现在也将正斜杠识别为子组定界符,而不仅仅是反斜杠。ctest(1)现在记录它为每个测试设置的环境变量,这可能是由于ENVIRONMENT属性或 resource allocation 特性,和将此日志提交给 CDash。它不会记录在 CTest 之外设置的环境变量。当从源代码构建 CMake 本身而不使用系统提供的 libcurl 时,现在为支持通过
http(s)支持网络通信的命令启用 HTTP/2 支持,例如file(DOWNLOAD),文件(上传)(),和ctest_submit()。cmake.org上提供的预编译二进制文件现在支持 HTTP/2。cmake-file-api(7)"codemodel" version 2version字段已更新为 2.1。cmake-file-api(7)“codemodel” version 2 “target” 对象在compileGroups对象中获得了一个新的precompileHeaders字段。
更新¶
自 CMake 3.18.0 以来所做的更改包括以下内容。
3.18.1¶
Xcode生成器,当CMAKE_OSX_ARCHITECTURES未定义时,现在选择$(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 中,默认值也更改为“关闭”。Compile Features功能已针对 MSVC 19.27 进行了更新,如上所述 (c_restrict)。
3.18.3¶
Compile Features功能已针对 MSVC 19.28 进行了更新,如上所述 (c_static_assert)。