CMAKE:更新函数中的列表不起作用

lig*_*ray 3 cmake

我按照这个这个链接编写了一个函数:

  • 将文件列表作为输入,
  • 将路径附加到每个文件
  • 通过将所有文件附加到新列表(作为输出参数传递给函数本身)来创建新列表

    function(concat_path iLiItems oLiItems cVal) 
      foreach(pfile ${${iLiItems}})
        string(CONCAT l ${${cVal}} ${pfile})
        message(STATUS ${pfile} " - " ${l})
        set(${oLiItems} ${${oLiItems}} ${l} PARENT_SCOPE)
      endforeach()
    endfunction()
    
    function(list_print liItems)
        message(STATUS "The list contains: ")
      foreach(f ${${liItems}})
        message(STATUS ${f})
      endforeach()
    endfunction()
    
    set(PROTO_SRCS base.proto dht.proto)
    
    foreach(pfile ${PROTO_SRCS}) 
      string(REPLACE ".proto" ".pb" fname ${pfile})
      string(CONCAT cc ${fname} ".cc")
      string(CONCAT h ${fname} ".h")
      set(PROTO_CPP_SRCS ${PROTO_CPP_SRCS} ${cc} ${h})
    endforeach()
    
    string(CONCAT path_prefix ${CMAKE_CURRENT_SOURCE_DIR} "/")
    concat_path(PROTO_SRCS PROTO_SRCS_PATH path_prefix)
    list_print(PROTO_SRCS_PATH)
    
    Run Code Online (Sandbox Code Playgroud)

我看到的问题是,当我最终使用函数“list_print”打印时,我看到输出列表(PROTO_SRCS_PATH)中只存在一个元素,而我期望有两个元素对应于两个输入文件:

-- base.proto - C:/Users/vaddina/workspace/protobuf-tests/app-wo-findprotobuf/base.proto
-- dht.proto - C:/Users/vaddina/workspace/protobuf-tests/app-wo-findprotobuf/dht.proto
-- The list contains:
-- C:/Users/vaddina/workspace/protobuf-tests/app-wo-findprotobuf/dht.proto
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么 ?谢谢。

Tsy*_*rev 5

使用PARENT_SCOPE选项,您可以更改父作用域中的变量值,但当前作用域中的变量保持不变。关于PARENT_SCOPE 的文档对此进行了明确描述:

\n\n
\n

此命令会将变量的值设置到父目录或调用函数中(以适用于当前情况的为准)。变量\xe2\x80\x99s 值的先前状态在当前范围内保持不变(例如,如果之前未定义,则它仍然是未定义,如果它有一个值,它仍然是该值)。

\n
\n\n

因此,调用

\n\n
set(${oLiItems} ${${oLiItems}} ${l} PARENT_SCOPE)\n
Run Code Online (Sandbox Code Playgroud)\n\n

始终将空值视为第二个参数(您永远不会在当前范围内分配变量)。因此父作用域中的变量始终由 分配(而不是附加!)${l}

\n\n

通常,使用 PARENT_SCOPE 设置变量仅执行一次。中间计算应该使用并更新当前范围内的变量:

\n\n
function(concat_path iLiItems oLiItems cVal) \n  foreach(pfile ${${iLiItems}})\n    string(CONCAT l ${${cVal}} ${pfile})\n    message(STATUS ${pfile} " - " ${l})\n    set(${oLiItems} ${${oLiItems}} ${l}) # Update list in the current scope only\n  endforeach()\n  # Before return, propagate variable\'s value to the parent scope.\n  set(${oLiItems} ${${oLiItems}} PARENT_SCOPE)\nendfunction()\n
Run Code Online (Sandbox Code Playgroud)\n