¾ 函数功能:第一个参数“CONDITION” ,在函数执行时忽略其前导和结尾空字
符,如果包含对其他变量或者函数的引用则进行展开。如果“CONDITION”的
展开结果非空,则条件为真,就将第二个参数“THEN_PATR”作为函数的计算
表达式;“CONDITION”的展开结果为空,将第三个参数“ELSE-PART”作为
函数的表达式,函数的返回结果为有效表达式的计算结果。
¾ 返回值:根据条件决定函数的返回值是第一个或者第二个参数表达式的计算结
果。当不存在第三个参数“ELSE-PART” ,并且“CONDITION”展开为空,函
数返回空。
¾ 函数说明:函数的条件表达式“CONDITION”决定了函数的返回值只能是
“THEN-PART”或者“ELSE-PART”两个之一的计算结果。
¾ 函数示例:
SUBDIR += $(if $(SRC_DIR) $(SRC_DIR),/home/src)
函数的结果是:如果“SRC_DIR”变量值不为空,则将变量“SRC_DIR”指定
的目录作为一个子目录;否则将目录“/home/src”作为一个子目录。
==================Makefile start=======================
BUILD_DEST=/tmp/BUILD_DEST
TARGET_PREFIX=/tmp
.PHONY: prepare
prepare:
$(if $(wildcard $(BUILD_DEST)),,mkdir -p $(BUILD_DEST))
$(if $(wildcard $(BUILD_DEST)/src),,mkdir -p $(BUILD_DEST)/src)
$(if $(wildcard $(TARGET_PREFIX)/bin),,mkdir -p $(TARGET_PREFIX)/bin)
================================Makefile end=================================================
$(if $(wildcard $(BUILD_DEST)),,mkdir -p $(BUILD_DEST))
上面這行是說 如果BUILD_DEST等於"空"的話,就執行mkdir -p $(BUILD_DEST).反之若存在,則沒有任何動作
在 Makefile 的 125 行中有一句:
其中 $(if $(KBUILD_VERBOSE:1=)),@) 的用法看起来有点蹊跷,实际上 $(VAR:x=y) 这种语法相当于 $(patsubst x,y,$(VAR)) 的缩写。这里需要注意一点,x 和 y 前面不能有 ‘%’ 匹配符,这是因为 '%' 已经被默认添加,所以它就如同如下形式:
- $(if
$(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT) \ KBUILD_SRC=$(CURDIR) \ KBUILD_EXTMOD="$(KBUILD_EXTMOD)" -f $(CURDIR)/Makefile \ $(filter-out _all sub-make,$(MAKECMDGOALS))
$(patsubst %x,%y,$(VAR))
这样,$(if $(KBUILD_VERBOSE:1=)),@) 被展开为:
引用所以,只要 KBUILD_VERBOSE 为非 1 的任何字符时,整个表达式的结果就是 : @ 。如果 KBUILD_VERBOSE 为 1 时,那么整个表达式结果为空。实际上,表达式结果为 @ 时,就是希望后面的命令能够静默执行。
- $(if
$(patsubst %1,%,$(KBUILD_VERBOSE)),@)
测试代码-1:
- KBUILD_VERBOSE
:= hello1 - all:
-
@echo "$(if $(KBUILD_VERBOSE:1=),@)"
运行输出:
引用[beyes@beyes Makefile]$ make
@
测试代码-2:
- KBUILD_VERBOSE
:= 1 - all:
-
@echo "$(if $(KBUILD_VERBOSE:1=),@)"
运行输出:
引用$ make
#输出为空
此种用法还出现在:
U-Boot 版本:1.1.6
在 U-Boot 的 Makefile 里有这么一个变量:
- 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
hellohello.c hello.h hello.o Makefile
从这里可见,原本要输出的目标文件 hello_config 的可执行文件被改名为 hello 。