高级使用方法有两种:第一种是变量的替换引用,第二种是变量的嵌套引用。

  第一种用法经常用到,第二种用法我们很少使用。我们应该尽量避免使用变量的嵌套引用,在必须使用时,嵌套的层数越少越好。因为这种方法表达比较复杂,条理难以理清。

变量的替换引用:

  我们使用变量的时候,经常对它的值(字符串)进行操作。

  操作字符串,通常使用字符串操作函数,比如 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。

最新文章

  1. C# FTP/SFTP文件传输控件FTP for .NET/.NET CF 详细介绍
  2. 怎样用好ZBrush 中的映射大师功能
  3. [转]Responsive Tables Demo
  4. Linux-TCP/IP TIME_WAIT状态原理
  5. Android Studio导入Project的方法
  6. 深入研究java.lang.ThreadLocal类
  7. GNU make 总结 (五)
  8. UVa 10161 Ant on a Chessboard
  9. js设计模式(3)---桥接模式
  10. WordPress RokIntroScroller插件‘thumb.php’多个安全漏洞
  11. poj2608---几个字母映射到同一个数字
  12. “倔驴”一个h5小游戏的实现和思考(码易直播)——总结与整理
  13. hadoop环境中误删除tmp文件夹的恢复
  14. azkaban的安装部署
  15. C++中返回引用和返回值的区别
  16. 安装Nginx+Lua+OpenResty开发环境配置全过程实例
  17. UVAlive6439_Pasti Pas!
  18. Selenium2+python自动化51-unittest简介
  19. 用JavaScript获取URL参数的方法之一
  20. QTimer掉坑出坑过程

热门文章

  1. 学习Java Day21
  2. [代码审计基础 04]ssrf漏洞的利用&伪协议
  3. CF846E - Chemistry in Berland
  4. Wayland比X11慢的若干解决办法
  5. 结合ChatGPT体验新必应new bing 的惊喜:这是我第一次使用的感受
  6. mysql转DM的日期函数转换
  7. gateway添加跨域配置
  8. Android MVP框架 详细代码
  9. 05 RDD练习:词频统计,学习课程分数
  10. django搭建简易blog