CMake 3.20 发行说明¶
从 CMake 3.19 起做出的更改包括以下内容。
新特性¶
预设¶
cmake-presets(7)
获得了对构建和测试预设的支持。
生成器¶
Makefile 生成器,对于某些工具链,现在使用编译器在编译源文件时提取隐式依赖项。
语言¶
现在可以通过
CXX_STANDARD
、CUDA_STANDARD
或OBJCXX_STANDARD
目标属性,或通过Compile Features
功能的cxx_std_23
元特性来指定 C++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 起得到完全支持。Linux 上的
ifx
Fortran 编译器在 oneAPI 2021.1 起得到支持。Windows 上的
ifx
Fortran 编译器尚未得到支持。
Intel oneAPI Classic 编译器 (
icc
,icpc
和ifort
) 继续获得支持,编译器 ID 为Intel
。为 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)
获益于一种新的“工具链”对象类型,其中描述了用于每种已启用语言的编译器。
命令¶
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
选项已学会支持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
目标属性,以支持根据统一构建中的每个源文件生成唯一标识符。它有助于解决匿名命名空间的重复符号问题。现在
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
是符号链接(例如由于ccache
或colornvcc
包装脚本)时查找 CUDA 工具包的支持。此
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
工具来生成隐式依赖项。
自动生成¶
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)
。已通过策略
CMP0120
弃用WriteCompilerDetectionHeader
模块。项目应当迁移到不使用该模块。已弃用
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 上,不再需要重新链接来更改运行时搜索路径,从构建树 RPATH 更改为安装树 RPATH 即可安装 XCOFF 可执行文件和共享库。现在,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¶
英特尔经典版 2021 编译器版本号现在已正确检测到主版本为 2021。CMake 3.20.1 及更低版本不知道英特尔从版本 2021 起对识别宏版本方案所做的更改,并将版本检测为 20.2。
英特尔 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¶
这些版本对已记录的功能或界面没有做出任何更改。对一些实现进行了更新以支持生态系统更改和/或修复回归问题。