创建一个新列表(作为输出传递) 参数本身)),将所有文件附加到该函数
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
我做错了什么?谢谢。
答案 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()