CMake では、文字列はリストとして解釈できます。ルールは単純です: リストを形成するには、文字列をセミコロンで分割します。たとえば、文字列値は、、およびone;two;three
の 3 つの要素のリストと考えることができます。one
two
three
コマンドを呼び出すには、コマンド名といくつかの単語を括弧で囲みます。ただし、これらの単語は、コマンドが受け取る引数と 1 対 1 で対応していません。各単語は 0 個以上の引数になり、すべての引数が連結されます。
単語が引用符で囲まれていない限り、リストとして扱われ、複数の引数に展開されます。引用符で囲まれた単語は、常に単一の引数になります。
たとえば、がX
にバインドされ、 が空の文字列にバインドされone;two;three
、が にバインドされているとします。次のコマンド呼び出しには 3 つの単語がありますが、コマンドは 4 つの引数を受け取ります。Y
Z
foo
some_command(${X} ${Y} ${Z})
# The command receives four arguments:
# 1. one
# 2. two
# 3. three
# 4. foo
単語を引用した場合、コマンドは 3 つの引数を受け取ります。
some_command("${X}" "${Y}" "${Z}")
# The command receives three arguments:
# 1. one;two;three
# 2. (the empty list)
# 3. foo
元の質問に戻るには、message
コマンドはさまざまな数の引数を受け取ることができます。すべての引数を受け取り、それらを 1 つの文字列に連結してから、その文字列を出力します。ただし、なんらかの不明な理由により、ゼロ引数は受け入れられません。
複数の引数を使用した場合の動作message
はあまり有用ではないため、単一引用符で囲まれた引数を使用する傾向があります。
set(SOURCES foo.c hoo.h)
message(${SOURCES}) # prints foo.cfoo.h
message("${SOURCES}") # prints foo.c;foo.h
また、set
複数の引数を受け取ると、セミコロンで区切られた引数の文字列を作成します。その後、変数はその文字列に設定されます。