Cmake命令之list介绍

Cmake命令之list介绍

2023年7月26日发(作者:)

Cmake命令之list介绍命令格式list (subcommand [])subcommand表为具体的列表操作⼦命令,例如读取、查找、修改、排序等。为待操作的列表变量,[]为对列变量操作需要使⽤的参数表,不同的⼦命令对应的参数也不⼀致。list命令即对列表的⼀系列操作,cmake中的列表变量是⽤分号;分隔的⼀组字符串,创建列表可以使⽤set命令(参考set命令),例如:set (var a b c d)创建了⼀个列表 "a;b;c;d",⽽set (var "a b c d")则是只创建了⼀个变量"a c c d"。list命令的具体格式根据⼦命令不同会有所区别。命令解析  对列表的操作分为读取、查找、修改、排序等4个⼤类,下⾯按照这四个⼤类逐⼀对列表的⼦命令进⾏介绍。1. 列表的读取1.1

LENGTH:⼦命令LENGTH⽤于读取列表长度list (LENGTH )  为新创建的变量,⽤于存储列表的长度。# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test a b c d) # 创建列表变量"a;b;c;d"list (LENGTH list_test length)message (">>> LENGTH: ${length}")# 输出>>> LENGTH: 41.2

GET:⼦命令GET⽤于读取列表中指定索引的的元素,可以指定多个索引。list (GET [ ...] )  为列表元素的索引,从0开始编号,索引0的元素为列表中的第⼀个元素;索引也可以是负数,-1表⽰列表的最后⼀个元素,-2表⽰列表倒数第⼆个元素,以此类推。注意:当索引(不管是正还是负)超过列表的长度,运⾏会报错(list index: XX out of range)。  为新创建的变量,存储指定索引元素的返回结果,也是⼀个列表。# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test a b c d) # 创建列表变量"a;b;c;d"list (GET list_test 0 1 -1 -2 list_new)message (">>> GET: ${list_new}")# 输出>>> GET: a;b;d;c1.3

JOIN:⼦命令JOIN⽤于将列表中的元素⽤连接字符串连接起来组成⼀个字符串,注意,此时返回的结果已经不是⼀个列表。list (JOIN )  将列表中的元素⽤链接起来,组成⼀个字符串后,返回给变量。对于不属于列表的多个字符串的连接操作,可以使⽤string()命令的连接操作。# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test a b c d) # 创建列表变量"a;b;c;d"list (JOIN list_test -G- list_new)message (">>> JOIN: ${list_new}")# 输出>>> JOIN: a-G-b-G-c-G-d1.4

SUBLIST:⼦命令SUBLIST⽤于获取列表中的⼀部分(⼦列表)。list (SUBLIST )  返回列表中,从索引开始,长度为的⼦列表。如果长度为0,返回的时空列表。如果长度为-1或列表的长度⼩于+,那么将列表中从索引开始的剩余元素返回。# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test a b c d) # 创建列表变量"a;b;c;d"list (SUBLIST list_test 1 2 list_new)message (">>> SUBLIST: ${list_new}")list (SUBLIST list_test 1 0 list_new)message (">>> SUBLIST: ${list_new}")list (SUBLIST list_test 1 -1 list_new)message (">>> SUBLIST: ${list_new}")list (SUBLIST list_test 1 8 list_new)message (">>> SUBLIST: ${list_new}")# 输出>>> SUBLIST: b;c>>> SUBLIST:>>> SUBLIST: b;c;d>>> SUBLIST: b;c;d2. 列表的查找2.1

FIND:⼦命令FIND⽤于查找列表是否存在指定的元素。list (FIND )  如果列表中存在,那么返回在列表中的索引,如果未找到则返回-1。# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test a b c d) # 创建列表变量"a;b;c;d"list (FIND list_test d list_index)message (">>> FIND 'd': ${list_index}")list (FIND list_test e list_index)message (">>> FIND 'e': ${list_index}")# 输出>>> FIND 'd': 3>>> FIND 'e': -13. 列表的修改  列表的修改⼦命令可能会改变原列表的值。3.1

