Makefile中使用$$的使用
在makefile中,会经常使用shell命令,也经常见到$var 和
var是在访问一个shell命令内定义的变量,而非makefile的变量。此外,如果某规则有n个shell命令行构成,而相互之间没有用';'和'\'连接起来的话,就是相互之间没有关联的shell命令,相互之间也不能变量共享。看如下例子:
makefile代码段1:
VAR=3
target: prerequsite1 prerequsite2
echo $VAR (1)
VAR=4 (2)
echo $VAR (3)
echo $$VAR (4)
在代码段1中,(1)的结果是3,显然makefile利用自己的变量将$VAR扩展成3之后传递给这个echo这个shell命令。
(2)中,是一个独立的shell命令自己第一了一个shell变量,名字也叫VAR,且其值为4,不会影响到makefile中的VAR。
(3)中,同(1),makefile中的变量VAR的值依然是3
(4)makefile将$$VAR先执行一次扩展得到如下shell命令:
echo $VAR然后交给shell去解释执行,可是对于这个shell命令来说VAR是一个为定义的变量,因此输出的结果就是个空行。
makefile代码段2:
VAR=3
target: prerequsite1 prerequsite2
echo $VAR;\ (1')
VAR=4;\ (2')
echo $VAR;\ (3')
echo $$VAR (4')
在代码段2中,所有的shell命令都被连接起来了,那么执行的结果就有变化了:
(1')结果同(1),$VAR被替换成了3
(2')结果同(2)
(3')输出3,因为虽然shell中有VAR变量,可是makefile先要进行扩展,扩展的结果就是echo 3。
(4')输出4,因为makefile扩展结果为echo $VAR,而shell中已经有了变量VAR,且其值为4.
类似的例子还有如下:
makefile代码片断3:
SUBDIRS=tools examples src
target: prerequsite1 prerequsite2
for dir in $SUBDIRS; do $(MAKE) -C $$dir;done
make首先将这个命令扩展成:
for dir in tools examples src; do make -C $dir; done
然后交给shell解释执行,可见dir就是一个shell中的变量。
总之,在makefile的shell命令中,党要引用shell变量的时候,要使用$$VAR格式。
此外注意一点,在makefile中,$$还被用来做SECONDEXPANSION,即二次扩展,一般是作为prerequsites.
如:
.SECONDEXPANSION (要使用这个feature就的加上这一行)
main_objs := main.o try.o test.o
lib_objs := lib.o api.o
main lib:
@_objs)
@_objs)
第一阶段的扩展结果为$($@_objs),第2阶段的扩展结果为:$@被替换为main lib,与_objs连接成main_objs
lib_objs。加上外面$的扩展,就是$main_objs $lib_objs,最终结果为main.o try.o test.o lib.o
api.o
随机推荐
- 年度钜献,108个大数据文档PDF开放下载
1.大数据的开放式创新——吴甘沙 相关阅读:[PPT]吴甘沙:让不同领域的数据真正流动.融合起来,才能释放大数据的价值 下载:大数据的开放式创新——吴甘沙.pdf 2.微软严治庆——让大数据为每个人服 ...
- eclipse的优化 gc.log
原帖:http://www.javaeye.com/topic/756538 性能优化从身边做起. 首先建立评估体系,将workspace里所有的项目close掉,关闭eclipse.优化的用例就是启 ...
- 剑指offer-面试题21.包含min函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数. 在该栈中,调用min,push及pop的时间复杂度都是O(1). 这一题实际上需要一个辅助栈存储最小值: 1.在模板类定 ...
- 剑指offer-面试题12.打印1到最大的n位数
题目:输入数字n,按照打印出从1最大的n位10进制数.比如3,则 打印出1.2.3一直到最大的3位数即999 1.你觉得如果面试会有这么简单的题,那 只能说明你---太天真. 2.n=3尚可,如果n= ...
- Java中的native方法
博客引用地址:Java中的native方法 今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解. 一. 什么是Native Method 简单地 ...
- 如何把apache和nginx 加入到系统服务,用service 命令来控制启动、停止
1 把apache 加入到系统服务,即用service 命令来控制Apache 启动.停止 如果Linux服务器上默认安装了httpd的话(用rpm -qa|grep httpd查看),那你就可以用 ...
- UML图总结
UML叙述 UML文档仅仅是设计与开发人员采用UML语言进行系统分析与设计的结果,并没有给出如何进行开发和采用何种开发流程,同样也不指导如何进行面向对象设计. UML文档描述了面向对象分析与设计的结果 ...
- 格而知之5:我所理解的Run Loop
1.什么是Run Loop? (1).Run Loop是线程的一项基础配备,它的主要作用是来让某一条线程在有任务的时候工作.没有任务的时候休眠. (2).线程和 Run Loop 之间的关系是一一对应 ...
- Unity之极光推送
Android应用中大多数应用使用了推送,游戏中当然也可以使用推送!下面在Unity3D做个测试!(下面是客套话,大家可以忽略) 1.1 什么是推送技术? 推送技术,又名反向AJAX,指的是一种基于I ...
- [Python笔记][第二章Python序列-tuple,dict,set]
2016/1/27学习内容 第二章 Python序列-tuple tuple创建的tips a_tuple=('a',),要这样创建,而不是a_tuple=('a'),后者是一个创建了一个字符 tup ...