【精选】【CMake 语法】(7) CMake 列表操作 您所在的位置:网站首页 获取列表的长度 【精选】【CMake 语法】(7) CMake 列表操作

【精选】【CMake 语法】(7) CMake 列表操作

2023-10-20 22:01| 来源: 网络整理| 查看: 265

概要(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 实验室设备网 版权所有