CMD#35 : foreach
对一个list中的每一个变量执行一组命令。
foreach(loop_var arg1 arg2 ...)
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
endforeach(loop_var)
所有的foreach和与之匹配的endforeach命令之间的命令会被记录下来而不会被调用。等到遇到endforeach命令时,先前被记录下来的命令列表中的每条命令都会为list中的每个变量调用一遍。在每次迭代中,循环变量${loop_var}将会被设置为list中的当前变量值。
foreach(loop_var RANGE total)
foreach(loop_var RANGE start stop [step])
foreach命令也可以遍历一个人为生成的数据区间。遍历的方式有三种:
*如果指定了一个数字,区间是[0, total]。
*如果指定了两个数字,区间将会是第一个数字到第二个数字。
*第三个数字是从第一个数字遍历到第二个数字时的步长。
foreach(loop_var IN [LISTS [list1 [...]]]
[ITEMS [item1 [...]]])
该命令的含义是:精确遍历一个项组成的list。LISTS选项后面是需要被遍历的list变量的名字,包括空元素(一个空字符串是一个零长度list)。ITEMS选项结束了list参数的解析,然后在迭代中引入所有在其后出现的项。(猜测是用list1中的项item1,依次类推,为循环变量赋值。——译注)
CMD#36 : function
开始记录一个函数,为以后以命令的方式调用它做准备。
function(<name> [arg1 [arg2 [arg3 ...]]])
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
endfunction(<name>)
定义一个名为<name>的函数,它以arg1 arg2 arg3 (...)为参数。在function之后,对应的endfunction之前列出的命令,在函数被调用之前,是不会被调用的。当函数被调用时,在函数中记录的那些命令首先会用传进去的参数替换掉形参(${arg1});然后跟正常命令一样去调用这些命令。除了形参,你还可以引用这些变量:ARGC为传递给函数的变量个数,ARGV0 ARGV1 ARGV2 ...表示传到函数中的实参值。这些变量为编写可选参数函数提供了便利。此外,ARGV保留了一个该函数所有实参的list,ARGN保留了函数形参列表以后的所有参数列表。
参见cmake_policy()命令文档中function内部策略行为的相关行为。
CMD#37 : get_cmake_property
获取一个CMake实例的属性。
get_cmake_property(VAR property)
从指定的CMake实例中获取属性。属性的值存储在变量VAR中。如果属性不存在,CMake会报错。一些会被支持的属性包括:VATIABLES,COMMANDS,MACROS以及COMPONENTS。
CMD#38 : get_directory_property
获取DIRECTORY域中的某种属性。
get_directory_property(<variable> [DIRECTORY <dir>] <prop-name>)
在指定的变量中存储路径(directory)域中的某种属性。如果该属性没有被定义,将会返回空字符串。DIRECTORY参数指定了要取出的属性值的另一个路径。指定的路径必须已经被CMake遍历过了。
get_directory_property(<variable> [DIRECTORY <dir>]
DEFINITION <var-name>)
该命令从一个路径中获取一个变量的定义。这种格式在从另一个路径中获取变量的定义时比较有用。
CMD#39 : get_filename_component
得到一个完整文件名中的特定部分。
get_filename_component(<VAR> FileName
PATH|ABSOLUTE|NAME|EXT|NAME_WE|REALPATH
[CACHE])
将变量<VAR>设置为路径(PATH),文件名(NAME),文件扩展名(EXT),去掉扩展名的文件名(NAME_WE),完整路径(ABSOLUTE),或者所有符号链接被解析出的完整路径(REALPATH)。注意,路径会被转换为Unix的反斜杠(/),并且没有结尾的反斜杠。该命令已经考虑了最长的文件扩展名。如果指定了CACHE选项,得到的变量会被加到cache中。
get_filename_component(<VAR> FileName
PROGRAM [PROGRAM_ARGS <ARG_VAR>]
[CACHE])
在FileName中的程序将会在系统搜索路径中被查找,或者是一个完整路径。如果与PRPGRAM一起给定了PROGRAM_ARGS选项,那么任何在Filename字符串中出现的命令行中选项将会从程序名中分割出来并存储在变量<ARG_VAR>中。这可以用来从一个命令行字符串中分离程序名及其选项。