我想创建一个CMake函数:
function(test src_list dst_list) # do something endfunction()
字符串使用方法:
test(${my_list} chg_list)
型这意味着,my_list是一个包含多个字段的列表,并且chg_list将接收在测试函数内部修改的列表。我如何在CMake中创建一个函数来做到这一点?
my_list
chg_list
wbgh16ku1#
在CMake中,函数有自己的作用域,默认情况下,所有对变量的修改都是局部的,除非将CACHE或PARENT_SCOPE作为参数传递给set。在函数内部,如果要修改调用方作用域中的变量,应用途:
CACHE
PARENT_SCOPE
set
set(${dst_list} <something> PARENT_SCOPE)
字符串参见documentation:函数打开一个新的作用域:有关详细信息,请参见set(var PARENT_SCOPE)。
2ic8powd2#
检查在你的函数中你是set(),而不是dst_list,而是${dst_list}。您需要它来将数据返回到父作用域。
set()
dst_list
${dst_list}
9q78igpj3#
下面是我如何解决一个类似的问题,它被标记为这个问题的重复。这个函数接受一个字符串BinaryName并将其添加到父作用域中可用的列表OutVariable中。如果没有定义列表,则创建列表。我使用这个策略来创建新的测试目标,并将这些目标的名称添加到主范围中的目标列表中。感谢@Tsyvarev的评论,让我弄清楚了这一点。
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}")
字符串
vcirk6k64#
现在,在CMake 3.25或更高版本中,您可以使用return语句的PROPAGATE子句来实现这一点,例如。如:
PROPAGATE
function(test dst_list) set(${dst_list} "12;34") return(PROPAGATE ${dst_list}) endfunction()
字符串...读起来更好请参阅the CMake documentation以了解详细信息。
4条答案
按热度按时间wbgh16ku1#
在CMake中,函数有自己的作用域,默认情况下,所有对变量的修改都是局部的,除非将
CACHE
或PARENT_SCOPE
作为参数传递给set
。在函数内部,如果要修改调用方作用域中的变量,应用途:字符串
参见documentation:
函数打开一个新的作用域:有关详细信息,请参见set(var PARENT_SCOPE)。
2ic8powd2#
检查在你的函数中你是
set()
,而不是dst_list
,而是${dst_list}
。您需要它来将数据返回到父作用域。9q78igpj3#
下面是我如何解决一个类似的问题,它被标记为这个问题的重复。这个函数接受一个字符串
BinaryName
并将其添加到父作用域中可用的列表OutVariable
中。如果没有定义列表,则创建列表。我使用这个策略来创建新的测试目标,并将这些目标的名称添加到主范围中的目标列表中。感谢
@Tsyvarev
的评论,让我弄清楚了这一点。字符串
vcirk6k64#
现在,在CMake 3.25或更高版本中,您可以使用return语句的
PROPAGATE
子句来实现这一点,例如。如:字符串
...读起来更好请参阅the CMake documentation以了解详细信息。