APPEND:⼦命令APPEND⽤于将元素追加到列表。list (APPEND [ ...])  此命令会改变原列表的值。# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test a b c d) # 创建列表变量"a;b;c;d"list (APPEND list_test 1 2 3 4)message (">>> APPEND: ${list_test}")# 输出>>> APPEND: a;b;c;d;1;2;3;43.2

FILTER:⼦命令FILTER⽤于根据正则表达式包含或排除列表中的元素。list (FILTER REGEX )  根据模式的匹配结果,将元素添加(INCLUDE选项)到列表或者从列表中排除(EXCLUDE选项)。此命令会改变原来列表的值。模式REGEX表明会对列表进⾏正则表达式匹配。(从官⽅⽂档⽬前未找到其他模式)# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test a b c d 1 2 3 4) # 创建列表变量"a;b;c;d;1;2;3;4"message (">>> the LIST is: ${list_test}")list (FILTER list_test INCLUDE REGEX [a-z])message (">>> FILTER: ${list_test}")list (FILTER list_test EXCLUDE REGEX [a-z])message (">>> FILTER: ${list_test}")# 输出>>> the LIST is: a;b;c;d;1;2;3;4>>> FILTER: a;b;c;d>>> FILTER:

3.3

INSERT:⼦命令INSERT⽤于在指定位置将元素(⼀个或多个)插⼊到列表中。list (INSERT [ ...])  为列表指定的位置,如果元素的位置超出列表的范围,会报错。此命令会改变原来列表的值。# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test a b c d) # 创建列表变量"a;b;c;d"list (INSERT list_test 0 8 8 8 8)message (">>> INSERT: ${list_test}")list (INSERT list_test -1 9 9 9 9)message (">>> INSERT: ${list_test}")list (LENGTH list_test lenght)list (INSERT list_test ${length} 0)message (">>> INSERT: ${list_test}")# 输出>>> INSERT: 8;8;8;8;a;b;c;d>>> INSERT: 8;8;8;8;a;b;c;9;9;9;9;d>>> INSERT: 8;8;8;8;a;b;c;9;9;9;9;d;03.4

POP_BACK:⼦命令POP_BACK⽤于将列表中最后元素移除。list (POP_BACK [...])  如果未指定输出变量,则仅仅是将原列表的最后⼀个元素移除。如果指定了输出变量,则会将最后⼀个元素移⼊到该变量,并将元素从原列表中移除。如果指定了多个输出变量,则依次将原列的最后⼀个元素移⼊到输出变量中,如果输出变量个数⼤于列表的长度,那么超出部分的输出变量未定义。# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test a b c d) # 创建列表变量"a;b;c;d"list (POP_BACK list_test)message (">>> POP_BACK: ${list_test}")list (POP_BACK list_test outvar1 outvar2 outvar3 outvar4)message (">>> POP_BACK: ${outvar1}、${outvar2}、${outvar3}、${outvar4}")# 输出>>> POP_BACK: a;b;c>>> POP_BACK: c、b、a、3.5

POP_FRONT:⼦命令POP_FRONT⽤于将列表中第⼀个元素移除。list (POP_FRONT [...])  如果未指定输出变量,则仅仅是将原列表的第⼀个元素移除。如果指定了输出变量,则会将第⼀个元素移⼊到该变量,并将元素从原列表中移除。如果指定了多个输出变量,则依次将原列的第⼀个元素移⼊到输出变量中,如果输出变量个数⼤于列表的长度,那么超出部分的输出变量未定义。# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test a b c d) # 创建列表变量"a;b;c;d"list (POP_FRONT list_test)message (">>> POP_FRONT: ${list_test}")list (POP_FRONT list_test outvar1 outvar2 outvar3 outvar4)message (">>> POP_FRONT: ${outvar1}、${outvar2}、${outvar3}、${outvar4}")# 输出>>> POP_FRONT: b;c;d>>> POP_FRONT: b、c、d、3.6

