cmake 使用OUT参数从函数返回列表

ojsjcaue  于 2023-08-05  发布在  其他
关注(0)|答案(4)|浏览(123)

我想创建一个CMake函数:

function(test src_list dst_list)
# do something
endfunction()

字符串
使用方法:

test(${my_list} chg_list)


这意味着,my_list是一个包含多个字段的列表,并且chg_list将接收在测试函数内部修改的列表。
我如何在CMake中创建一个函数来做到这一点?

wbgh16ku

wbgh16ku1#

在CMake中,函数有自己的作用域,默认情况下,所有对变量的修改都是局部的,除非将CACHEPARENT_SCOPE作为参数传递给set。在函数内部,如果要修改调用方作用域中的变量,应用途:

set(${dst_list} <something> PARENT_SCOPE)

字符串
参见documentation
函数打开一个新的作用域:有关详细信息,请参见set(var PARENT_SCOPE)。

2ic8powd

2ic8powd2#

检查在你的函数中你是set(),而不是dst_list,而是${dst_list}。您需要它来将数据返回到父作用域。

9q78igpj

9q78igpj3#

下面是我如何解决一个类似的问题,它被标记为这个问题的重复。这个函数接受一个字符串BinaryName并将其添加到父作用域中可用的列表OutVariable中。如果没有定义列表,则创建列表。我使用这个策略来创建新的测试目标,并将这些目标的名称添加到主范围中的目标列表中。
感谢@Tsyvarev的评论,让我弄清楚了这一点。

function(AddToListFromFunction BinaryName OutVariable)
    if ("${${OutVariable}}" STREQUAL "")
        message(STATUS "1")
        set(${OutVariable} ${BinaryName} PARENT_SCOPE)
        message(STATUS "OutVariable: ${OutVariable} ${${OutVariable}}")
    else ()
        message(STATUS "2")
        set(${OutVariable} "${${OutVariable}}" "${BinaryName}" PARENT_SCOPE)
    endif ()
endfunction()
AddToListFromFunction(MyBinary1 MyTests)
AddToListFromFunction(MyBinary2 MyTests)
message(STATUS "MyTests Variable:  ${MyTests}")

字符串

vcirk6k6

vcirk6k64#

现在,在CMake 3.25或更高版本中,您可以使用return语句的PROPAGATE子句来实现这一点,例如。如:

function(test dst_list)
  set(${dst_list} "12;34")
  return(PROPAGATE ${dst_list})
endfunction()

字符串
...读起来更好请参阅the CMake documentation以了解详细信息。

相关问题