​https://cmake.org/cmake/help/latest/command/list.html​

cmake中的set操作用给变量赋值(cmake中为什么没有赋值语句?我想可能因为cmake的函数没有返回值的原因吧!):

set(VAR_NAME v1 ... [PARENT_SCOPE])

当传入多个v时VAR_NAME变成列表,PARENT_SCOPE在函数定义中可以起到返回值的作用。

因为函数没有返回,所以也就没函数嵌套的概念...

Reading

list(LENGTH <list> <out-var>)
list(GET <list> <element index> [<index> ...] <out-var>)
list(JOIN <list> <glue> <out-var>)
list(SUBLIST <list> <begin> <length> <out-var>)

set(LIST_VAL a b c d e f g)
set(LIST_VAL1 "A B C D E F G")
message(${LIST_VAL}) # abcdefg
message(${LIST_VAL1}) # A B C D E F G
list(LENGTH LIST_VAL LENGTH_1) # 7
list(LENGTH LIST_VAL1 LENGTH_2) # 1
message(${LENGTH_1})
message(${LENGTH_2})
list(GET LIST_VAL 1 2 RESULT)
message(${RESULT}) # bc
list(JOIN LIST_VAL , OUT_LIST)
message(${OUT_LIST}) # a,b,c,d,e,f,g

list(SUBLIST LIST_VAL 2 4 OUT_LIST_1)
message(${OUT_LIST_1}) # cdef

挺简单的,一个例子测完所有功能...

Search

list(FIND <list> <value> <out-var>)


set(LIST_VAL a b c d e f g)

list(FIND LIST_VAL c RESULT)
message(${RESULT}) # 2

找到之后返回 下标, 没有就返回 -1

Modification

list(APPEND <list> [<element>...])
list(INSERT <list> <index> [<element>...])
list(POP_BACK <list> [<out-var>...])
list(POP_FRONT <list> [<out-var>...])
list(PREPEND <list> [<element>...])
list(REMOVE_ITEM <list> <value>...)
list(REMOVE_AT <list> <index>...)

set(LIST_1 1 2 3)
list(APPEND LIST_1 4)
list(PREPEND LIST_1 0)
list(INSERT LIST_1 2 50) # 在2的位置插入(基0的下标)
message(${LIST_1}) # 0150234

list(APPEND LIST_1 100)
message(${LIST_1}) # 0150234100
list(POP_BACK LIST_1 OUT_POP_BACK)
message(${OUT_POP_BACK}) # 100 虽然输出时是连续的
message(${LIST_1}) # 0150234 100被弹出了

list(PREPEND LIST_1 200)
list(POP_FRONT LIST_1 O1 O2)
message(${O1}) # 200
message(${O2}) # 0
message(${LIST_1}) # 150234

list(REMOVE_AT LIST_1 2)
message(${LIST_1}) # 1234 --> 124
list(FILTER <list> {INCLUDE | EXCLUDE} REGEX <regex>)

set(LIST_1 1 2 3 4 5 6 60 600 666)
list(FILTER LIST_1 INCLUDE REGEX ^6.*)
message(${LIST_1})

INCLUDE 结果将包含符合条件的值

EXCLUDE 结果将排除符合条件的值

list(REMOVE_DUPLICATES <list>)
set(LIST_1 1 2 3 4 5 6 - 60 - 60 - 6)
list(REMOVE_DUPLICATES LIST_1)
message(${LIST_1})

去重...

TRANSFORM操作

list(TRANSFORM <list> <ACTION> [<SELECTOR>]
[OUTPUT_VARIABLE <output variable>])

让list中的每元素(或SELECTOR选中的元素)通过指定的ACTION转换,如果有提供output则将结果输出到output,否则原地(in-place)转换...

转换的动作大多都是针对字符串(cmake中只有字符串类型)

先看ACTION:
list(TRANSFORM <list> <APPEND|PREPEND> <value> ...)

set(MY_LIST 1 2 3 4 5 6 7 8 9)

list(TRANSFORM MY_LIST PREPEND he-)
list(TRANSFORM MY_LIST APPEND 0,)

message(${MY_LIST})
out:
he-10,he-20,he-30,he-40,he-50,he-60,he-70,he-80,he-90,

每个元素,之前或之后添加指定的字符串

list(TRANSFORM <list> <TOLOWER|TOUPPER> ...)
list(TRANSFORM <list> STRIP ...)

大小写转换和两端去除空白,这个简单,就不举例了...

list(TRANSFORM <list> GENEX_STRIP ...)

这个涉及到了生成表达式,先不看吧,下一篇博客研究过之后再来把它补上

list(TRANSFORM <list> REPLACE <regular_expression>
<replace_expression> ...)

set(MY_LIST a.txt b.txt c.jpg b.txt d.jpg e.png)
list(TRANSFORM MY_LIST REPLACE [[(.*)\.txt]] "\\1.文本")
message(${MY_LIST})

out:
a.文本b.文本c.jpgb.文本d.jpge.png

对每个元素,使用正则匹配并替换

选择器:
list(TRANSFORM <list> <ACTION> AT <index> [<index> ...] ...)

set(MY_LIST a.txt b.txt c.jpg b.txt d.jpg e.png)
list(TRANSFORM MY_LIST APPEND "追加, " AT 0 1 2)
message(${MY_LIST})

index指定基于0的下标

list(TRANSFORM <list> <ACTION> FOR <start> <stop> [<step>] ...)


set(MY_LIST 0 1 2 3 4 5 6 7 8 9)
list(TRANSFORM MY_LIST APPEND "追加, " FOR 0 6 2)
message(${MY_LIST})
out:
0追加, 12追加, 34追加, 56追加, 789

是不是跟FOREACH很像?

list(TRANSFORM <list> <ACTION> REGEX <regular_expression> ...)

set(MY_LIST 0 1.txt 2.txt 3 4 5 6 7 8 9.txt)
list(TRANSFORM MY_LIST APPEND "追加, " REGEX [[\.txt$]])
message(${MY_LIST})
out:
01.txt追加, 2.txt追加, 3456789.txt追加,

使用正则选择...


Ordering

list(REVERSE <list>)

这个就不说了,太简单了...

list(SORT <list> [COMPARE <compare>] [CASE <case>] [ORDER <order>])

排序

  • 肯定要比大小这是 -- compare 的工作
  • case 是否大小写敏感?
  • order 升序还是降序?

compare:

  • STRING 字符串比较 -- 默认的
  • FILE_BASENAME 按文件名比较

case:

  • SENSITIVE 默认
  • ​INSENSITIVE 大小写不敏感

​order:

  • ASCENDING 升序 默认
  • ​DESCENDING 降序

New in version 3.18: Added the ​​COMPARE NATURAL​ option.(这个没法试...)

set(MY_LIST A b c D e F g)
list(SORT MY_LIST) # 字符串 大小写敏感 升序
message(${MY_LIST}) # ADFbceg

set(MY_LIST A b c D e F g)
list(SORT MY_LIST CASE INSENSITIVE) # 字符串 大小写不敏感 升序
message(${MY_LIST}) # AbcDeFg

set(MY_LIST A b c D e F g)
list(SORT MY_LIST CASE INSENSITIVE ORDER DESCENDING) # 字符串 大小写不敏感 降序
message(${MY_LIST}) # gFeDcbA