《Makefile中变量的高级用法:变量的替换引用、变量的嵌套使用》
高级使用方法有两种:第一种是变量的替换引用,第二种是变量的嵌套引用。
第一种用法经常用到,第二种用法我们很少使用。我们应该尽量避免使用变量的嵌套引用,在必须使用时,嵌套的层数越少越好。因为这种方法表达比较复杂,条理难以理清。
变量的替换引用:
我们使用变量的时候,经常对它的值(字符串)进行操作。
操作字符串,通常使用字符串操作函数,比如 patsubst 函数(模式字符串替换函数),但是使用变量同样可以实现类似 patsubst 函数的功能。
我们通过下面的例子来具体分析。
写法一:
foo:=a.c b.c d.c
obj:=$(foo:.c=.o)
All:
@echo $(obj)
这段代码实现的功能是字符串的后缀名的替换,把变量 foo 中所有的以 .c 结尾的字符串全部替换成 .o 结尾的字符串。在 shell 命令行执行 make 命令,打印出来的是 "a.o b.o d.o" ,实现了文件名后缀的替换。
注意,括号中的变量,使用的是变量名而不是变量名的引用,变量名与参数选项之间用冒号隔开,表达式中间不能使用空格。
写法二:
foo:=a.c b.c d.c
obj:=$(foo:%.c=%.o)
All:
@echo $(obj)
在 shell 中执行 make 命令,发现结果和写法一是相同的。这里的表达式中使用了通配符 "%",表示自动匹配一个或多个字符。在开发的过程中,我们通常会使用这种方式来进行变量替换引用的操作。
写法二比写法一更加实用。因为在实际使用的过程中,我们对某个变量值的修改,可能不只是它的一部分,也可能是它的多个部分,那么第一种方式就不能实现了。比如:
foo:=a123c a1234c a12345c
obj:=$(foo:a%c=x%y)
All:
@echo $(obj)
这个例子中我们操作的是两个不连续的部分,执行 make 后打印的值是 "x123y x1234y x12345y",这种情况下我们使用第一种情况就不能实现,所以第二种的使用更全面。
变量的嵌套使用:
我们对一个变量进行赋值时可以引用其他的变量,并且引用变量的数量和和次数是不限制的。
下面我们通过几个实例来说明一下。
实例 1:
foo:=test
var:=$(foo)
All:
@echo $(var)
这种用法是最常见的使用方法,打印出 var 的值就是 test。我们可以认为是一层的嵌套引用。
实例 2:
foo=bar
bar=test
var:=$($(foo))
All:
@echo $(var)
执行 make 命令的时候得到的结果也是 test。$(foo) 代表的字符串是 bar,变量 bar 表示的值是 test,所以对 bar 的引用就是 test,所以最终 var 的值就是 test。这是变量的二层嵌套执行。当然我们还可以使用三层的嵌套执行,写法跟上面的方式是一样的。嵌套的层数也可以更多,但是不提倡使用。
我们在给一个变量进行赋值时,可以同时引用多个变量,还可以包含一些文本字符。比如:
first_pass=hello
bar=first
var:=$(bar)_pass
all:
@echo $(var)
或者
first_pass=hello
bar=first
foo=pass
var:=$(bar)_$(foo)
all:
@echo $(var)
执行 make 时, var 的值是 hello。
最新文章
- C# FTP/SFTP文件传输控件FTP for .NET/.NET CF 详细介绍
- 怎样用好ZBrush 中的映射大师功能
- [转]Responsive Tables Demo
- Linux-TCP/IP TIME_WAIT状态原理
- Android Studio导入Project的方法
- 深入研究java.lang.ThreadLocal类
- GNU make 总结 (五)
- UVa 10161 Ant on a Chessboard
- js设计模式(3)---桥接模式
- WordPress RokIntroScroller插件‘thumb.php’多个安全漏洞
- poj2608---几个字母映射到同一个数字
- “倔驴”一个h5小游戏的实现和思考(码易直播)——总结与整理
- hadoop环境中误删除tmp文件夹的恢复
- azkaban的安装部署
- C++中返回引用和返回值的区别
- 安装Nginx+Lua+OpenResty开发环境配置全过程实例
- UVAlive6439_Pasti Pas!
- Selenium2+python自动化51-unittest简介
- 用JavaScript获取URL参数的方法之一
- QTimer掉坑出坑过程