CMake 3.20 发行说明¶
自 CMake 3.19 以来所做的更改包括以下内容。
新功能¶
预设¶
cmake-presets(7)获得了对构建和测试预设的支持。
生成器¶
Makefile 生成器,对于某些工具链,现在使用编译器在编译源文件时提取隐式依赖项。
语言¶
C++23 编译器模式现在可以通过
CXX_STANDARD、CUDA_STANDARD或OBJCXX_STANDARD目标属性或通过Compile Features功能的``cxx_std_23`` 元特征。当
nvcc是符号链接时,CUDA语言支持现在可以工作,例如由于ccache或colornvcc包装器脚本。添加了
CUDAARCHS环境变量用于初始化CMAKE_CUDA_ARCHITECTURES。在编译器默认值不适合机器 GPU 的情况下很有用。
编译器¶
现在支持编译器 ID 为“NVHPC”的 NVIDIA HPC SDK 编译器。
Intel oneAPI NextGen LLVM 编译器现在支持编译器 ID 为“IntelLLVM”:
从 oneAPI 2021.1 开始,Linux 上的
icx/icpxC/C++ 编译器和 Windows 上的icxC/C++ 编译器得到完全支持。从 oneAPI 2021.1 开始支持 Linux 上的
ifxFortran 编译器。尚不支持 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)获得了一个新的“工具链”对象类型,它描述了用于每种启用语言的编译器。
命令¶
add_custom_command()和add_custom_target()现在在它们的OUTPUT和BYPRODUCTS选项中支持generator expressions。他们的
COMMAND、WORKING_DIRECTORY和DEPENDS选项获得了对新生成器表达式的支持:genex:$<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语言。为关联的 CMAKE_EXPORT_COMPILE_COMMANDS 变量添加了 EXPORT_COMPILE_COMMANDS 目标属性,以允许配置每个目标的导出编译命令。
GENERATED源文件属性现在在任何目录范围内都是可见的,无论其设置范围如何。请参阅政策:policy:CMP0118。添加了
UNITY_BUILD_UNIQUE_ID目标属性以支持在统一构建中生成每个源文件唯一的标识符。它可以帮助解决匿名名称空间的重复符号问题。WIN32_EXECUTABLE目标属性现在适用于 Windows 上的 Clang。添加了
XCODE_EMBED_FRAMEWORKS目标属性,以告诉Xcode生成器嵌入框架。嵌入的各个方面可以使用 XCODE_EMBED_FRAMEWORKS_PATH <XCODE_EMBED_<type>>`、XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY 和 XCODE_EMBED_FRAMEWORKS_REMOVE_HEADERS_ON_COP 进行自定义Y` 目标属性。
模块¶
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`` 特性获得了导出生成目标的选项。
自动生成器¶
奥托莫克 特性现在可以与 per-config 源一起使用。
C测试¶
ctest(1)获得了一个--test-dir选项来指定在其中查找测试的目录。
包装¶
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()。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)到 生成项目构建系统 时,以连字符 (-) 开头的未知命令行参数现在会被错误拒绝。以前他们被默默地忽略了。源文件扩展名现在必须是明确的。有关详细信息,请参阅政策:policy:CMP0115。
LANGUAGE源文件属性现在强制编译为指定语言。请参阅政策:policy:CMP0119。在 AIX 上,安装 XCOFF 可执行文件和共享库不再需要重新链接以将运行时搜索路径从构建树 RPATH 更改为安装树 RPATH。 CMake 现在在安装过程中直接编辑 XCOFF 二进制文件,就像长期以来在 ELF 平台上所做的那样。
对于类似 MSVC 的编译器,CMAKE_CXX_FLAGS <CMAKE_<LANG>_FLAGS>` 的值默认不再包含用于运行时类型信息的
/GR标志。请参阅政策:policy:CMP0117。Ninja 生成器现在转换由
add_custom_command()生成的DEPFILE。有关详细信息,请参阅政策:policy: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 中的:module: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”,而不是使用完整的绝对路径,并且当库或框架嵌入到应用程序包中时在运行时失败(参见:prop_tgt: XCODE_EMBED_<type>)。
3.20.2¶
英特尔经典 2021 编译器版本号现在被正确检测为具有主要版本 2021。CMake 3.20.1 及更低版本不知道英特尔从 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¶
这些版本未对记录的功能或界面进行任何更改。进行了一些实施更新以支持生态系统更改和/或修复回归。