Makefile中函数参数间以逗号分隔,函数名和参数间以空格分隔,$ 是取值符号,$val相当于获取val变量的值。
-
subst函数的调用语法
subst FROM, TO, TEXT 即将字符串TEXT中的子串FROM变为TO。
列如$ (subst _defconfig, , $ (b)),意思是将字符串$(b)中的_defconfig去掉。 -
patsubst函数的调用语法
patsubst src dest text 即将text变量中的含src替换为dset
例如$ (patsubst %.c,%.o,$ (dir) )中,patsubst把$ (dir)中的变量符合后缀是.c的全部替换成.o,
或者可以使用 obj=$ (dir:%.c=%.o) 效果也是一样的。 -
foreach函数的调用语法。
foreach < var >,< list >,< text >
这个函数的意思是,把参数< list>;中的单词逐一取出放到参数< var>;所指定的变量中,然后再执行< text>;所包含的表达式。每一次< text>;会返回一个字符串,循环过程中,< text>;的所返回的每个字符串会以空格分隔,最后当整个循环结束时,< text>;所返回的每个字符串所组成的整个字符串(以空格分隔)将会是foreach函数的返回值。
所以,< var >最好是一个变量名,< list >可以是一个表达式,而< text >中一般会使用< var >;这个参数来依次枚举< list >;中的单词。举个例子:
names := a b c d
files := $ (foreach n,$ (names),$(n).o)
上面的例子中,$ (name)中的单词会被挨个取出,并存到变量“n”中,“$ (n).o”每次根据“$ (n)”计算出一个值,这些值以空格分隔,最后作为foreach函数的返回,所以,$ (files)的值是“a.o b.o c.o d.o”。
注意,foreach中的< var>参数是一个临时的局部变量,foreach函数执行完后,参数< var >;的变量将不在作用,其作用域只在foreach函数当中。
- wildcard函数的调用语法
在Makefile中,它被展开为已经存在的、使用空格分开的、匹配此模式的所有文件列表。如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空。一般我们可以使用“$ (wildcard *.c)”来获取工作目录下的所有的.c文件列表。
举例:
假设arch/arm/configs/路径下有三个文件,分别是a_defconfig、b_defconfig、c_defconfig。那么,
boards := $ (wildcard arch/arm/configs/*_defconfig)这句话的意思是将$ (srctree)/arch/$(SRCARCH)/configs/路径下所有以_defconfig结尾的文件展开成 arch/arm/configs/a_defconfig arch/arm/configs/b_defconfig arch/arm/configs/c_defconfig这种方式赋值给boards。这三个文件名以空格隔开,所以boards的值就是字符串“arch/arm/configs/a_defconfig arch/arm/configs/b_defconfig arch/arm/configs/c_defconfig”。我们注意到:这三个文件的前面都带有路径,怎样去掉路径?下面notdir就派上用场了。
- notdir函数的调用语法
notdir函数的作用是将参数中的路径去掉。
举例:
了解到boards := $(wildcard arch/arm/configs/*_defconfig这句话的意思后。在此基础上跟上这句话:
boards := $(notdir $(boards)),那么boards的值就变成了“a_defconfig b_defconfig c_defconfig”。