列表¶
列出操作。
概要¶
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>) Search list(FIND <list> <value> <out-var>) Modification list(APPEND <list> [<element>...]) list(FILTER <list> {INCLUDE | EXCLUDE} REGEX <regex>) 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>...) list(REMOVE_DUPLICATES <list>) list(TRANSFORM <list> <ACTION> [...]) Ordering list(REVERSE <list>) list(SORT <list> [...])
介绍¶
列表子命令``APPEND``、INSERT、FILTER、PREPEND、POP_BACK、POP_FRONT、REMOVE_AT、REMOVE_ITEM 、REMOVE_DUPLICATES、REVERSE 和 SORT 可能会在当前 CMake 变量范围内为列表创建新值。类似于 set() 命令,LIST 命令在当前作用域中创建新的变量值,即使列表本身实际上是在父作用域中定义的。要向上传播这些操作的结果,请使用 set() 和 PARENT_SCOPE、 set() 和 CACHE INTERNAL 或其他一些值传播方式。
备注
cmake 中的列表是一组由 ; 分隔的字符串。要创建列表,可以使用 set 命令。例如,set(var a b c d e) 创建一个包含 a;b;c;d;e 的列表,而 set(var "a b c d e") 创建一个字符串或包含一个的列表其中的项目。 (注意宏参数不是变量,因此不能在 LIST 命令中使用。)
备注
指定索引值时,如果 <element index> 为 0 或更大,则从列表的开头开始索引,0 表示第一个列表元素。如果 <element index> 为 -1 或更小,则从列表末尾开始索引,-1 表示最后一个列表元素。使用负索引计数时要小心:它们不是从 0 开始的。-0 等同于 0,第一个列表元素。
阅读¶
list(LENGTH <list> <output variable>)
返回列表的长度。
list(GET <list> <element index> [<element index> ...] <output variable>)
返回由列表中的索引指定的元素列表。
list(JOIN <list> <glue> <output variable>)
在 3.12 版本加入.
返回使用粘合字符串连接所有列表元素的字符串。要连接不属于列表的多个字符串,请使用 string() 命令中的 JOIN 运算符。
list(SUBLIST <list> <begin> <length> <output variable>)
在 3.12 版本加入.
返回给定列表的子列表。如果 <length> 为 0,将返回一个空列表。如果 <length> 为 -1 或列表小于 <begin>+<length> 则列表中从 <begin> 开始的剩余元素将被返回。
搜索¶
list(FIND <list> <value> <output variable>)
返回列表中指定元素的索引,如果未找到则返回 -1。
修改¶
list(APPEND <list> [<element> ...])
将元素追加到列表中。如果当前作用域中不存在名为 <list> 的变量,则将其值视为空,并将元素附加到该空列表。
list(FILTER <list> <INCLUDE|EXCLUDE> REGEX <regular_expression>)
在 3.6 版本加入.
在列表中包含或删除与模式模式匹配的项目。在 REGEX 模式下,项目将与给定的正则表达式匹配。
有关正则表达式的更多信息,请参阅 string(REGEX)。
list(INSERT <list> <element_index> <element> [<element> ...])
将列表中的元素插入到指定索引。指定超出范围的索引是错误的。有效索引为 0 到 N,其中 N 是列表的长度,包括在内。空列表的长度为 0。如果当前作用域中不存在名为 <list> 的变量,则将其值视为空,并将元素插入该空列表中。
list(POP_BACK <list> [<out-var>...])
在 3.15 版本加入.
如果没有给出变量名,则只删除一个元素。否则,在提供“N”变量名称的情况下,将最后的“N”个元素的值分配给给定的变量,然后从“<列表>”中删除最后的“N”个值。
list(POP_FRONT <list> [<out-var>...])
在 3.15 版本加入.
如果没有给出变量名,则只删除一个元素。否则,在提供“N”变量名称的情况下,将前“N”个元素的值分配给给定变量,然后从“<列表>”中删除前“N”个值。
list(PREPEND <list> [<element> ...])
在 3.15 版本加入.
将元素插入列表中的第 0 个位置。如果当前作用域中不存在名为 <list> 的变量,则其值被视为空,并且元素被添加到该空列表之前。
list(REMOVE_ITEM <list> <value> [<value> ...])
从列表中删除给定项目的所有实例。
list(REMOVE_AT <list> <index> [<index> ...])
从列表中删除给定索引处的项目。
list(REMOVE_DUPLICATES <list>)
删除列表中的重复项目。保留项目的相对顺序,但如果遇到重复项,则仅保留第一个实例。
list(TRANSFORM <list> <ACTION> [<SELECTOR>]
[OUTPUT_VARIABLE <output variable>])
在 3.12 版本加入.
通过将操作应用于所有列表或通过指定 <SELECTOR> 应用于列表的选定元素来转换列表,将结果存储在适当的位置或指定的输出变量中。
备注
TRANSFORM 子命令不会改变列表中元素的数量。如果指定了 <SELECTOR>,只有部分元素会被改变,其他的将与转换前保持不变。
<ACTION> 指定要应用于列表元素的操作。这些操作与 string() 命令的子命令具有完全相同的语义。 <ACTION> 必须是以下之一:
APPEND, PREPEND:追加,将指定值添加到列表的每个元素。
list(TRANSFORM <list> <APPEND|PREPEND> <value> ...)
TOUPPER, TOLOWER: 将列表的每个元素转换为大、小字符。
list(TRANSFORM <list> <TOLOWER|TOUPPER> ...)
STRIP:从列表的每个元素中删除前导和尾随空格。
list(TRANSFORM <list> STRIP ...)
GENEX_STRIP:从列表的每个元素中去除任何生成器表达式 <cmake-generator-expressions(7)>`。
list(TRANSFORM <list> GENEX_STRIP ...)
REPLACE:尽可能多次匹配正则表达式,并将替换表达式替换为列表中每个元素的匹配项(与 string() 命令中的 REGEX REPLACE 语义相同)。
list(TRANSFORM <list> REPLACE <regular_expression> <replace_expression> ...)
<SELECTOR> 确定列表中的哪些元素将被转换。一次只能指定一种类型的选择器。给定时,<SELECTOR> 必须是以下之一:
AT:指定索引列表。
list(TRANSFORM <list> <ACTION> AT <index> [<index> ...] ...)
FOR:指定一个范围,可选地,用于迭代该范围的增量。
list(TRANSFORM <list> <ACTION> FOR <start> <stop> [<step>] ...)
REGEX:指定一个正则表达式。只有匹配正则表达式的元素才会被转换。
list(TRANSFORM <list> <ACTION> REGEX <regular_expression> ...)
订购¶
list(REVERSE <list>)
就地反转列表的内容。
list(SORT <list> [COMPARE <compare>] [CASE <case>] [ORDER <order>])
按字母顺序对列表进行就地排序。
在 3.13 版本加入: 添加了 COMPARE、CASE 和 ORDER 选项。
在 3.18 版本加入: 添加了“比较自然”选项。
使用 COMPARE 关键字选择排序的比较方法。 <compare> 选项应该是以下之一:
STRING:按字母顺序对字符串列表进行排序。如果没有给出COMPARE选项,这是默认行为。FILE_BASENAME:按文件的基本名称对文件路径名列表进行排序。NATURAL:使用自然顺序对字符串列表进行排序(参见strverscmp(3)手册),即将连续数字作为整数进行比较。例如:以下列表“10.0 1.1 2.1 8.0 2.0 3.1”将被排序为“1.1 2.0 2.1 3.1 8.0 10.0”,如果选择“自然”比较,它将被排序为“1.1 10.0 2.0 2.1 3.1 8.0”与STRING比较。
使用 CASE 关键字选择区分大小写或不区分大小写的排序模式。 <case> 选项应该是以下之一:
SENSITIVE:列表项以区分大小写的方式排序。如果没有给出CASE选项,这是默认行为。INSENSITIVE:列表项不区分大小写排序。未指定仅大写/小写不同的项目的顺序。
要控制排序顺序,可以给出 ORDER 关键字。 <order> 选项应该是以下之一:
ASCENDING:按升序对列表进行排序。这是未给出ORDER选项时的默认行为。DESCENDING:按降序对列表进行排序。