2011-09-30 9 views
1

私はそうのようなCMakeのマクロを持っている:定数リストをcmakeマクロに渡す方法は?

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

そして、私はそうのようにそれを呼び出すようにしてみてください。

foo("test" foo;bar;test) 

これは動作しません。また、これは動作しません:

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

私は-1に等しいis_foundを得るすべての場合において、実際にはそれが発見されている必要があるとき。私が望むようにオンザフライでどのようにリストを渡すことができますか?

答えて

3

これは、マクロのパラメータと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 
+0

ありがとう、これは動作します。私はARGNを忘れていました。 'foo'に渡したいリストが2つある別のシナリオはどうですか? –

+0

複数のリストを渡す場合は、何らかの方法でそれらを区切る必要があります。各リストに名前付き引数を導入できますが、この場合はスペースで区切られた値のリストを単純にマクロに単純化することはできません。あるいは、多くのcmakeコマンドと同様に、特殊な区切り文字を使用して引数を区別することができます。私は複数のリストを検索することができる汎用バージョンで答えを更新しました。 –