前言
foreach 是用来完成循环操作的函数。Makefile 中的 foreach 函数几乎是仿照于 Unix 标准 Shell(/bin /sh)中的 for 语句,或是 C-Shell(/bin/csh)中的 foreach 语句而构建的。
1 函数作用
主要用来循环处理文件列表,列出符合条件的文件目录名。
2 函数语法
$(foreach <var>, <list>, <text>)
(1) var:临时变量;
(2) list:以空格隔开的文件列表,每一次取一个文件名单词赋值为变量 var;
(3) text:对 var 变量进行操作(一般使用 var 变量,不然没意义),每次操作结果都会以空格隔开,最后返回空格隔开的列表。
函数解释:把参数 <list> 中的单词逐一取出放到参数 <var> 所指定的变量中,然后再执行 <text> 所包含的表达式。每一次 <text> 会返回一个字符串,循环过程中,<text> 表达式所返回的每个字符串会以空格分隔。最后当整个循环结束时,<text> 所返回的每个字符串所组成的整个字符串(以空格分隔)将会是 foreach 函数的返回值。
所以,<var> 最好是一个变量名,<list> 可以是一个表达式,而 <text> 中一般会使用 <var> 这个参数来依次枚举 <list> 中的单词。
3 函数实例
这里我创建了 source_dir 目录和三个子目录: gpio、irq、usart。三个子目录中都有对应的 .c 文件。
$(foreach source, $(SOURCE_DIR), $(wildcard $(source)/*.c))
上面的例子中,$(SOURCE_DIR) 中的单词会被挨个取出,并存到变量 source 中,(wildcard $(source)/*.c) 每次根据 $(source)/*.c 计算出一个值,这些值以空格分隔,最后作为 foreach 函数的返回值。
本例程的最终目的,是将各子目录下的 .c 文件(可编译文件)列举出来。
注意,foreach 中的 <var> 参数是一个临时的局部变量,foreach 函数执行完后,参数 <var> 的变量将不再作用,其作用域只在 foreach 函数当中。
总结
以上就是对 Makefile 中 foreach 函数的举例说明。