CMake 3.20 发行说明¶
自 CMake 3.19 以来的更改包括以下内容。
新特性¶
预设¶
cmake-presets(7)
获得了对构建和测试预设的支持。
生成器¶
Makefile 生成器,对于某些工具链,现在使用编译器在编译源文件时提取隐式依赖项。
语言¶
现在可以通过
CXX_STANDARD
、CUDA_STANDARD
或OBJCXX_STANDARD
目标属性,或者通过Compile Features
功能的cxx_std_23
元特性来指定 C++23 编译器模式。当
nvcc
是符号链接时,例如由于ccache
或colornvcc
包装脚本,CUDA
语言支持现在可以工作。添加了
CUDAARCHS
环境变量,用于初始化CMAKE_CUDA_ARCHITECTURES
。在编译器默认值不适合机器的 GPU 的情况下很有用。
编译器¶
NVIDIA HPC SDK 编译器现在通过编译器 ID
NVHPC
支持。Intel oneAPI NextGen LLVM 编译器现在通过编译器 ID
IntelLLVM
支持。Linux 上的
icx
/icpx
C/C++ 编译器和 Windows 上的icx
C/C++ 编译器从 oneAPI 2021.1 开始完全支持。Linux 上的
ifx
Fortran 编译器从 oneAPI 2021.1 开始受支持。Windows 上的
ifx
Fortran 编译器尚不受支持。
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
选项中支持generator expressions
。它们的
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
选项学会了支持generator expressions
。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
模块获得了在nvcc
是符号链接时查找 CUDA 工具包的支持,例如由于ccache
或colornvcc
包装脚本。FindGDAL
模块已得到改进,可以记录其缓存变量并将其标记为高级。有一个新的FindGDAL_SKIP_GDAL_CONFIG
变量,可用于跳过基于gdal-config
的搜索。用户还可以设置GDAL_ADDITIONAL_LIBRARY_VERSIONS
以向库名称搜索策略添加其他版本。FindIntl
模块现在提供导入的目标。FindOpenSSL
模块学会了支持版本范围。FindPython3
、FindPython2
和FindPython
模块获得了控制如何搜索未版本化解释器名称的选项。UseJava
模块add_jar()
命令的GENERATE_NATIVE_HEADERS
功能获得了导出生成的目标的选项。
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
添加了对指定 软件程序包数据交换 (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()
。The
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 现在在安装期间直接编辑 XCOFF 二进制文件,就像长期以来在 ELF 平台上所做的那样。
对于类似 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¶
这些版本未对已记录的功能或接口进行任何更改。 进行了一些实现更新以支持生态系统更改和/或修复回归。