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 版本中被移除。