CMP0180

在版本 3.31 中添加。

project() 命令总是将 `_*` 设置为普通变量。

在 CMake 3.29 及更早版本中,project() 命令将 `_SOURCE_DIR`、`_BINARY_DIR` 和 `_IS_TOP_LEVEL` 设置为缓存条目,但不是普通变量。CMake 3.30 开始将它们设置为普通变量,但仅当它们已作为普通变量设置时。这是为了在策略 CMP0169 的 NEW 行为下保留对某些 FetchContent 用例的支持,同时还保留调用具有相同项目名称的 `project()` 的嵌套目录的行为。有关详细信息,请参阅 3.30.3、3.30.4 和 3.30.5 的发布说明。

CMake 3.31 及更高版本倾向于始终将 `_SOURCE_DIR`、`_BINARY_DIR` 和 `_IS_TOP_LEVEL` 设置为缓存条目和普通变量,无论现有缓存或普通变量是什么。此策略为未更新以期望此行为的项目提供了兼容性。

此策略的 `OLD` 行为仅在调用 `project()` 时,如果该名称的普通变量已存在,则将 `_SOURCE_DIR`、`_BINARY_DIR` 和 `_IS_TOP_LEVEL` 设置为普通变量。此策略的 `NEW` 行为在调用 `project()` 时,总是将 `_SOURCE_DIR`、`_BINARY_DIR` 和 `_IS_TOP_LEVEL` 设置为普通变量。

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

注意

策略的 `OLD` 行为根据定义已被弃用,并可能在将来的 CMake 版本中移除。