Это происходит потому, что параметры макроса и специальные значения, такие как 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»:
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