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选项。命令
export()现在如果使用相同的FILE但不使用APPEND多次调用,将引发错误。请参阅策略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>,以告知 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现在将目标语言作为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选项,可用于在测试失败后停止运行测试。命令
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标志的支持。
已弃用和已删除的特性¶
模块
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。模块
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。文件 API
cmake-file-api(7)的 "codemodel" 版本 2 的version字段已更新至 2.1。文件 API
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 中回滚,但将来可能会在兼容性策略下重新引入。
3.18.2¶
CMAKE_AUTOMOC_PATH_PREFIX的默认值已更改为OFF,因为此功能可能会破坏在不同包含目录中具有相同名称的头文件的现有项目。这恢复了与 CMake 3.15 及更低版本的兼容性。默认值在 3.16.9 和 3.17.5 中也已更改为OFF。如上所述(
c_restrict),MSVC 19.27 的编译功能已更新。
3.18.3¶
如上所述(
c_static_assert),MSVC 19.28 的编译功能已更新。