CMake 3.20 发行说明¶
自 CMake 3.19 以来的更改包括以下内容。
新功能¶
预设¶
cmake-presets(7)增加了对构建和测试预设的支持。
生成器¶
Makefile 生成器,对于某些工具链,现在在编译源文件时使用编译器提取隐式依赖项。
语言¶
C++23 编译器模式现在可以通过
CXX_STANDARD、CUDA_STANDARD或OBJCXX_STANDARD目标属性,或者通过Compile Features功能的cxx_std_23元特性来指定。CUDA语言支持现在可以在nvcc是符号链接时工作,例如由于ccache或colornvcc包装脚本。已添加
CUDAARCHS环境变量用于初始化CMAKE_CUDA_ARCHITECTURES。在编译器默认值不适用于机器 GPU 时很有用。
编译器¶
现在支持 NVIDIA HPC SDK 编译器,编译器 ID 为
NVHPC。现在支持 Intel oneAPI NextGen LLVM 编译器,编译器 ID 为
IntelLLVMLinux 上的
icx/icpxC/C++ 编译器,以及 Windows 上的icxC/C++ 编译器,自 oneAPI 2021.1 起完全支持。Linux 上的
ifxFortran 编译器自 oneAPI 2021.1 起支持。Windows 上的
ifxFortran 编译器尚不支持。
Intel oneAPI Classic 编译器(
icc、icpc和ifort)继续以编译器 IDIntel支持。增加了对 IAR STM8 编译器的支持。
平台¶
CMake 对 Android 交叉编译 的支持现已与 Android NDK 的工具链文件合并。它们现在具有类似的行为,尽管某些变量名称不同。面向用户的更改包括
find_*函数将默认搜索 NDK ABI / API 特定路径。Android 的默认
CMAKE_BUILD_TYPE现在是RelWithDebInfo。添加了
CMAKE_ANDROID_NDK_VERSION变量以报告 NDK 的版本。
基于文件的 API¶
cmake-file-api(7)增加了一个新的 "toolchains" 对象类型,该类型描述了为每种启用的语言使用的编译器。
命令¶
add_custom_command()和add_custom_target()现在在其OUTPUT和BYPRODUCTS选项中支持生成器表达式。它们的
COMMAND、WORKING_DIRECTORY和DEPENDS选项增加了对新的生成器表达式$<COMMAND_CONFIG:...>和$<OUTPUT_CONFIG:...>的支持,这些表达式在与Ninja Multi-Config生成器一起使用时,可以控制跨配置处理。add_custom_command()命令在 Makefile 生成器 上增加了DEPFILE支持。add_library()命令之前在使用可能的多架构配置时禁止了导入的对象库。这主要影响了Xcode生成器,例如在针对 iOS 或其他设备平台时。此限制现已解除。添加了
cmake_path()命令用于对文件系统路径进行操作。configure_file()命令增加了USE_SOURCE_PERMISSIONS和FILE_PERMISSIONS选项,以分别支持复制源文件权限和使用指定权限。file(GENERATE)命令增加了NEWLINE_STYLE选项,用于指定生成文件的换行符处理方式。file(GENERATE)命令增加了NO_SOURCE_PERMISSIONS、USE_SOURCE_PERMISSIONS和FILE_PERMISSIONS选项,用于控制生成文件的权限。install(FILES)命令的RENAME选项学会了支持生成器表达式。target_include_directories()命令增加了一个新选项AFTER。target_sources()命令现在支持由add_custom_target()命令创建的目标。try_run()命令增加了一个WORKING_DIRECTORY选项,用于设置运行编译的检查可执行文件的当前工作目录。
变量¶
添加了
CMAKE_<LANG>_BYTE_ORDER变量,用于提供从工具链检测到的目标体系结构字节序。CMAKE_RUNTIME_OUTPUT_DIRECTORY、CMAKE_LIBRARY_OUTPUT_DIRECTORY和CMAKE_ARCHIVE_OUTPUT_DIRECTORY变量现在支持依赖于目标的生成器表达式。
属性¶
<LANG>_CLANG_TIDY目标属性和相关的CMAKE_<LANG>_CLANG_TIDY变量学会了支持OBJC和OBJCXX语言。添加了
EXPORT_COMPILE_COMMANDS目标属性,用于关联的CMAKE_EXPORT_COMPILE_COMMANDS变量,以允许按目标导出编译命令的配置。生成的源文件可以在目录之间使用,无需手动标记。此外,
GENERATED源文件属性一旦开启就不能关闭,也不能设置为布尔值以外的值。请参阅策略CMP0118。添加了
UNITY_BUILD_UNIQUE_ID目标属性,以支持在 unity 构建中为每个源文件生成唯一标识符。这有助于解决匿名命名空间中的重复符号问题。WIN32_EXECUTABLE目标属性现在在 Windows 上与 Clang 一起工作。添加了
XCODE_EMBED_FRAMEWORKS目标属性,用于告知Xcode生成器嵌入框架。嵌入的各个方面可以通过XCODE_EMBED_FRAMEWORKS_PATH、XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY和XCODE_EMBED_FRAMEWORKS_REMOVE_HEADERS_ON_COPY目标属性进行自定义。
模块¶
ExternalData 模块的
ExternalData_Add_Target()函数增加了SHOW_PROGRESS <bool>选项,用于控制在构建过程中是否显示进度输出。ExternalProject 模块的
ExternalProject_Add()函数增加了CONFIGURE_HANDLED_BY_BUILD选项。这可以用于使配置步骤的后续运行在外部项目依赖重新构建时由构建步骤触发,而不是在这些情况下始终重新运行配置步骤。FindBoost 模块增加了
Boost_NO_WARN_NEW_VERSIONS选项,用于静默关于新 Boost 版本未知依赖项的警告。FindCUDAToolkit 模块增加了对查找 CUDA 工具包的支持,当
nvcc是符号链接时,例如由于ccache或colornvcc包装脚本。FindGDAL 模块已得到改进,文档记录了其缓存变量并将其标记为高级。新增了
FindGDAL_SKIP_GDAL_CONFIG变量,可用于跳过基于gdal-config的搜索。用户还可以设置GDAL_ADDITIONAL_LIBRARY_VERSIONS来为库名搜索策略添加其他版本。FindIntl 模块现在提供了一个导入的目标。
FindOpenSSL 模块学会了支持版本范围。
FindPython3、FindPython2 和 FindPython 模块增加了控制如何搜索未版本化解释器名称的选项。
UseJava 模块
add_jar()命令的GENERATE_NATIVE_HEADERS功能增加了导出生成目标的选项。UseSWIG 模块获得了能力,对于 Makefile 和 Ninja 生成器,可以使用
swig工具生成隐式依赖项。
Autogen¶
AUTOMOC 功能现在可以与每配置源一起工作。
CTest¶
ctest(1)增加了一个--test-dir选项,用于指定搜索测试的目录。
CPack¶
CPack增加了CPACK_THREADS变量,用于控制并行化操作(如压缩安装程序包)使用的线程数。CPack DEB Generator学会了一个新的CPACK_DEBIAN_PACKAGE_SHLIBDEPS_PRIVATE_DIRS变量,用于在使用dpkg-shlibdeps时指定解析私有库依赖项的其他搜索目录。CPack IFW Generator增加了一个新的CPACK_IFW_PACKAGE_WIZARD_SHOW_PAGE_LIST变量,用于控制在安装程序向导左侧显示安装程序页面列表的可见性。此功能仅在 QtIFW 4.0 及更高版本中可用。CPack NSIS Generator增加了新的CPACK_NSIS_BRANDING_TEXT和CPACK_NSIS_BRANDING_TEXT_TRIM_POSITION变量,用于更改安装窗口底部的文本并更改其修剪位置。CPack NSIS Generator现在可以正确处理 Unicode 字符。如果您想拥有一个带有 UTF-8 字符的CPACK_RESOURCE_FILE_LICENSE,它需要以 UTF-8 BOM 编码。CPack NuGet Generator增加了选项CPACK_NUGET_PACKAGE_ICON和CPACK_NUGET_<compName>_PACKAGE_ICON允许通过本地文件指定包图标。CPACK_NUGET_PACKAGE_LICENSE_EXPRESSION和CPACK_NUGET_<compName>_PACKAGE_LICENSE_EXPRESSION增加了对指定 Software Package Data Exchange (SPDX) 认可的许可证的支持。CPACK_NUGET_PACKAGE_LICENSE_FILE_NAME和CPACK_NUGET_<compName>_PACKAGE_LICENSE_FILE_NAME允许通过本地文件指定许可证。CPACK_NUGET_PACKAGE_LANGUAGE和CPACK_NUGET_<compName>_PACKAGE_LANGUAGE允许指定包的区域设置,例如en_CA。
弃用和移除的功能¶
已移除
cmake-server(7)模式。客户端应改用cmake-file-api(7)。WriteCompilerDetectionHeader 模块已通过策略
CMP0120弃用。项目应迁移离开它。TestBigEndian 模块已弃用,改用
CMAKE_<LANG>_BYTE_ORDER变量。AddFileDependencies 模块已弃用。请迁移项目以直接使用
set_property()。CPack NuGet Generator弃用了一些变量,以反映 NuGet 规范的更改。CPACK_NUGET_PACKAGE_ICONURL和CPACK_NUGET_<compName>_PACKAGE_ICONURL已弃用;请替换为对本地图标文件的引用。CPACK_NUGET_PACKAGE_LICENSEURL和CPACK_NUGET_<compName>_PACKAGE_LICENSEURL已弃用;请替换为对项目许可证文件或 SPDX 许可证表达式的引用。
其他更改¶
在运行
cmake(1)生成项目构建系统 时,以连字符(-)开头的未知命令行参数现在会因错误而被拒绝。以前它们会被静默忽略。源文件扩展名现在必须显式。有关详细信息,请参阅策略
CMP0115。在 AIX 上,安装 XCOFF 可执行文件和共享库不再需要重新链接以将构建树 RPATH 的运行时搜索路径更改为安装树 RPATH。CMake 现在像在 ELF 平台上一贯做的那样,在安装期间直接编辑 XCOFF 二进制文件。
对于类 MSVC 编译器,
CMAKE_CXX_FLAGS的值默认不再包含用于运行时类型信息的/GR标志。请参阅策略CMP0117。Ninja 生成器现在会转换
add_custom_command()生成的DEPFILE。有关详细信息,请参阅策略CMP0116。在 cmake.org 上提供的 Linux 预编译二进制文件的命名模式已更改为
cmake-$ver-linux-$arch,其中$arch是x86_64或aarch64。在 cmake.org 上提供的 Windows 预编译二进制文件的命名模式已更改为
cmake-$ver-windows-$arch,其中$arch是x86_64或i386。
更新¶
自 CMake 3.20.0 以来的更改包括以下内容。
3.20.1¶
CMake 3.20.0 中的 FindIntl 模块添加了
Intl_HAVE_GETTEXT_BUILTIN、Intl_HAVE_DCGETTEXT_BUILTIN和Intl_IS_BUILTIN检查,但它们没有正确实现。已将其移除,并替换为单个Intl_IS_BUILT_IN检查,其名称与 FindIconv 模块一致。现在将
-rpath链接器标志指定为在所有 Apple 平台上支持,而不仅仅是 macOS。用于 iOS、tvOS 和 watchOS 的install_name_dir现在应该默认为@rpath,而不是使用完整的绝对路径并在库或框架嵌入到应用程序包中时在运行时失败(请参阅XCODE_EMBED_<type>)。
3.20.2¶
现在可以正确检测到 Intel Classic 2021 编译器版本号,其主版本为 2021。CMake 3.20.1 及更早版本不了解 Intel 从 2021 版本开始的标识宏版本方案的更改,并将版本检测为 20.2。
Intel oneAPI Fortran 编译器现在标识为
IntelLLVM。oneAPI 2021.1 Fortran 编译器缺少一个标识宏,因此 CMake 3.20.1 及更早版本将其标识为Intel。CMake 现在有一个特殊情况来识别 oneAPI 2021.1 Fortran 为IntelLLVM。oneAPI 2021.2 Fortran 编译器定义了正确的标识宏,因此所有 CMake 3.20 版本都将其标识为IntelLLVM。
3.20.3, 3.20.4, 3.20.5, 3.20.6¶
这些版本未对已记录的功能或接口进行任何更改。为了支持生态系统更改和/或修复回归,进行了一些实现更新。