【cmake】list


list

命令list的操作分为读取、查找、修改、排序等四个大类,下面按照这四个类逐一对list的子命令进行介绍。

语法如下:

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  [...])

1. 列表的读取

list (LENGTH  )

 说明: 为新创建的变量,用于存储列表的长度。

测试用例

cmake_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: 4

2) GET:子命令GET用于读取列表中指定索引的的元素,可以指定多个索引。

list (GET   [ ...] )

说明:1. 为列表元素的索引,从0开始编号,索引0的元素为列表中的第一个元素;索引也可以是负数,-1表示列表的最后一个元素,-2表示列表倒数第二个元素,以此类推。注意:当索引(不管是正还是负)超过列表的长度,运行会报错(list index: XX out of range)。

??  2. 为新创建的变量,存储指定索引元素的返回结果,也是一个列表。   1)测试用例
# CMakeLists.txt
cmake_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;c

【】FIND:子命令FIND用于查找列表是否存在指定的元素。

list (FIND   )

 说明:如果列表中存在,那么返回在列表中的索引,如果未找到则返回-1。

测试用例
# CMakeLists.txt
cmake_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': -1

修改

【1】APPEND:子命令APPEND用于将元素追加到列表。

list (APPEND  [ ...])

 说明:用于改变变量 值。

1)测试用例

# CMakeLists.txt
cmake_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;4

【2】INSERT:子命令INSERT用于在指定位置将元素(一个或多个)插入到列表中。

list (INSERT    [ ...])

 说明:为列表指定的位置,如果元素的位置超出列表的范围,会报错。此命令会改变原来列表的值。

1)测试用例

cmake_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;0

【】POP_BACK:子命令POP_BACK用于将列表中最后元素移除。

list (POP_BACK  [...])

 说明:

? 如果未指定输出变量,则仅仅是将原列表的最后一个元素移除。如果指定了输出变量,则会将最后一个元素移入到该变量,并将元素从原列表中移除。如果指定了多个输出变量,则依次将原列的最后一个元素移入到输出变量中,如果输出变量个数大于列表的长度,那么超出部分的输出变量未定义。   1)测试用例
cmake_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: ${list_test}")
message (">>> POP_BACK: ${outvar1}、${outvar2}、${outvar3}、${outvar4}")

输出:

>>> POP_BACK: a;b;c;d;e
>>> POP_BACK: a
>>> POP_BACK: e、d、c、b

作者:Domibaba
链接:https://www.jianshu.com/p/89fb01752d6f
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

【】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:按照降序排列。

测试用例
# CMakeLists.txt
cmake_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

参考资料

1. cmake官方文档

2. cmake命令之list介绍