cmake(4) -- 列表操作
原创
©著作权归作者所有:来自51CTO博客作者luan_225的原创作品,请联系作者获取转载授权,否则将追究法律责任
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(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