一、介绍
cmake的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命令的具体格式根据子命令
不同会有所区别。
下面是list提供的命令
list(LENGTH <list><output variable>)
list(GET <list> <elementindex> [<element index> ...]<output variable>)
list(APPEND <list><element> [<element> ...])
list(FIND <list> <value><output variable>)
list(INSERT <list><element_index> <element> [<element> ...])
list(REMOVE_ITEM <list> <value>[<value> ...])
list(REMOVE_AT <list><index> [<index> ...])
list(REMOVE_DUPLICATES <list>)
list(REVERSE <list>)
list(SORT <list>)
我们可以看到,list命令的格式如下
list (subcommand <list> [args...])
subcommand
为具体的列表操作子命令,例如读取
、查找
、修改
、排序
等。<list>
为待操作的列表
变量,[args...]
为对列表
变量操作需要使用的参数表,不同的子命令对应的参数也不一致。
ENGTH 返回list的长度
GET 返回list中index的element到value中
APPEND 添加新element到list中
FIND 返回list中element的index,没有找到返回-1
INSERT 将新element插入到list中index的位置
REMOVE_ITEM 从list中删除某个element
REMOVE_AT 从list中删除指定index的element
REMOVE_DUPLICATES 从list中删除重复的element
REVERSE 将list的内容反转
SORT 将list按字母顺序排序
二、实例
列表的读取
2.1 LENGTH
:子命令LENGTH用于读取列表长度
list (LENGTH <list> <output variable>)
# <output variable>为新创建的变量,用于存储列表的长度。
# 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 (LENGTH list_test length)
message (">>> LENGTH: ${length}")
执行结果
2.2 GET
:子命令GET用于读取列表中指定索引的的元素,可以指定多个索引。
list (GET <list> <element index> [<element index> ...] <output variable>)
# <element index>为列表元素的索引,从0开始编号,索引0的元素为列表中的第一个元素;索引也可以是负数,-1表示列表的最后一个元素,-2表示列表倒数第二个元素,以此类推。注意:当索引(不管是正还是负)超过列表的长度,运行会报错(list index: XX out of range)。
# <output variable>为新创建的变量,存储指定索引元素的返回结果,也是一个列表。
执行结果
2.3、列表的查找
FIND
:子命令FIND用于查找列表是否存在指定的元素。
list (FIND <list> <value> <output variable>)
如果列表<list>中存在<value>,那么返回<value>在列表中的索引,如果未找到则返回-1。
macro( __LIST_FILTER listvar regex )
if( ${listvar} )
foreach( __val ${${listvar}} )
if( __val MATCHES "${regex}" )
list( REMOVE_ITEM ${listvar} "${__val}" )
endif()
endforeach()
endif()
endmacro()
# 使用
__LIST_FILTER( __availableToolchainsLst "^[.]" ) # 删除文件
__LIST_FILTER( __availableToolchainsLst "llvm" )
__LIST_FILTER( __availableToolchainsLst "renderscript" )
# 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}")
执行结果
参考: