我并不完全熟悉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}")
每次列表都是空的。我需要可以在函数内构建的可附加列表。
答案 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函数为变量创建局部范围,宏使用全局范围。