CMP0149

在 3.27 版本中新增。

Visual Studio Generators 默认选择最新的 Windows SDK。

Visual Studio Generators 会选择一个 Windows SDK 版本,将其放入 `.vcxproj` 文件中的 `WindowsTargetPlatformVersion` 设置。CMake 将 `CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION` 变量设置为选定的 SDK 版本。

在 CMake 3.27 之前,SDK 版本始终由 `CMAKE_SYSTEM_VERSION` 变量的值选择。用户或工具链文件可以将该变量设置为主机系统上可用 Windows SDK 的确切版本之一。由于 `CMAKE_SYSTEM_VERSION` 默认为 `CMAKE_HOST_SYSTEM_VERSION`,并且不能保证存在匹配的 Windows SDK 版本,因此在没有完全匹配的情况下,CMake 必须回退到使用最新的 Windows SDK 版本。这种方法存在问题。

  • 是否选择最新的 Windows SDK 取决于 Windows 的主机版本是否恰好匹配可用的 SDK 版本。

  • 可能会选择一个旧的 Windows SDK 版本,该版本未针对 C11 等较新的语言标准进行更新。

CMake 3.27 及更高版本倾向于忽略 `CMAKE_SYSTEM_VERSION` 的确切值,并默认选择可用的最新 SDK 版本。可以通过 `CMAKE_GENERATOR_PLATFORM` 变量中的 `version=` 字段显式指定 SDK 版本。请参阅 Visual Studio Platform Selection

此策略为项目、工具链文件和构建脚本提供兼容性,这些项目、工具链文件和构建脚本尚未迁移到使用 `CMAKE_SYSTEM_VERSION` 来指定确切的 SDK 版本。

注意

此策略必须在项目顶部的第一个 `project()` 或 `enable_language()` 命令调用之前设置。届时 Visual Studio Generators 会选择 Windows SDK。

此策略的 `OLD` 行为是尽可能使用 `CMAKE_SYSTEM_VERSION` 的确切值。此策略的 `NEW` 行为是忽略它。

此策略是在 CMake 版本 3.27 中引入的。可以通过 `cmake_policy()` 或 `cmake_minimum_required()` 设置。如果未设置,CMake 不会发出警告,并使用 `OLD` 行为。

注意

根据定义,策略的 `OLD` 行为是不推荐,并且可能会在未来的 CMake 版本中移除。