9

私は cmake のスコープ規則に完全に精通しているわけではありません。IDL の RPC コード生成を実行しながら、さまざまなファイルのリストを作成する必要があります。

function(generate_rpc file_name)
  set(PROTO_FILES ${PROTO_FILES} ${file_name})
endfunction(generate_rpc)

generate_rpc(BasicProtocol.proto)
generate_rpc(dummy.proto)

message(STATUS "PROTO FILES: ${PROTO_FILES}")

リストは毎回空です。関数内から構築できる追加可能なリストが必要です。

4

2 に答える 2

11

マクロは関数と同じように定義され、呼び出されますが、スコープやその実行時など、いくつかの違いがあります。

範囲:

  • マクロ: グローバル スコープを持ちます。
  • 機能: 指定しなくても、ローカル スコープがあります。

実行: C++ または C のように動作します

  • マクロ: 変数名は設定前に文字列に置き換えられます。

  • 機能: 変数名は実行中に置き換えられます。

結論として、set コマンドに PARENT_SCOPE フラグを追加します。

set(PROTO_FILES ${PROTO_FILES} ${file_name} PARENT_SCOPE)

于 2013-11-15T11:10:24.877 に答える
10

関数の代わりにマクロを使用すると、次のようになります。

macro(generate_rpc file_name)
  set(PROTO_FILES ${PROTO_FILES} ${file_name})
endmacro(generate_rpc)

EDIT: http ://www.cmake.org/cmake/help/syntax.htmlによると(IMOのマニュアルページにあるはずです):

CMake 関数は変数のローカル スコープを作成し、マクロはグローバル スコープを使用します。

于 2011-07-13T12:34:35.427 に答える