PREPEND:⼦命令PREPEND⽤于将元素插⼊到列表的0索引位置。list (PREPEND [ ...])  如果待插⼊的元素是多个,则相当于把多个元素整体“平移”到原列表0索引的位置。# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test a b c d) # 创建列表变量"a;b;c;d"list (PREPEND list_test z)message (">>> PREPEND: ${list_test}")list (PREPEND list_test p q r s t)message (">>> POP_FRONT: ${list_test}")# 输出>>> PREPEND: z;a;b;c;d>>> PREPEND: p;q;r;s;t;z;a;b;c;d3.7

REMOVE_ITEM:⼦命令REMOVE_ITEM⽤于将指定的元素从列表中移除。list (REMOVE_ITEM [ ...])  注意:指定的是元素的值,当指定的值在列表中存在重复的时候,会删除所有重复的值。# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test a a b c c d) # 创建列表变量"a;a;b;c;c;d"list (REMOVE_ITEM list_test a)message (">>> REMOVE_ITEM: ${list_test}")list (REMOVE_ITEM list_test b e)message (">>> REMOVE_ITEM: ${list_test}")# 输出>>> REMOVE_ITEM: b;c;c;d>>> REMOVE_ITEM: c;c;d3.8

REMOVE_AT:⼦命令REMOVE_AT⽤于将指定索引的元素从列表中移除。list (REMOVE_AT [ ...])  注意:指定的是元素的索引,当指定的索引不存在的时候,会提⽰错误;如果指定的索引存在重复,则只会执⾏⼀次删除动作。# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test a b c d e f) # 创建列表变量"a;b;c;d;e;f"list (REMOVE_AT list_test 0 -1)message (">>> REMOVE_AT: ${list_test}")list (REMOVE_AT list_test 1 1 1 1)message (">>> REMOVE_AT: ${list_test}")# 输出>>> REMOVE_AT: b;c;d;e>>> REMOVE_AT: b;d;e3.9

REMOVE_DUPLICATES:⼦命令REMOVE_DUPLICATES⽤于移除列表中的重复元素。list (REMOVE_DUPLICATES )  如果没有重复元素,原列表不会做更改。如果原列表所有元素都是⼀样的,则会保留⼀个;如果有多个重复元素,则保留第⼀个。# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test a a a b b b c c c d d d) # 创建列表变量"a;a;a;b;b;b;c;c;c;d;d;d;"list (REMOVE_DUPLICATES list_test)message (">>> REMOVE_DUPLICATES: ${list_test}")set (list_test a a a a)

list (REMOVE_DUPLICATES list_test)message (">>> REMOVE_DUPLICATES: ${list_test}")set (list_test a b c a d a e a f) # 多个元素重复,只保留第⼀个

list (REMOVE_DUPLICATES list_test)message (">>> REMOVE_DUPLICATES: ${list_test}")# 输出>>> REMOVE_DUPLICATES: a;b;c;d>>> REMOVE_DUPLICATES: a>>> REMOVE_DUPLICATES: a;b;c;d;e;f3.10

TRANSFORM:⼦命令TRANSFORM⽤于将指定的动作运⽤到所有或者部分指定的元素,结果可以存到原列表中,或存到指定输出新的变量中。list (TRANSFORM [][OUTPUT_VARIABLE ])  选项ACTION⽤于指定应⽤到列表元素的动作,动作必须在如下中选择⼀个:APPEND/PREPEND/TOUPPER/TOUPPER/STRIP/GENEX_STRIP/REPLACE;选项SELECTOR⽤于指定哪些列表元素会被选择,并执⾏动作,SELECTOR只能从如下中选择⼀个:AT/FOR/REGEX;选项OUTPUT_VARIABLE⽤于指定新的输出变量。

