12

次のようなものの違いは何ですか、cmakeで:

set(any_new_var ${old_var})

set(any_new_var "${old_var}")

重要な違いはありますか?いずれかのフォームをいつ使用する必要がありますか?

たとえば、次のミニテストで試してみます

# test.cmake

# Variable 'a' isn't defined.
set(hola "${a}")

# message(${hola})
message("${hola}")

このミニテスト (cmake -P test.cmake) の出力は空行です ('a' が定義されていないため)。最初のメッセージのコメントを外すと、cmake はメッセージ エラーをスローします。

CMake Error at prueba.cmake:6 (message):
  message called with incorrect number of arguments

2 番目のケースでは、エラーが発生せずに空の行が返されるのはなぜですか?

4

1 に答える 1

16

CMake では、文字列はリストとして解釈できます。ルールは単純です: リストを形成するには、文字列をセミコロンで分割します。たとえば、文字列値は、、およびone;two;threeの 3 つの要素のリストと考えることができます。onetwothree

コマンドを呼び出すには、コマンド名といくつかの単語を括弧で囲みます。ただし、これらの単語は、コマンドが受け取る引数と 1 対 1 で対応していません。各単語は 0 個以上の引数になり、すべての引数が連結されます。 単語が引用符で囲まれていない限り、リストとして扱われ、複数の引数に展開されます。引用符で囲まれた単語は、常に単一の引数になります。

たとえば、がXにバインドされ、 が空の文字列にバインドされone;two;three、が にバインドされているとします。次のコマンド呼び出しには 3 つの単語がありますが、コマンドは 4 つの引数を受け取ります。YZfoo

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複数の引数を受け取ると、セミコロンで区切られた引数の文字列を作成します。その後、変数はその文字列に設定されます。

于 2012-11-27T11:43:34.803 に答える