文档章节

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

老汉-憨憨
 老汉-憨憨
发布于 2017/04/01 11:25
字数 461
阅读 16
收藏 0
在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 了。

 

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

老汉-憨憨
粉丝 20
博文 322
码字总数 68382
作品 0
深圳
程序员
私信 提问
整理下makefile中的语法,变量

最近研读了下u-boot的makefile,其中有不少的语法,变量不甚了解,特此将查找到资料记录! 1. if函数很像GNU的make所支持的条件语句——ifeq(参见前面所述的章节),if函数的语法是: $(if...

文剑Boy
2015/02/15
0
0
MakeFile 学习

1.Makefile中include的作用 2. CFLAGS 和CXXFLAGS 的作用 3. make -f *.mk $@ TARGET="" LIBS="**" .... 后面接的变量是做什么的 4.Makefile里面 -l 和 -L的区别 5.实际项目makefile分析: ......

抢地主
2016/07/23
234
0
Makefile中几个赋值运算符

在Makefile中经常看见这几个赋值运算符(“=”,“:=”,“?=”,“+=”) 新建一个Makefile,内容如下: ifdef aa var="hello world" endif ifeq ($(bb),define) var ?= "hello world 1" ......

08_calm
2016/08/18
39
0
Linux学习入门--make学习总结

make的作用 可以根据模块的修改情况重新编译链接目标代码,保证目标代码都是由最新的模块组成的。 2. makefile的编写方法 格式: 目标:依赖列表 命令 注意命令左侧是Table制表位 注释 语句前...

遇逆境-处之泰然
2018/02/25
24
0
简单而又完整的makefile

刚开始学习makefile是一个痛苦的过程,从杂乱无章的规则到一个简单的makefile再到一个系统化的makefile不是一蹴而就的事情。今天 我就写一个简单的,规范的(相对而言),功能也算齐全的Mak...

长平狐
2012/09/03
207
0

没有更多内容

加载失败,请刷新页面

加载更多

ActiveMQ学习之通讯协议

一、支持的通讯协议 ActiveMQ支持的client-broker通讯协议有:TCP、NIO、UDP、SSL、HTTP(S)、VM 其中配置Transport Connector的文件在ActiveMQ安装目录的conf/activemq.xml中的<TransportCon...

冥焱
19分钟前
33
0
应急广播户户通平台

一、平台概述 应急广播户户通平台为软硬一体化广播服务解决方案。实现了应急广播、视音频及图片文字信息、调频及数字广播FM、天气预报信息接收功能,以及视音频播放、智能机器人、电子日历等...

neocean
今天
83
0
如何为Apache 2.2启用mod_rewrite

我已经在我的Vista机器上安装了新的Apache 2.2,一切正常,除了mod重写。 我没有注释 LoadModule rewrite_module modules/mod_rewrite.s 但是我的重写规则都没有,即使是简单的重写规则 Re...

javail
今天
23
0
移除Python unicode字符串中的重音符号的最佳方法是什么?

我在Python中有一个Unicode字符串,我想删除所有的重音符号(变音符号)。 我在网上发现了一种用Java实现此目的的优雅方法: 将Unicode字符串转换为长规范化格式(带有单独的字母和变音符号)...

技术盛宴
今天
48
0
两周自制脚本语言-第11天 优化变量读写性能

第11天 优化变量读写性能 以变量值的读写为例,向读者介绍基于这种理念的语言处理器性能优化方式。 11.1 通过简单数组来实现环境 假如函数包含局部变量x与y,程序可以事先将x设为数组的第0个...

果汁分你一半
今天
62
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部