Makefile 中subst、foreach、wildcard、notdir函数

subst、foreach、wildcard、notdir这几个函数调用,很像变量的使用,也是以“$”来标识的,其语法为:$( )${ }。
参数间以逗号分隔,函数名和参数间以空格分隔。函数调用以“$”开头,以圆括号或花括号把函数名和参数括起。

一、subst函数的调用语法
$(subst FROM, TO, TEXT),即将字符串TEXT中的子串FROM变为TO。

举例:

$(subst _defconfig,,$(b)),意思是将字符串$(b)中的_defconfig去掉。

二、foreach函数的调用语法

foreach 函数和别的函数非常的不一样。因为这个函数是用来做循环用的,Makefile中的foreach函数几乎是仿照于Unix标准Shell (/bin/sh)中的for语句,或是C-Shell(/bin/csh)中的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”。



  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值