foreach ------- Evaluate a group of commands for each value in a list. .. code-block:: cmake foreach( ) endforeach() where ```` is a list of items that are separated by semicolon or whitespace. All commands between ``foreach`` and the matching ``endforeach`` are recorded without being invoked. Once the ``endforeach`` is evaluated, the recorded list of commands is invoked once for each item in ````. At the beginning of each iteration the variable ``loop_var`` will be set to the value of the current item. The commands :command:`break` and :command:`continue` provide means to escape from the normal control flow. Per legacy, the :command:`endforeach` command admits an optional ```` argument. If used, it must be a verbatim repeat of the argument of the opening ``foreach`` command. .. code-block:: cmake foreach( RANGE ) In this variant, ``foreach`` iterates over the numbers 0, 1, ... up to (and including) the nonnegative integer ````. .. code-block:: cmake foreach( RANGE []) In this variant, ``foreach`` iterates over the numbers from ```` up to at most ```` in steps of ````. If ```` is not specified, then the step size is 1. The three arguments ```` ```` ```` must all be nonnegative integers, and ```` must not be smaller than ````; otherwise you enter the danger zone of undocumented behavior that may change in future releases. .. code-block:: cmake foreach(loop_var IN [LISTS []] [ITEMS []]) In this variant, ```` is a whitespace or semicolon separated list of list-valued variables. The ``foreach`` command iterates over each item in each given list. The ```` following the ``ITEMS`` keyword are processed as in the first variant of the ``foreach`` command. The forms ``LISTS A`` and ``ITEMS ${A}`` are equivalent. The following example shows how the ``LISTS`` option is processed: .. code-block:: cmake set(A 0;1) set(B 2 3) set(C "4 5") set(D 6;7 8) set(E "") foreach(X IN LISTS A B C D E) message(STATUS "X=${X}") endforeach() yields :: -- X=0 -- X=1 -- X=2 -- X=3 -- X=4 5 -- X=6 -- X=7 -- X=8