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

时间:2018-06-20 15:22:11

标签: cmake

我跟随thisthis链接编写了一个函数,该函数:

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

    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)
    

我看到的问题是,当我最终使用函数“ 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

我做错了什么?谢谢。

1 个答案:

答案 0 :(得分:1)

使用 PARENT_SCOPE 选项,您可以更改父范围内变量的值,但当前范围内的变量不变。关于{em> PARENT_SCOPE

documentation中明确说明了这一点:
  

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

因此,致电

set(${oLiItems} ${${oLiItems}} ${l} PARENT_SCOPE)

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

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

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