【发布时间】:2013-07-16 00:14:29
【问题描述】:
默认情况下,CMake 输出不带分隔符的列表,例如
set(my_list a b c d)
message(${my_list})
输出
abcd
您如何(轻松)使 CMake 输出类似于实际存储的内容?
a;b;c;d
(一个典型的用例是输出搜索路径列表)
【问题讨论】:
标签: cmake
默认情况下,CMake 输出不带分隔符的列表,例如
set(my_list a b c d)
message(${my_list})
输出
abcd
您如何(轻松)使 CMake 输出类似于实际存储的内容?
a;b;c;d
(一个典型的用例是输出搜索路径列表)
【问题讨论】:
标签: cmake
将取消引用的变量括在引号中。
set(my_list a b c d)
message("${my_list}")
输出
a;b;c;d
【讨论】:
message(a b c d) ,它将每个元素连接为一个字符串。
${my_list} 或 "${my_list}" 上发消息很重要?让我觉得他们真的没有把脚本语言的细节考虑得很好。
"${}" 与${} 的一些行为,我认为message(${myList}) 扩展为message(a b c d),cmake 将其解释为“消息,连接a,b, c,d" 你得到"abcd"。而如果你把它放在引号中,它会将"${mylist}" 扩展为"a;b;c;d"(一个带有 ;s 的字符串)并打印出该字符串。
您可以编写一个函数来将列表中的项目与分隔符连接在一起,然后将其打印出来。比如这样一个函数:
function (ListToString result delim)
list(GET ARGV 2 temp)
math(EXPR N "${ARGC}-1")
foreach(IDX RANGE 3 ${N})
list(GET ARGV ${IDX} STR)
set(temp "${temp}${delim}${STR}")
endforeach()
set(${result} "${temp}" PARENT_SCOPE)
endfunction(ListToString)
然后,你可以这样使用它:
set(my_list a b c d)
ListToString(str ", " ${my_list})
message(STATUS "${str}")
哪些输出:
a, b, c, d
【讨论】:
${ARGN} 变量访问的额外参数,可以大大简化代码。
当您在项目之间有带有; 的字符串时,您还可以使用string(REPLACE ...) 将这些; 替换为任何其他分隔符。例如:
set(my_list a b c d)
string(REPLACE ";" ", " str "${my_list}")
message(STATUS ${str})
【讨论】:
\;),则此解决方案不好,但我喜欢这个想法。