内核版本: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=),@)"
运行输出: |