$(if $(KBUILD_VERBOSE:1=),@) 语法释疑

原文地址:http://blog.csdn.net/lcw_202/article/details/6656633

 

内核版本:2.6.35.13

在 Makefile 的 125 行中有一句:

  1. $(if $(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT) \  
  2.     KBUILD_SRC=$(CURDIR) \  
  3.     KBUILD_EXTMOD="$(KBUILD_EXTMOD)" -f $(CURDIR)/Makefile \  
  4.     $(filter-out _all sub-make,$(MAKECMDGOALS))  
$(if $(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT) \
    KBUILD_SRC=$(CURDIR) \
    KBUILD_EXTMOD="$(KBUILD_EXTMOD)" -f $(CURDIR)/Makefile \
    $(filter-out _all sub-make,$(MAKECMDGOALS))
其中 $(if $(KBUILD_VERBOSE:1=)),@) 的用法看起来有点蹊跷,实际上 $(VAR:x=y) 这种语法相当于 $(patsubst x,y,$(VAR)) 的缩写。这里需要注意一点,x 和 y 前面不能有 ‘%’ 匹配符,这是因为 '%' 已经被默认添加,所以它就如同如下形式:
$(patsubst %x,%y,$(VAR))

这样,$(if $(KBUILD_VERBOSE:1=)),@) 被展开为:
引用
  1. $(if $(patsubst %1,%,$(KBUILD_VERBOSE)),@)  
$(if $(patsubst %1,%,$(KBUILD_VERBOSE)),@)
所以,只要 KBUILD_VERBOSE 为非 1 的任何字符时,整个表达式的结果就是 : @ 。如果 KBUILD_VERBOSE 为 1 时,那么整个表达式结果为空。实际上,表达式结果为 @ 时,就是希望后面的命令能够静默执行。


测试代码-1

复制代码
  1. KBUILD_VERBOSE := hello1  
  2. all:  
  3.         @echo "$(if $(KBUILD_VERBOSE:1=),@)"  
    KBUILD_VERBOSE := hello1
    all:
            @echo "$(if $(KBUILD_VERBOSE:1=),@)"


运行输出:

引用
[beyes@beyes Makefile]$ make
@



测试代码-2

复制代码
  1. KBUILD_VERBOSE := 1  
  2. all:  
  3.         @echo "$(if $(KBUILD_VERBOSE:1=),@)"  
    KBUILD_VERBOSE := 1
    all:
            @echo "$(if $(KBUILD_VERBOSE:1=),@)"


运行输出:

引用
$ make
                         #输出为空

此种用法还出现在:

U-Boot 版本:1.1.6
在 U-Boot 的 Makefile 里有这么一个变量:

引用


 

  1. sbc2410x_config: unconfig  
  2.         @$(MKCONFIG) $(@:_config=) arm arm920t sbc2410x NULL s3c24x0  
sbc2410x_config: unconfig
        @$(MKCONFIG) $(@:_config=) arm arm920t sbc2410x NULL s3c24x0


在 $(@:_config=) 中,$@ 表示所有的目标文件。也就是说,原先生成的目标文件的文件名末尾是 "_config" 字符串,而 '=' 号后为空,表示去掉 _config 这部分。
比如有 Makefile 文件内容如下:

引用
hello_config: hello.o
        gcc -o $(@:_config=) $^
hello.o: hello.c
        gcc -Wall -c hello.c -o hello.o


make 后输出:

引用
t$ ls
hello  hello.c  hello.h  hello.o  Makefile


从这里可见,原本要输出的目标文件 hello_config 的可执行文件被改名为 hello 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值