Makefile学习之变量

本文内容基本参考《GNU make中文手册》。
1、变量的引用
引用变量使用 $ (VAR)或$ {VAR},与shell脚本不同的是,在Makefile中必须用括号将变量名包裹起来,否则Makefile会默认变量第一个字母为变量名。
2、变量的定义
Makefile中定义变量和C语言define差不多,是严格的文本替换。
变量的定义有递归展开式和直接展开式两种。
递归展开式变量一般是通过define或者“=”来定义的,这里举个例子

target = $(x)
x = $(y)
y=$(z)
z=hello
all:
	echo $(target)

这段代码最终会打印hello,在执行echo 时,会先将target替换成x,然后x替换成y,y再替换成z,最后z被替换成hello,这些替换过程是在执行echo时完成的,也就是说“target=$$(x)”这一行赋值语句并不会在定义时就展开。
如果代码改成这样:

z := hello
y := $(z)
x := $(y)
target := $(x)
all:
	echo $(target)

那么在定义x、y、z、target这些变量时就会去展开它们,即在执行echo语句前target就已经被置为hello了。

这其实也是“=”和“:=”用法的差别。
通俗地讲,使用“=”赋值的话,具体值以最后一次为准;
使用“:=”赋值则以当前历史记录为准。
举个例子

y=$(z)
target = $(x)
x = $(y)
z=hello

当给y赋值时,z还没有定义,但最后z被赋值了hello,所以y的值为hello;

y:=$(z)
target := $(x)
x := $(y)
z:=hello

当给y赋值时,z还没有定义,所以y的值为空,即使最后给z赋值hello,y的值也不会改变。
还有一种条件赋值 VAR?=VALUE,这种情况先会先判断VAR之前 是否被赋值,如果没被赋值才进行赋值操作,如果已经赋值了,那么就不进行此次赋值。

3、变量的替换
你可以理解为字符串的替换操作,给个例子

foo := a.o b.o c.o
bar := $(foo:.o=.c)

运行完毕后bar的值就是a.c b.c c.c,所以$(foo:.o=.c)的意思就是将foo变量里所有的.o换成.c,当然,通常使用bar := $(foo:%.o=%.c)更好些。

4、变量传递
当要把本Makefile中的变量传递至子文件时,可以使用exprot var1 var2…的方式进行。
5、系统变量
系统变量是makefile运行时系统传入的,Makefile中可以直接使用,如果自己定义的变量和系统变量重名了,那么自己定义的局部变量会覆盖全局变量,这和C语言局部变量、全局变量的关系差不多。

6、多目录递归执行
$(MAKE) -C subdir
cd subdir && $(MAKE)
这两种方式都可以。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值