TRANSFORM命令不会改变列表中元素的个数。ACTION选项的解析如下:APPEND,PREPEND:在列表的每个元素后/前插⼊指定的值。list (TRANSFORM [OUTPUT_VARIABLE ])# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test a b c d)list (TRANSFORM list_test APPEND B OUTPUT_VARIABLE list_test_out)list (TRANSFORM list_test APPEND B)message (">>> TRANSFORM-APPEND: ${list_test} --- ${list_test_out}")set (list_test a b c d)list (TRANSFORM list_test PREPEND F OUTPUT_VARIABLE list_test_out)list (TRANSFORM list_test PREPEND F)message (">>> TRANSFORM-PREPEND: ${list_test} --- ${list_test_out}")# 输出>>> TRANSFORM-APPEND: aB;bB;cB;dB --- aB;bB;cB;dB>>> TRANSFORM-PREPEND: Fa;Fb;Fc;Fd --- Fa;Fb;Fc;FdTOUPPER, TOLOWER:将列表的每⼀个元素转换成⼤写/⼩写。list(TRANSFORM [OUTPUT_VARIABLE ])# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test a bb c d)list (TRANSFORM list_test TOUPPER OUTPUT_VARIABLE list_test_out)list (TRANSFORM list_test TOUPPER)message (">>> TRANSFORM-TOUPPER: ${list_test} --- ${list_test_out}")set (list_test A B C DD)list (TRANSFORM list_test TOLOWER OUTPUT_VARIABLE list_test_out)list (TRANSFORM list_test TOLOWER)message (">>> TRANSFORM-TOLOWER: ${list_test} --- ${list_test_out}")# 输出>>> TRANSFORM-TOUPPER: A;BB;C;D --- A;BB;C;D>>> TRANSFORM-TOLOWER: a;b;c;dd --- a;b;c;ddSTRIP:去除列表中每⼀个元素的头尾空格。list(TRANSFORM STRIP [OUTPUT_VARIABLE ])# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test " a b " " bb " "c e" d)message (">>> TRANSFORM list: ${list_test}")list (TRANSFORM list_test STRIP OUTPUT_VARIABLE list_test_out)list (TRANSFORM list_test STRIP)message (">>> TRANSFORM-STRIP: ${list_test} --- ${list_test_out}")# 输出>>> TRANSFORM list: a b ; bb ;c e;d>>> TRANSFORM-STRIP: a b;bb;c e;d --- a b;bb;c e;dGENEX_STRIP:裁剪列表中任何为产⽣表达式的元素(产⽣表达式请参考此处)从下⾯的例⼦可以看出,虽然列表中是产⽣表达式的元素被清除了,但是实际列表的长度没有变化,产⽣表达式的位置被空元素占据了(TRANSFROM命令不会改变列表元素的个数)。list(TRANSFORM GENEX_STRIP [OUTPUT_VARIABLE ])# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test a b c d $ $)list (LENGTH list_test len)message (">>> TRANSFORM list: ${list_test}, len=${len}")list (TRANSFORM list_test GENEX_STRIP OUTPUT_VARIABLE list_test_out)list (TRANSFORM list_test GENEX_STRIP)

list (LENGTH list_test len_new)message (">>> TRANSFORM-STRIP: ${list_test} --- ${list_test_out}, new len = ${len_new}")# 输出>>> TRANSFORM list: a;b;c;d;$;$, len = 6>>> TRANSFORM-STRIP: a;b;c;d;; --- a;b;c;d;;, new len = 6REPLACE:尽可能多的查找(⽤正则表达式匹配)并替换(⽤替换)列表中符合条件的元素。list(TRANSFORM REPLACE [OUTPUT_VARIABLE])# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test aa bb cc dd 1a b2 33 44)message (">>> TRANSFORM-list: ${list_test}")list (TRANSFORM list_test REPLACE "[a-c]" 9)

