| CMP0124 | |
| ------- | |
| .. versionadded:: 3.21 | |
| :command:`foreach` loop variables are only available in the loop scope. | |
| CMake 3.20 and below always leave the loop variable set at the end of the | |
| loop, either to the value it had before the loop, if any, or to the empty | |
| string. CMake 3.21 and above prefer to leave the loop variable in the | |
| state it had before the loop started, either set or unset. This policy | |
| provides compatibility for projects that expect the loop variable to always | |
| be left set. | |
| The ``OLD`` behavior for this policy is to set the loop variable at the | |
| end of the loop, either to its original value, or to an empty value. | |
| The ``NEW`` behavior for this policy is to restore the loop variable to | |
| the state it had before the loop started, either set or unset. | |
| For example: | |
| .. code-block:: cmake | |
| 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() | |
| Under the ``OLD`` behavior, this code prints ``var1: value`` and ``var2:``. | |
| Under the ``NEW`` behavior, this code prints only ``var1: value``. | |
| .. |INTRODUCED_IN_CMAKE_VERSION| replace:: 3.21 | |
| .. |WARNS_OR_DOES_NOT_WARN| replace:: does *not* warn | |
| .. include:: include/STANDARD_ADVICE.rst | |
| .. include:: include/DEPRECATED.rst |