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

尽管宏的定义和调用方式与函数相同,但它们之间存在一些差异,例如在 SCOPE 和执行时。

范围:

  • 宏:具有全局范围。
  • 功能:无论你不指定,都有一个本地范围。

执行:它像 C++ 或 C 一样工作

  • 宏:变量名在配置前被替换为字符串。

  • 功能:执行过程中替换变量名。

总之,在 set 命令中添加 PARENT_SCOPE 标志

设置(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)

编辑:根据http://www.cmake.org/cmake/help/syntax.html(应该在手册页中,IMO):

CMake 函数为变量创建局部范围,而宏使用全局范围。

于 2011-07-13T12:34:35.427 回答