Makefile基础知识#

1 变量:

1.1 递归展开式变量(recursively expanded variables)


var_rev = abc123
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_1 assign to myvar)myvar_1
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.


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值