【问题标题】:CMAKE: Updating a list in a function does not workCMAKE:更新函数中的列表不起作用
【发布时间】:2018-06-20 15:22:11
【问题描述】:

我按照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

我做错了什么?谢谢你。

【问题讨论】:

    标签: cmake


    【解决方案1】:

    使用 PARENT_SCOPE 选项可以更改父范围内的变量值,但 当前范围内的变量不会改变。这在 documentation 关于 PARENT_SCOPE 中有明确描述:

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

    因此,调用

    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()
    

    【讨论】:

    • 感谢您的回答。它解决了问题。我确实很狡猾。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多