将常量列表传递到cmake宏的方法?

将常量列表传递到cmake宏的方法?,cmake,Cmake,我有这样一个CMake宏: macro( foo a b ) list( FIND b ${a} is_found ) endmacro() 我试着这样称呼它: foo( "test" foo;bar;test ) 这不管用。此外,这也不起作用: foo( "test" "foo;bar;test" ) 在所有情况下,我得到的都等于-1,而事实上它应该被找到。我怎样才能像我想的那样动态地传递列表呢?这是因为宏的参数和特殊值(如ARGN)不是通常的CMake意义上的变量。它们是字符串替换

我有这样一个CMake宏:

macro( foo a b )
  list( FIND b ${a} is_found )
endmacro()
我试着这样称呼它:

foo( "test" foo;bar;test )
这不管用。此外,这也不起作用:

foo( "test" "foo;bar;test" )

在所有情况下,我得到的
都等于
-1
,而事实上它应该被找到。我怎样才能像我想的那样动态地传递列表呢?

这是因为宏的参数和特殊值(如
ARGN
)不是通常的CMake意义上的变量。它们是字符串替换,就像c预处理器对宏所做的那样

您可以将输入参数复制到变量,然后将该变量传递给列表查找:

macro( foo a )
  set( b "${ARGN}" )
  list( FIND b "${a}" is_found )
endmacro()
因此,以下所有变体均可工作:

foo(test foo bar test foo )
foo("test" foo bar test foo )
foo(test foo;bar;test;foo )
foo("test" foo;bar;test;foo )
foo(test "foo;bar;test;foo" )
foo("test" "foo;bar;test;foo" )

更新,更通用的版本-在多个列表中搜索,以“NEXTLIST”字分隔:


谢谢,这个有用。我已经忘记了阿根。另一种情况是,您有两个列表要传递到“foo”中,如果您要传递多个列表,则需要以某种方式将它们分开。可以为每个列表引入一个命名参数,但在本例中,不能将过去的空格分隔值列表简化为宏。或者类似于许多cmake命令,您可以使用特殊的分隔符来区分参数。我已经用一个通用版本更新了答案,它可以在多个列表中搜索。
macro( foo a )
  set( is_found )
  set( foo_current_list )
  foreach( arg ${ARGN} )
    if( arg STREQUAL "NEXTLIST" )
      list( FIND foo_current_list "${a}" foo_is_found )
      list( APPEND is_found ${foo_is_found} )
      set( foo_current_list )
    else()
      list( APPEND foo_current_list ${arg} )
    endif()
  endforeach()
  list( FIND foo_current_list "${a}" foo_is_found )
  list( APPEND is_found ${foo_is_found} )
  unset( foo_is_found )
  unset( foo_current_list )
endmacro()

foo (test bar bar bar NEXTLIST foo test NEXTLIST test test x test)
message( "${is_found}" ) #-1;1;0