CMAKE:在函数中创建和构建一个列表——使用目录或全局作用域

CMAKE: Creating and building a list within a function -- with directory, or global scope

本文关键字:列表 一个 作用域 全局 函数 创建 构建 CMAKE      更新时间:2023-10-16

我不太熟悉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}")

每次列表都为空。我需要一个可追加的列表,可以从一个函数内建立。

使用宏而不是函数似乎可以做到这一点:

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函数为变量创建局部作用域,而宏使用全局作用域。

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

范围:

  • 宏:具有全局作用。
  • 函数:无论你是否指定,它都有一个局部作用域。

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

  • 宏:配置前将变量名替换为字符串

  • 函数:变量名在执行过程中被替换

总之,在set命令

中添加PARENT_SCOPE标志

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