曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6243|回复: 0
打印 上一主题 下一主题

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

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2011-6-20 14:54:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
内核版本:2.6.35.13

在 Makefile 的 125 行中有一句:
$(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=)),@) 被展开为:
$(if $(patsubst %1,%,$(KBUILD_VERBOSE)),@)
所以,只要 KBUILD_VERBOSE 为非 1 的任何字符时,整个表达式的结果就是 : @ 。如果 KBUILD_VERBOSE 为 1 时,那么整个表达式结果为空。实际上,表达式结果为 @ 时,就是希望后面的命令能够静默执行。

测试代码-1
[Plain Text] 纯文本查看 复制代码
KBUILD_VERBOSE := hello1

all:
        @echo "$(if $(KBUILD_VERBOSE:1=),@)"

运行输出:
[beyes@beyes Makefile]$ make
@

测试代码-2
[Plain Text] 纯文本查看 复制代码
KBUILD_VERBOSE := 1

all:
        @echo "$(if $(KBUILD_VERBOSE:1=),@)"

运行输出:
$ make
                         #输出为空
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-18 13:15 , Processed in 0.082867 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表