message (">>> TRANSFORM-REPLACE: ${list_test}")# 输出>>> TRANSFORM-list: aa;bb;cc;dd;1a;b2;33;44>>> TRANSFORM-REPLACE: 99;99;99;dd;19;92;33;44SELECTOR选项的解析如下:AT:指定元素的索引(可以是多个)。list(TRANSFORM AT [ ...] [OUTPUT_VARIABLE ])# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test a b c d)message (">>> TRANSFORM-list: ${list_test}")list (TRANSFORM list_test APPEND Q AT 1 2 OUTPUT_VARIABLE list_test_out)list (TRANSFORM list_test APPEND Q AT 1 2)message (">>> TRANSFORM-AT: ${list_test} --- ${list_test_out}")# 输出>>> TRANSFORM-list: a;b;c;d>>> TRANSFORM-REPLACE: a;bQ;cQ;d --- a;bQ;cQ;dFOR:指定元素的范围和迭代的步长。list(TRANSFORM FOR [] [OUTPUT_VARIABLE ])# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test a b c d e f g h i j k)message (">>> TRANSFORM-list: ${list_test}")list (TRANSFORM list_test APPEND Q FOR 0 -1 2 OUTPUT_VARIABLE list_test_out)list (TRANSFORM list_test APPEND Q FOR 0 -1 2)message (">>> TRANSFORM-FOR: ${list_test} --- ${list_test_out}")# 输出>>> TRANSFORM-list: a;b;c;d;e;f;g;h;i;j;k>>> TRANSFORM-REPLACE: aQ;b;cQ;d;eQ;f;gQ;h;iQ;j;kQ --- aQ;b;cQ;d;eQ;f;gQ;h;iQ;j;kQREGEX:指定正则表达式,符合正则表达式的元素才会被处理。list(TRANSFORM REGEX [OUTPUT_VARIABLE ])# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test a b c d e f g h i j k)message (">>> TRANSFORM-list: ${list_test}")list (TRANSFORM list_test APPEND Q REGEX "[a-f]" OUTPUT_VARIABLE list_test_out)list (TRANSFORM list_test APPEND Q REGEX "[a-f]")message (">>> TRANSFORM-REGEX: ${list_test} --- ${list_test_out}")

# 输出>>> TRANSFORM-list: a;b;c;d;e;f;g;h;i;j;k>>> TRANSFORM-REGEX: aQ;bQ;cQ;dQ;eQ;fQ;g;h;i;j;k --- aQ;bQ;cQ;dQ;eQ;fQ;g;h;i;j;k4. 列表的排序4.1

REVERSE:⼦命令REVERSE⽤于将整个列表反转。list (REVERSE )  反转列表。# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test aa bb cc dd)

message (">>> list: ${list_test}")list (REVERSE list_test)message (">>> REVERSE: ${list_test}")# 输出>>> list: aa;bb;cc;dd>>> REVERSE: dd;cc;bb;aa4.1

SORT:⼦命令SORT⽤于对列表进⾏排序。list (SORT [COMPARE ] [CASE ] [ORDER ])  对列表进⾏排序。COMPARE:指定排序⽅法。有如下⼏种值可选:1)STRING:按照字母顺序进⾏排序,为默认的排序⽅法;2)FILE_BASENAME:如果是⼀系列路径名,会使⽤basename进⾏排序;3)NATURAL:使⽤⾃然数顺序排序。CASE:指明是否⼤⼩写敏感。有如下⼏种值可选:1)SENSITIVE:按照⼤⼩写敏感的⽅式进⾏排序,为默认值;2)INSENSITIVE:按照⼤⼩写不敏感⽅式进⾏排序。ORDER:指明排序的顺序。有如下⼏种值可选:1)ASCENDING:按照升序排列,为默认值;2)DESCENDING:按照降序排列。# ke_minimum_required (VERSION 3.12.2)project (list_cmd_test)set (list_test 3 1 1.1 10.1 3.4 9)list (SORT list_test) # 以字母顺序,按照⼤⼩写敏感⽅式,升序排列message (">>> SORT STRING-SENSITIVE-ASCENDING: ${list_test}")list (SORT list_test COMPARE NATURAL ORDER DESCENDING) # 以⾃然顺序,降序排列message (">>> SORT STRING-SENSITIVE-DESCENDING: ${list_test}")# 输出>>> SORT STRING-SENSITIVE-ASCENDING: 1;1.1;10.1;3;3.4;9>>> SORT STRING-SENSITIVE-DESCENDING: 10.1;9;3.4;3;1.1;1 附录:参考资料

发布者:admin,转转请注明出处:http://www.yc00.com/xiaochengxu/1690362420a337971.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信