CMAKE:在函数中创建和构建列表 - 包含目录或全局范围

时间:2011-07-13 12:28:42

标签: c++ cmake compilation build-system

我并不完全熟悉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}")

每次列表都是空的。我需要可以在函数内构建的可附加列表。

2 个答案:

答案 0 :(得分:11)

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

<强> SCOPE:

  • 宏:具有全球范围。
  • 功能:具有本地范围,无论您是否指定。

执行:它的工作方式类似于C ++或C

  • 宏:在配置之前,变量名称将替换为字符串。

  • 功能:在执行期间替换变量名称。

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

设置(PROTO_FILES $ {PROTO_FILES} $ {file_name} PARENT_SCOPE)

答案 1 :(得分:8)

使用宏而不是函数似乎是这样做的:

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

编辑: 根据{{​​3}}(应该在手册页中,IMO):

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