1 变量:
1.1 递归展开式变量(recursively expanded variables)
var2_rev = $(var_rev)
all: ;echo $(var2_rev)
执行make时,替换过程:首先“$(var2_rev)”被替换为“$(var_rev)”,接下来“$(var_rev)”被替换为“abc123”。
可见:递归展开式变量仅在该变量被用到时开始展开;展开时,从使用处开始展开,直到全部展开完成为止。
优点:可引用在执行处之前尚未定义的变量(该变量可能在之后定义,或者通过make命令行选项传递)
缺点:
1)可能会由于出现变量的递归定义而导致make陷入到无限的变量展开过程中;
2)变量定义中如果使引用某函数,那么该函数总会在变量被引用的地方被执行;
1.2 直接展开式变量(simply expanded variables)
var_sev := $(info info: myvar_2 assign to myvar)myvar_2
就等价于:
var_sev := $(info info: myvar_2 assign to myvar)myvar_2
这与常见的编程语言顺序化相同。
注意:递归展开式与直接展开式在语法上表达,仅赋值操作符不一致。前者用"=",后者用":="。
2 引用shell命令
shell_output := $(shell echo echo_message) #执行该语句后,变量shell_output的值为echo_message
3 makefile调试
3.1 输出raw字串
可采用如下方式输出:
$(error text...)
$(warning text...)
$(info text...)
其中error、warning、info均为makefile方法。
例如: $(info Makefile Start ......)
3.2 输出makefile变量
如果希望输出变量var的值,可采用如下方式:
$(info $$var is $(var)); #$$var对应打印$var, $(var)对应打印变量var的值
4 其它
.PHONY修饰的目标就是只有规则没有依赖。
用途举例:
.PHONY: clean #这里表示clean无依赖
clean: ...
5 测试样例
makefile内容:$(info Makefile Start ......)
#recursively expanded variables
var_rev = $(info info: expanded 1)abc123
var2_rev = $(info info: expanded 2)$(var_rev)
#simply expanded variables
var_sev := $(info info: myvar_1 assign to myvar)myvar_1
var_sev := $(info info: myvar_2 assign to myvar)myvar_2
shell_info := $(shell echo echo_message)
all:
$(info $$var2_rev is ${var2_rev})
$(info $$var_sev is ${var_sev})
$(info $$var_sev is $(var_sev))
$(info $$shell_info is $(shell_info))
执行make,输出为:
Makefile Start ......
info: myvar_1 assign to myvar
info: myvar_2 assign to myvar
info: expanded 2
info: expanded 1
$var2_rev is abc123
$var_sev is myvar_2
$var_sev is myvar_2
$shell_info is echo_message
make: `all' is up to date.