当前位置: 首页 > news >正文

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

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

 转载自:http://www.cnblogs.com/wanqieddy/archive/2011/09/21/2184257.html

在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 了。

相关文章:

  • centos7zabbix-agen安装
  • vue-i18n beforeDestroy不能调用this.$t
  • 验证码识别并复制到剪切板
  • cheerp 简介
  • CSS 三角实现
  • 第十二章 Java内存模型与线程
  • 从源码分析如何优雅的使用 Kafka 生产者
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • 阿里云重庆大学大数据训练营落地分享
  • Android Studio多渠道打包实战
  • 传统企业触网的战略--借助电商外包
  • 本周ASP.NET英文技术文章推荐[06/10 - 06/16]
  • 匈奴的历史简述
  • SpringCloud(Finchley版)6 - Config-Client
  • Golang-长连接-状态推送
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • input的行数自动增减
  • JavaScript函数式编程(一)
  • JavaWeb(学习笔记二)
  • Linux后台研发超实用命令总结
  • Redux系列x:源码分析
  • spring学习第二天
  • Vultr 教程目录
  • 不上全站https的网站你们就等着被恶心死吧
  • 初探 Vue 生命周期和钩子函数
  • 当SetTimeout遇到了字符串
  • 关于使用markdown的方法(引自CSDN教程)
  • 利用DataURL技术在网页上显示图片
  • 目录与文件属性:编写ls
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 我这样减少了26.5M Java内存!
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 阿里云ACE认证之理解CDN技术
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (七)c52学习之旅-中断
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转)C#开发微信门户及应用(1)--开始使用微信接口
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .NET Core 版本不支持的问题
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .NET导入Excel数据
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • [ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [2019.2.28]BZOJ4033 [HAOI2015]树上染色
  • [ACM] hdu 1201 18岁生日
  • [AutoSAR 存储] 汽车智能座舱的存储需求
  • [c#基础]值类型和引用类型的Equals,==的区别
  • [C++] 多线程编程-thread::yield()-sleep_for()