GNU make doc - 6.6 追加变量值
有时我们需要对已经定义过的变量进行追加,可以使用+=
进行这一操作,就像下面这样
objects += another.o
该语句取objects
变量的值,并在其后追加 another.o
(结果会在原变量值和another.o
之间加上一个空格,即使上述语句中+=
和another.o
之间没有空格或有多个空格),因此
objects = main.o foo.o bar.o utils.o
objects += another.o
会将objects
设置为main.o foo.o bar.o utils.o another.o
使用+=
类似于:
objects = main.o foo.o bar.o utils.o
objects := $(objects) another.o
但是在使用更为复杂的变量值时,这两种方式可能会有明显的差异
若对尚未定义过的变量进行操作时,+=
等效于:=
,定义了一个递归展开的变量.然而,当对已定义的变量进行+=
操作时,实际进行的操作取决于该变量的类型(简单展开还是递归展开).关于两种变量类型请参考The Two Flavors of Variables
当使用+=
追加变量时,实质就是在原先的定义上追加.
当对一个原先以:=
或者::=
定义的简单展开展变量进行+=
操作时,make将会在追加之前将原变量展开
variable := value
variable += more
等效于
variable := value
variable := $(variable) more
另一方面,当对一个原先以=
定义的递归展开变量进行+=
操作时,make的表现与前一种情况有所不同,回想一下,当你定义一个循环展开变量时,make并不会立即展开变量值中包含的变量或函数引用,而是会照原样保留,只有在之后引用这个变量时,才会展开变量定义中所包含的引用.当对递归展开变量进行+=
操作时,实际上make会直接在变量字面值(而不是展开后的值)上进行附加.
variable = value
variable += more
大致相当于
temp = value
variable = $(temp) more
当然,make并不会为此而实际定义temp.值得关注的是,当变量原始值包含对其他变量或函数的引用时,发生了什么,举个例子:
CFLAGS = $(includes) -O
…
CFLAGS += -pg # enable profiling
第一行的CFLAGS
定义包含了对另一个变量includes
的引用.由于CFLAGS
是用=
定义的,所以它是一个循环展开变量,也就意味着make在处理CFLAGS
的定义时并不会展开$(includes) -O
.因此,也就意味着includes
在真正生效之前不必被定义.includes
只需在真正使用CFLAGS
之前定义即可.如果我们试图使用除了+=
之外的其他方法完成对CFLAGS
的追加操作,或许会这样:
CFLAGS := $(CFLAGS) -pg # enable profiling
这相当接近我们的目的,但并不完全是.使用:=
会将CFLAGS
重新定义为简单展开变量;也就意味着make会在重新为CFLAGS
赋值之前展开$(CFLAGS) -pg
,如果includes
尚未定义,我们会得到 -O -pg
,即使后来定义了includes
也不会对CFLAGS
产生影响.相反,使用+=
会将CFLAGS
设置为未展开的$(includes) -O -pg
.因此也就会保留对includes
的引用,所以只要在之后任何地方给出了includes
的定义,对CFLAGS
的引用$(CFLAGS)
都会使用该值.
GNU make doc - 6.6 追加变量值的更多相关文章
- 解决debug到jdk源码时不能查看变量值的问题
目录 如何跟踪jdk源码 1. 编译源码 2. 关联源码 3. 大功告成 如何跟踪jdk源码 看到这个标题大概大家都会在心里想谁还跟踪个源码呀,在eclipse中打个断点,以debug的方式运行,然后 ...
- $ORACLE_HOME变量值末尾多“/”惹的祸
之前一直误以为$ORACLE_HOME变量的路径中末尾多写一个"/"不会有影响. 今天做实验时碰到一个情景,发现并不是这样. 环境:OEL 5.7 + Oracle 10.2.0. ...
- JavaScript判断变量值简单的方法
今天在看一个动态web表单设计器的时候发现项目中的 一个写法 function sum_total(v){ if (!v) { v= 0; } } !v 这是什么写法?不过可以肯定的是,这是一种判断 ...
- axure设置变量值
以登录框为例设置axure变量值 1.打开axure,打开新页面命名为login,拖入一个矩形背景,命名:登录背景图 2.拖入标签控件和输入框控件分别命名为用户名:.userName.密码:.pass ...
- 通过反射将变量值转为变量名本身ZZ
这是.NET反射的一个有趣小例子: 通过反射将变量值转为变量名本身. 当然要先添加命名空间:using System.Reflection; 示例代码如下: class Program { st ...
- MFC一个类访问另一个类成员对象的成员变量值
MFC中一个类要访问另外一个类的的对象的成员变量值,这就需要获得原来那个类对象的指针,其实有好几种方法都可以实现. 比如维护一个单例模式.设置静态变量等等.我们这里举个列子,实现多个类之间的相互访问. ...
- Shell脚本获得变量值作为新变量一部分的值
最近使用shell写一个发布脚本时,由于shell编程是边学便用的缘故,经验不足,中间遇到一个问题,一个变量的值作为一个新变量的一部分,而我要根据变量获得新变量的值,以前没有遇到过.网络搜索一番,最后 ...
- JDK环境变量中dt.jar、tools.jar等变量值的作用
变量名:CLASSPATH 变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; tools.jar: 工具类 库,它跟我们程序中用到的 基础 ...
- python 交换变量值
在其他语言中,交换两个变量值的时候,可以这样写: temp = a a = b b = temp 在Python中,我们可以简单的这样写: a,b=b,a 实验如下: >>> a=1 ...
随机推荐
- spring cloud的配置
注解篇 @EnableEurekaServer 注解启动一个服务注册中心提供给其他应用进行对话 @EnableDiscoveryClient 激活Eureka中的DiscoveryClient实现 配 ...
- 初学者学Java常遇到的问题,我都给你回答了!
前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 春节在家刷知乎,看到了一个知乎的问题:<学 ...
- NSQ源码剖析——主要结构方法和消息生产消费过程
目录 1 概述 2 主要结构体及方法 2.1 NSQD 2.2 tcpServer 2.3 protocolV2 2.4 clientV2 2.5 Topic 2.6 channel 3 启动过程 4 ...
- Zabbix添加SNMP自定义监控项OID出现“No Such Instance currently exists at this OID”
原因:zabbix 是用snmpget来获取指定的OID数据,snmpwalk是遍历某个OID下的数据. 所以一定要用snmpget来验证某个OID是否正确. snmptranslate 获取的OID ...
- learn more ,study less(二):整体性学习技术(下)
随意信息的处理 随意信息,或者内容太多.太复杂的信息,都不容易理解,它们需要不同的技术.假 如你发现联想法不能帮助你理解材料,或者需要花费的时间太长,这时候处理随意信息的方 法就很适合了. 这些处理随 ...
- php7 mongodb 扩展windows 安装
1. 打开phpinfo 查看 nts(非线程) 还是 ts (线程),然后查看操作位数 注: 86 等于 32 位 2. 下载对应的版本的php_mongodb.dll 文件 下载链接: pecl ...
- apace访问403错误的解决方法汇总
作为一个努力学习的实习生,遇到问题还是靠记录才能更好的学习. 首先附上故障图 翻译过来就是啥呢? 于是天真的我去百度了一下大神们的解决方法,目录没权限嘛,来个777就完事了.一开始还觉得挺合乎情理的, ...
- Altium Designer 14安装破解
Altium Designer 14简称AD14,是一款专业的PCB设计软件,利用他可以计出专业的PCB元件.Altium Designer 14.3.10是目前的最新版本. Altium Desig ...
- 关于求最长子串,使得最大减最小小于k的问题-以POJ4003为例
问题 给出一个长度为\(n\)的序列\(a[i]\),有\(m\)次询问, 每次给你一个\(k\),让你求一个最长子串\([l,r]\),使得\(max_l^r\{a_i\}-min_l^r\{a_i ...
- 三、Mongodb Java中的使用
添加maven依赖 <!--mongodb 驱动--> <dependency> <groupId>org.mongodb</groupId> < ...