Способ передать в константный список в макрос Cmake? - PullRequest
1 голос
/ 30 сентября 2011

У меня есть макрос CMake, например:

macro( foo a b )
  list( FIND b ${a} is_found )
endmacro()

И я пытаюсь назвать его так:

foo( "test" foo;bar;test )

Это не работает.Также это не работает:

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

Во всех случаях я получаю is_found, равный -1, когда на самом деле это должно было быть найдено.Как я могу передать список на лету, как я хочу?

1 Ответ

3 голосов
/ 01 октября 2011

Это происходит потому, что параметры макроса и специальные значения, такие как 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...