Back to Cmake

return

Help/command/return.rst

4.3.23.2 KB
Original Source

return

Return from a file, directory or function.

.. code-block:: cmake

return([PROPAGATE <var-name>...])

When this command is encountered in an included file (via :command:include or :command:find_package), it causes processing of the current file to stop and control is returned to the including file. If it is encountered in a file which is not included by another file, e.g. a CMakeLists.txt, deferred calls scheduled by :command:cmake_language(DEFER) are invoked and control is returned to the parent directory if there is one.

If return() is called in a function, control is returned to the caller of that function. Note that a :command:macro, unlike a :command:function, is expanded in place and therefore cannot handle return().

Policy :policy:CMP0140 controls the behavior regarding the arguments of the command. All arguments are ignored unless that policy is set to NEW.

PROPAGATE .. versionadded:: 3.25

This option sets or unsets the specified variables in the parent directory or function caller scope. This is equivalent to :command:set(PARENT_SCOPE) or :command:unset(PARENT_SCOPE) commands, except for the way it interacts with the :command:block command, as described below.

The PROPAGATE option can be very useful in conjunction with the :command:block command. A return will propagate the specified variables through any enclosing block scopes created by the :command:block commands. Inside a function, this ensures the variables are propagated to the function's caller, regardless of any blocks within the function. If not inside a function, it ensures the variables are propagated to the parent file or directory scope. For example:

.. code-block:: cmake :caption: CMakeLists.txt

cmake_minimum_required(VERSION 3.25)
project(example)

set(var1 "top-value")

block(SCOPE_FOR VARIABLES)
  add_subdirectory(subDir)
  # var1 has the value "block-nested"
endblock()

# var1 has the value "top-value"

.. code-block:: cmake :caption: subDir/CMakeLists.txt

function(multi_scopes result_var1 result_var2)
  block(SCOPE_FOR VARIABLES)
    # This would only propagate out of the immediate block, not to
    # the caller of the function.
    #set(${result_var1} "new-value" PARENT_SCOPE)
    #unset(${result_var2} PARENT_SCOPE)

    # This propagates the variables through the enclosing block and
    # out to the caller of the function.
    set(${result_var1} "new-value")
    unset(${result_var2})
    return(PROPAGATE ${result_var1} ${result_var2})
  endblock()
endfunction()

set(var1 "some-value")
set(var2 "another-value")

multi_scopes(var1 var2)
# Now var1 will hold "new-value" and var2 will be unset

block(SCOPE_FOR VARIABLES)
  # This return() will set var1 in the directory scope that included us
  # via add_subdirectory(). The surrounding block() here does not limit
  # propagation to the current file, but the block() in the parent
  # directory scope does prevent propagation going any further.
  set(var1 "block-nested")
  return(PROPAGATE var1)
endblock()

See Also ^^^^^^^^

  • :command:block
  • :command:function