作为一个编程语言,CMake也少不了循环流程控制,他提供两种循环foreach()
和 while()
。
基本语法:
foreach(<loop_var> <items>)
<commands>
endforeach()
其中
可以是由分号或空格分隔的项目列表,也可以是一个列表变量。每次迭代,
将被赋值为当前项目的值。
set(item1 a)
set(item2 b)
set(item3 c)
set(item4 d)
foreach(var ${item1} ${item2} ${item3} ${item4})
message("var = ${var}")
endforeach()
----------------
var = a
var = b
var = c
var = d
var = e
set(myList 1 2 3 4)
foreach(var ${myList})
message("var = ${var}")
endforeach()
----------------
var = 1
var = 2
var = 3
var = 4
foreach()
还有一些进阶的用法:
foreach(<loop_var> RANGE <stop>)
使用
指定迭代范围(
> 0),相当于有一个迭代变量i
,迭代范围为 [0,
。
foreach(var RANGE 5)
message("var = ${var}")
endforeach()
----------------
var = 0
var = 1
var = 2
var = 3
var = 4
var = 5
foreach(<loop_var> RANGE <start> <stop> [<step>])
指定迭代范围的开始(
)和结束(
),并可选指定步长(
)。
foreach(var RANGE 2 10 2)
message("var = ${var}")
endforeach()
----------------
var = 2
var = 4
var = 6
var = 8
var = 10
foreach(<loop_var> IN [LISTS [<lists>]] [ITEMS [<items>]])
它和foreach(
的用法基本一样,唯一不同的是,用LISTS
指定列表后不需要用 ${}
对列表进行取值。
set(myList 1 2 3 4)
foreach(var IN LISTS myList)
message("var = ${var}")
endforeach()
----------------
var = 1
var = 2
var = 3
var = 4
foreach(<loop_var>... IN ZIP_LISTS <lists>)
CMake 3.17引入
这个用法可以并行遍历多个列表,可以发现
后面有...
,所以他可以传入多个变量以接受多个列表的遍历,传入多个变量时,变量的数量应该和列表的数量相同。
但如果只传入一个变量,将会把对应列表的元素存入到
中,如下:
set(myList0 a b c d)
set(myList1 1 2 3 4)
# 传入多个变量
foreach(var0 var1 IN ZIP_LISTS myList0 myList1)
message("var0 = ${var0}, var1 = ${var1}")
endforeach()
----------------
var1 = a, var2 = 1
var1 = b, var2 = 2
var1 = c, var2 = 3
var1 = d, var2 = 4
# 传入一个变量
set(myList0 a b c d)
set(myList1 1 2 3 4)
foreach(var IN ZIP_LISTS myList0 myList1)
message("var_0 = ${var_0}, var_1 = ${var_1}")
endforeach()
----------------
var_0 = a, var_1 = 1
var_0 = b, var_1 = 2
var_0 = c, var_1 = 3
var_0 = d, var_1 = 4
基本语法:
while(<condition>)
<commands>
endwhile()
如果
为真,则执行循环,示例如下:(列表操作详见CMake列表 - list)
list(LENGTH myList listLen)
while(listLen GREATER 0)
message("myList = ${myList}")
list(POP_FRONT myList)
list(LENGTH myList listLen)
endwhile()
----------------
myList = 1;2;3;4
myList = 2;3;4
myList = 3;4
myList = 4
与绝大多数编程语言一样,CMake也可以通过 break()
跳出循环,通过 continue()
结束本次循环并继续下次循环。
set(myList 1 2 3 4 5 6 7)
foreach(var IN LISTS myList)
math(EXPR expr ${var}%2)
if(expr EQUAL 0)
continue()
endif()
if(${var} GREATER 5)
break()
endif()
message("var = ${var}")
endforeach()
----------------
var = 1
var = 3
var = 5