2009-08-28 15 views
16

引数がオプションのマクロを作成します。指定しない場合、引数の値は空の文字列でなければなりません。これどうやってするの?ご協力いただきありがとうございます。オプションの引数cmakeマクロ

答えて

12

CMakeは(AFAIK)マクロに渡される変数の数をチェックしないので、他のマクロと同様に宣言できます。

また、変数${ARGN}がマクロに渡されるすべての "残りの"変数のリストに展開されます。これは便利かもしれません。 Samさんcommentで述べたように、マクロや関数を呼び出すときに、すべての予想(という名前)引数が指定されない限り

更新 、CMakeのは今に失敗します。

+5

list()コマンドでそれを使用するには、まず、通常の変数にコピーする必要があります。この回答は今や間違っているか、少なくとも私のcmakeにあります2.8.8 – Sam

+2

あなたのマクロは、マクロ定義に名前が付けられていない限り、引き続きオプションの "引数"を持つことができます。つまり、呼び出し元は、マクロの引数リストに指定されていない余分な引数を渡すことができます。あなたのマクロは '$ {ARGN}'を使って余分な引数をチェックできます。注意:ARGNは "普通の" cmake変数ではありません。 list()コマンドで使用するには、最初に通常の変数、 'set(extra_macro_args $ {ARGN})'にコピーする必要があります。次に 'list(LENGTH extra_macro_args num_extra_args)'の後に 'if($ {num_extra_args} GREATER 0)yadayadayada'のようなことをすることができます –

0

これは、引数が指定されていない場合、CMakeはマクロに必要なパラメータの数をチェックしないため、デフォルトで発生します。

29

マクロ定義で指定された引数は、発信者に必要です。ただし、マクロ定義で明示的に指定されていない限り、引き続きオプションの引数を受け入れることができます。

つまり、発信者は、余分な引数(マクロの引数リストに指定されていない)を渡すことができます。あなたのマクロは、${ARGN}変数をチェックすることによって、余分な引数の存在を確認できます。

注意:ARGNは "普通の" cmake変数ではありません。今cmakeのが少なすぎる変数が渡されたかどうかを確認するように見えるん

macro (mymacro required_arg1 required_arg2) 
    # Cannot use ARGN directly with list() command, 
    # so copy it to a variable first. 
    set (extra_macro_args ${ARGN}) 

    # Did we get any optional args? 
    list(LENGTH extra_macro_args num_extra_args) 
    if (${num_extra_args} GREATER 0) 
     list(GET extra_macro_args 0 optional_arg) 
     message ("Got an optional arg: ${optional_arg}") 
    endif() 
endmacro (mymacro) 
関連する問題