return

从文件、目录或函数中返回。

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

当在被包含的文件(通过 include()find_package())中遇到此命令时,它会停止当前文件的处理并将控制权交还给包含它的文件。如果它在未被其他文件包含的文件(例如 CMakeLists.txt)中被遇到,则会调用由 cmake_language(DEFER) 安排的延迟调用,并将控制权交还给父目录(如果存在)。

如果 return() 在函数中被调用,控制权将返回给该函数的调用者。请注意,macro()function() 不同,它是就地展开的,因此无法处理 return()

策略 CMP0140 控制关于该命令参数的行为。除非该策略设置为 NEW,否则所有参数都将被忽略。

PROPAGATE

在 3.25 版本中新增。

此选项用于在父目录或函数调用者作用域中设置或取消设置指定的变量。这等同于 set(PARENT_SCOPE)unset(PARENT_SCOPE) 命令,区别在于它与下文描述的 block() 命令的交互方式。

PROPAGATE 选项与 block() 命令结合使用非常有用。return 会将指定的变量传播到由 block() 命令创建的任何封闭块作用域中。在函数内部,这确保了变量被传播到函数的调用者,而无需考虑函数内的任何块。如果不在函数内部,它确保变量被传播到父文件或父目录作用域。例如:

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"
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()

另请参阅