# block

Added in version 3.25.

Evaluate a group of commands with a dedicated variable and/or policy scope.

    block([SCOPE_FOR [POLICIES] [VARIABLES]] [PROPAGATE <var-name>...])
      <commands>
    endblock()

All commands between `block()` and the matching `endblock()` are recorded without being invoked. Once the `endblock()` is evaluated, the recorded list of commands is invoked inside the requested scopes, then the scopes created by the `block()` command are removed.

`SCOPE_FOR`

  Specify which scopes must be created.

  `POLICIES`

    Create a new policy scope. This is equivalent to `cmake_policy(PUSH)` with an automatic `cmake_policy(POP)` when leaving the block scope.

  `VARIABLES`

    Create a new variable scope.

  If `SCOPE_FOR` is not specified, this is equivalent to:

      block(SCOPE_FOR VARIABLES POLICIES)

`PROPAGATE`

  When a variable scope is created by the `block()` command, this option sets or unsets the specified variables in the parent scope. This is equivalent to `set(PARENT_SCOPE)` or `unset(PARENT_SCOPE)` commands.

      set(var1 "INIT1")
      set(var2 "INIT2")

      block(PROPAGATE var1 var2)
        set(var1 "VALUE1")
        unset(var2)
      endblock()

      # Now var1 holds VALUE1, and var2 is unset

  This option is only allowed when a variable scope is created. An error will be raised in the other cases.

When the `block()` is inside a `foreach()` or `while()` command, the `break()` and `continue()` commands can be used inside the block.

    while(TRUE)
      block()
         ...
         # the break() command will terminate the while() command
         break()
      endblock()
    endwhile()

## See Also

- `endblock()`

- `return()`

- `cmake_policy()`