【问题标题】:CMake: Output a list with delimitersCMake:输出带有分隔符的列表
【发布时间】:2013-07-16 00:14:29
【问题描述】:

默认情况下,CMake 输出不带分隔符的列表,例如

set(my_list a b c d)
message(${my_list})

输出

abcd

您如何(轻松)使 CMake 输出类似于实际存储的内容?

a;b;c;d

(一个典型的用例是输出搜索路径列表)

【问题讨论】:

    标签: cmake


    【解决方案1】:

    将取消引用的变量括在引号中。

    set(my_list a b c d)
    message("${my_list}")
    

    输出

    a;b;c;d
    

    【讨论】:

    • 谢谢。输出到文件时也是如此。我希望这件事能在文档中得到更好的解释......
    • @Antonio 没有引号的只是 ${my_list} 是一个列表。将列表传递给函数(如消息)就像传递多个参数一样传递它。所以 OP 相当于 message(a b c d) ,它将每个元素连接为一个字符串。
    • 有时 CMake 没有什么意义,为什么在 ${my_list}"${my_list}" 上发消息很重要?让我觉得他们真的没有把脚本语言的细节考虑得很好。
    • 我只是想到可以解释"${}"${} 的一些行为,我认为message(${myList}) 扩展为message(a b c d),cmake 将其解释为“消息,连接a,b, c,d" 你得到"abcd"。而如果你把它放在引号中,它会将"${mylist}" 扩展为"a;b;c;d"(一个带有 ;s 的字符串)并打印出该字符串。
    【解决方案2】:

    您可以编写一个函数来将列表中的项目与分隔符连接在一起,然后将其打印出来。比如这样一个函数:

    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} 变量访问的额外参数,可以大大简化代码。
    【解决方案3】:

    当您在项目之间有带有; 的字符串时,您还可以使用string(REPLACE ...) 将这些; 替换为任何其他分隔符。例如:

    set(my_list a b c d)
    string(REPLACE ";"  ", " str "${my_list}")
    message(STATUS ${str})
    

    【讨论】:

    • 如果项目可能包含转义的分号 (\;),则此解决方案不好,但我喜欢这个想法。
    猜你喜欢
    • 2017-12-07
    • 2019-04-09
    • 2016-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    相关资源
    最近更新 更多