Makefile 中:= ?= += =的区别

 

在Makefile中我们经常看到 = := ?= +=这几个赋值运算符,那么他们有什么区别呢?我们来做个简单的实验

新建一个Makefile,内容为:
ifdef DEFINE_VRE
    VRE = “Hello World!”
else
endif

ifeq ($(OPT),define)
    VRE ?= “Hello World! First!”
endif

ifeq ($(OPT),add)
    VRE += “Kelly!”
endif

ifeq ($(OPT),recover)
    VRE := “Hello World! Again!”
endif

all:
    @echo $(VRE)

敲入以下make命令:
make DEFINE_VRE=true OPT=define 输出:Hello World!
make DEFINE_VRE=true OPT=add 输出:Hello World! Kelly!
make DEFINE_VRE=true OPT=recover  输出:Hello World! Again!
make DEFINE_VRE= OPT=define 输出:Hello World! First!
make DEFINE_VRE= OPT=add 输出:Kelly!
make DEFINE_VRE= OPT=recover 输出:Hello World! Again!

从上面的结果中我们可以清楚的看到他们的区别了
= 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值

之前一直纠结makefile中“=”和“:=”的区别到底有什么区别,因为给变量赋值时,两个符号都在使用。网上搜了一下,有人给出了解答,但是本人愚钝,看不懂什么意思。几寻无果之下,也就放下了。今天看一篇博客,无意中发现作者对于这个问题做了很好的解答。解决问题之余不免感叹,有时候给个例子不就清楚了吗?为什么非要说得那么学术呢。^_^

1、“=”

make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:

x = foo
            y = $(x) bar
            x = xyz

在上例中,y的值将会是 xyz bar ,而不是 foo bar 。

2、“:=”

“:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。

x := foo
            y := $(x) bar
            x := xyz

在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。

最新文章

  1. 轻松自动化---selenium-webdriver(python) (六)
  2. C# 代码编程规范
  3. .NET异常问题总结
  4. 問題排查:.NETSystem.Runtime.Remoting.RemotingException: TCP 信道协议冲突: 应为报头。
  5. LintCode "Count of Smaller Number before itself"
  6. 显示和隐藏Mac隐藏文件的终端命令
  7. android 安装应用程序apk安装不了
  8. NodeJS异常处理uncaughtException篇
  9. IntelliJ Idea12 破解码与中文乱码配置
  10. ccr test
  11. Linux Kernel ‘perf’ Utility 本地提权漏洞
  12. Zend Server安装后首次运行就出现Internal Server Error的解决(转)
  13. js加载优化
  14. 为 Python Server Pages 和 Oracle 构建快速 Web 开发环境。
  15. 初识Linux 命令
  16. 几款Http小服务器
  17. MVC验证04-自定义验证规则、日期范围验证
  18. BZOJ_1180_[CROATIAN2009]OTOCI_LCT
  19. docker容器以ROOT账号登录(获取ROOT权限/ROOT密码)
  20. 前端 ----js的事件流的概念(重要)

热门文章

  1. 使用servletAPI三种方式简单示例
  2. java可变参数例子:求学生成绩信息,不确定课程数
  3. [LeetCode] next_permutation
  4. php实现文件安全下载
  5. linux基本命令(3)-文件目录操作指令
  6. sudo: unable to resolve host ubuntu提示的解决
  7. mapreduce job提交流程源码级分析(一)(原创)
  8. 如何用sql批量删除一个id段内的dedecms文章?
  9. Matlab实现线性回归和逻辑回归: Linear Regression & Logistic Regression
  10. python 之验证码