CMake 3.20 发布说明¶
自 CMake 3.19 以来的更改包括以下内容。
新功能¶
Presets¶
cmake-presets(7)
增加了对构建和测试预设的支持。
生成器¶
Makefile Generators 对于某些工具链,在编译源文件时现在使用编译器提取隐式依赖。
Languages¶
C++23 编译器模式现在可以通过
CXX_STANDARD
、CUDA_STANDARD
或OBJCXX_STANDARD
目标属性指定,或者通过Compile Features
功能的cxx_std_23
元特征指定。CUDA
语言支持现在可在nvcc
是符号链接时工作,例如由于ccache
或colornvcc
包装脚本。添加了
CUDAARCHS
环境变量用于初始化CMAKE_CUDA_ARCHITECTURES
。在编译器默认值不适用于机器 GPU 的情况下很有用。
编译器¶
现在通过编译器 ID
NVHPC
支持 NVIDIA HPC SDK 编译器。现在通过编译器 ID
IntelLLVM
支持 Intel oneAPI NextGen LLVM 编译器。Linux 上的
icx
/icpx
C/C++ 编译器,以及 Windows 上的icx
C/C++ 编译器,从 oneAPI 2021.1 开始全面支持。从 oneAPI 2021.1 开始支持 Linux 上的
ifx
Fortran 编译器。Windows 上的
ifx
Fortran 编译器尚不支持。
Intel oneAPI Classic 编译器(
icc
、icpc
和ifort
)将继续以编译器 IDIntel
支持。添加了对 IAR STM8 编译器的支持。
Platforms¶
CMake 对 Cross Compiling for Android 的支持现已与 Android NDK 的工具链文件合并。它们现在具有相似的行为,尽管某些变量名称不同。面向用户的更改包括
find_*
函数默认将搜索 NDK ABI / API 特定路径。Android 的默认
CMAKE_BUILD_TYPE
现在是RelWithDebInfo
。添加了
CMAKE_ANDROID_NDK_VERSION
变量以报告 NDK 的版本。
File-Based 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 Generators 上增加了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
模块增加了对查找 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
功能增加了用于导出生成的目标的选项。
Autogen¶
AUTOMOC 功能现在可以与 per-config 源一起使用。
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)
来 Generate a Project Buildsystem 时,以连字符(-
)开头的未知命令行参数现在会被拒绝并报错。之前它们会被静默忽略。源文件扩展名现在必须是显式的。有关详细信息,请参见策略
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
模块一致。所有 Apple 平台(不仅仅是 macOS)现在都指定支持
-rpath
链接器标志。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¶
这些版本未对已记录的功能或接口进行任何更改。为了支持生态系统更改和/或修复回归,进行了一些实现更新。