【精选】【CMake 语法】(7) CMake 列表操作 | 您所在的位置:网站首页 › 获取列表的长度 › 【精选】【CMake 语法】(7) CMake 列表操作 |
概要(Synopsis)
Reading
list(LENGTH )
list(GET [ ...] )
list(JOIN )
list(SUBLIST )
Search
list(FIND )
Modification
list(APPEND [...])
list(FILTER {INCLUDE | EXCLUDE} REGEX )
list(INSERT [...])
list(POP_BACK [...])
list(POP_FRONT [...])
list(PREPEND [...])
list(REMOVE_ITEM ...)
list(REMOVE_AT ...)
list(REMOVE_DUPLICATES )
list(TRANSFORM [...])
Ordering
list(REVERSE )
list(SORT [...])
注意: 是列表变量。 介绍(Introduction)列表适用于简单的任务,例如 文件列表,而不是应用于复杂的数据处理任务。 列表的 修改的子命令(包括 APPEND, FILTER, INSERT, POP_BACK, POP_FRONT, PREPEND, REMOVE_ITEM, REMOVE_AT, REMOVE_DUPLICATES,不包括 TRANSFORM) 和 排序的子命令(包括 REVERSE, SORT) 为列表创建新值。 set(A a b c d e) list(APPEND A f g) message("A: ${A}")与 set() 命令类似,list 命令在当前作用域创建新值,表示在函数内部使用 list 命令,并不会影响函数外的变量。 function(list_append list1 value) list(APPEND ${list1} ${value}) endfunction() set(B a b c d e) list_append(B f) message("B: ${B}")如何影响函数外的变量,表示要影响父作用域,需要向上传播这些操作结果,可以将 set() 与 PARENT_SCOPE 一起使用,或 set() 与 CACHE INTERNAL 一起使用,或 使用其他的值传播方式。 function(list_append_ref list1 value) list(APPEND ${list1} ${value}) set(${list1} ${${list1}} PARENT_SCOPE) endfunction() set(C a b c d e) list_append_ref(C f) message("C: ${C}")尽管 CMake 所有值都存储为字符串,包括布尔值和路径。但是在某些情况中,字符串可能会被视为列表。在这种情况下,字符串通过 ; 符号分割列表中的每个元素。 要创建列表,可以使用 set 命令,例如,set(srcs a.c b.c c.c) 创建一个包含 a.c;b.c;c.c 的列表,而 set(srcs "a.c b.c c.c") 创建一个字符串或一个包含一个元素的列表。 下面构建列表的形式都是相同的: set(srcs "a.c;b.c;c.c") set(srcs a.c b.c c.c) set(srcs a.c "b.c;c.c")列表的索引值,从 0 开始,0 表示 列表第一个元素,也可以使用负数的索引,-1 表示最后一个列表元素。 读取(Reading) list(LENGTH )返回列表的长度。 例如,list(LENGTH A A_len) 获取列表 A 的长度 A_len list(GET [ ...] )返回列表的元素,由索引指定,可以一次获得多个元素值。 例如,list(GET A 2 A_new) 获取索引为 2 的元素,并且保存在新列表 A_new 中 例如,list(GET A 2 4 A_new) 获取索引为 2, 4 的元素,并且保存在新列表 A_new 中 例如,list(GET A 2 4 3 A_new) 获取索引为 2, 4, 3 的元素,并且保存在新列表 A_new 中 list(JOIN )返回连接列表的字符串。将列表中所有元素连接为一个字符串。 例如,list(JOIN A " " A_new) 连接列表字符串,并替换分隔符分号 ; 为 空格 。如果列表值为 a;b;c,替换后为 a b c list(SUBLIST )返回列表的子列表。 例如,list(SUBLIST A 1 4 A_new)) 从列表 A 中,截取索引为 1 的 4 个元素,保存在新列表 A_new 中。 搜索(Search) list(FIND )返回列表指定元素的索引,如果未找到返回 -1。 例如,list(FIND A e A_out_var) 从列表中搜索元素 e,并返回索引。 注意,如果列表中有多个相同的搜索元素,则返回从左开始的第一个搜索的元素索引。 修改(Modification) list(APPEND [...])将元素追加到列表中。 例如,list(APPEND A a b c) list(FILTER {INCLUDE | EXCLUDE} REGEX )根据正则表达式的模式串,从列表中包含或删除元素。REGEX 表示,匹配正则表达式。 例如,list(FILTER A EXCLUDE REGEX Hello_*) 根据正则表达式,排除列表 a Hello_b c Hello_d e Hello_f g e,中符合 Hello_* 的元素。 例如,list(FILTER A INCLUDE REGEX Hello_*) 根据正则表达式,筛选出列表 a Hello_b c Hello_d e Hello_f g e,中符合 Hello_* 的元素。 list(INSERT [...])将元素插入到列表中的指定位置。 例如,list(INSERT A 3 x y z) 在列表索引为 3 的位置,插入元素 x;y;z list(POP_BACK [...]) list(POP_FRONT [...])利用弹出,删除列表的元素。POP_BACK 从最后一个元素开始删除,POP_FRONT 从第一个元素开始删除。如果给出变量名,将删除的元素赋值给变量。如果有多个变量,那么会删除多个变量。 例如,list(POP_BACK A) 从列表 a b c d e f g e 中,删除最后一个元素 e 例如,list(POP_FRONT A) 从列表 a b c d e f g e 中,删除第一个元素 a 例如,list(POP_BACK A A1 A2 A3) 从列表 a b c d e f g e 中,删除元素,A1 为 e,A2 为 g,A3 为 f list(PREPEND [...])将元素插入到列表中的第 0 个位置。 例如,list(PREPEND A x y z) 在列表开头,插入元素 x;y;z list(REMOVE_ITEM ...)从列表中删除给定元素值的元素。 例如,list(REMOVE_ITEM A b d f) 从列表 a b c d e f g e 中,删除元素 b d f list(REMOVE_AT ...)从列表中删除给定索引的元素。 例如,list(REMOVE_AT A 2 4 7) 从列表 a b c d e f g e 中,结果为 a;b;d;f;g list(REMOVE_DUPLICATES )删除列表中的重复项。保留相对顺序。 例如,list(REMOVE_DUPLICATES A) 从列表 a b c b a d c e f a g e 中删除重复项,结果为 a;b;c;d;e;f;g 转换(Transforms) list(TRANSFORM [] [OUTPUT_VARIABLE ])转换列表中的元素, 表示转换规则, 表示选定的元素,OUTPUT_VARIABLE 表示存储的结果,如果指定 OUTPUT_VARIABLE 那么不会修改原列表,修改后的列表存储在 变量中。 例如,list(TRANSFORM A APPEND "x" FOR 2 5 1 OUTPUT_VARIABLE A_out),结果存储在 A_out 变量中。 注意,TRANSFORM 子命令不会更改列表中的元素数。如果指定了 ,则只会更改某些元素,其他元素将保持与转换前相同。 : 指定应用于列表元素的操作。这些操作与 string() 命令的子命令具有完全相同的语义, 必须是以下之一:APPEND, PREPEND: 将指定值连接到列表的每个元素。APPEND 表示后缀,PREPEND 表示前缀。 list(TRANSFORM ...)例如,list(TRANSFORM A APPEND "x") 列表 a b c d e 每个元素都添加后缀 x,结果为 ax;bx;cx;dx;ex 例如,list(TRANSFORM A PREPEND "x") 列表 a b c d e 每个元素都添加前缀 x,结果为 xa;xb;xc;xd;xe TOUPPER, TOLOWER: 将列表中每个元素转换为 大写,小写 字符。 list(TRANSFORM ...)例如,list(TRANSFORM A TOLOWER) 列表 a B c D e 转换为小写,结果为 a;b;c;d;e 例如,list(TRANSFORM A TOUPPER) 列表 a B c D e 转换为大写,结果为 A;B;C;D;E STRIP: 删除列表中每个元素中的前导和尾随空格。 list(TRANSFORM STRIP ...)例如,list(TRANSFORM A STRIP) GENEX_STRIP: Strip any generator expressions from each element of the list. https://cmake.org/cmake/help/v3.19/manual/cmake-generator-expressions.7.html list(TRANSFORM GENEX_STRIP ...)REPLACE: 用正则表达式替换列表的每个元素。(与 string 命令 的 REGEX REPLACE 语义相同) list(TRANSFORM REPLACE ...)例如,list(TRANSFORM A REPLACE Hello_* Out_) 将列表 a Hello_b c Hello_d e Hello_f g e,中符合 Hello_* 的元素替换为 Out_,结果为 a;Out_b;c;Out_d;e;Out_f;g;e。 : 选择将转换列表的哪些元素。一次只能指定一种类型的选择器。当给出时, 必须是以下之一:AT: 指定列表的索引的元素 list(TRANSFORM AT [ ...] ...)例如,list(TRANSFORM A APPEND "x" AT 2 4) 列表 a b c d e f g e 转换为 a;b;cx;d;ex;f;g;e FOR: 指定列表的索引范围的元素 list(TRANSFORM FOR [] ...)例如,list(TRANSFORM A APPEND "x" FOR 2 5 1) 列表 a b c d e f g e 转换为 a;b;cx;dx;ex;fx;g;e REGEX: 指定正则表达式。仅匹配正则表达式的元素菜被转换。 list(TRANSFORM REGEX ...)例如,list(TRANSFORM A APPEND "x" REGEX "Hello_*") 列表 a Hello_b c Hello_d e Hello_f g e 转换为 a;Hello_bx;c;Hello_dx;e;Hello_fx;g;e 排序(Ordering) list(REVERSE )逆序本列表。 list(SORT [COMPARE ] [CASE ] [ORDER ])排序列表。 COMPARE 选择排序方法, 选择以下之一: STRING: 默认,按字母顺序对字符串进行排序。 FILE_BASENAME: 按文件路径的基本名称进行排序。 NATURAL: 按数值大小进行排序。 CASE 选择排序时是否区分大小写。 选择以下之一: SENSITIVE: 默认,对大小写敏感,区分大小写 INSENSITIVE: 对大小写不敏感,不区分大小写 ORDER 用于控制排序。 选择以下之一: ASCENDING: 默认,升序排序。 DESCENDING: 降序排序。 |
CopyRight 2018-2019 实验室设备网 版权所有 |