CMP0124

在版本 3.21 中添加。

foreach() 循环变量仅在循环作用域内可用。

CMake 3.20 及更低版本总是在循环结束时保留循环变量的设置,如果循环之前有值,则保留该值,或者保留为空字符串。CMake 3.21 及更高版本倾向于将循环变量保留在循环开始之前的状态,无论是设置还是未设置。此策略为期望循环变量始终保持设置状态的项目提供兼容性。

此策略的 OLD 行为是在循环结束时设置循环变量,设置为其原始值或空值。NEW 行为是将循环变量恢复到循环开始之前的状态,无论是设置还是未设置。

例如

set(items a b c)

set(var1 "value")
unset(var2)

foreach(var1 IN LISTS items)
endforeach()

foreach(var2 IN LISTS items)
endforeach()

if(DEFINED var1)
  message("var1: ${var1}")
endif()
if(DEFINED var2)
  message("var2: ${var2}")
endif()

OLD 行为下,此代码打印 var1: valuevar2:。在 NEW 行为下,此代码仅打印 var1: value

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

注意

策略的 OLD 行为是 按定义已弃用,并可能在未来的 CMake 版本中移除。