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
随机推荐
- UESTC_秋实大哥の恋爱物语 2015 UESTC Training for Search Algorithm & String<Problem K>
K - 秋实大哥の恋爱物语 Time Limit: 5000/2000MS (Java/Others) Memory Limit: 32000/32000KB (Java/Others) Su ...
- python-MySQL库简单安装
1 raise EnvironmentError("%s not found" % (mysql_config.path,)) EnvironmentError: mysql_c ...
- Android学习总结——SharedPreferences
SharePreferences存储方式,只是轻量级数据存储,xml格式的数据显示方式.简单存储步骤如下:一:获取SharePreferences对象1.SharedPreferences pref ...
- Git(一):Git与版本号控制简单介绍
Intro 版本号控制系统是什么 版本号控制系统(Version Control System,VCS)能够帮助我们记录和跟踪项目中各文件内容的改动变化.它能够帮我们保存项目的各个版本号.以 ...
- Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作
详细的Spring MVC框架搭配在这个连接中: Maven 工程下 Spring MVC 站点配置 (一) Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作 这篇主 ...
- 动态加载Ribbon功能区
上下文选项卡对新UI的功能提供了极大的推进作用.当用户对某对象执行特定的任务时就会出现特定的选项卡.例如,在Excel中处理图表时,一个上下文选项卡提供用于图表处理的额外选项.本文将介绍创建和执行这些 ...
- 单击事件的处理方式及注册窗体的创建之(四)Intent实现界面跳转传值
跳转开发步骤: 创建Intent对象 设置Intent对象的跳转路径 启动Intent //Register_Activity.java case R.id.btnRegister: Inte ...
- CREATE DATABASE建库语句详解
原创地址:http://blog.csdn.net/guguda2008/article/details/5716939 一个完整的建库语句是类似这样的: IF DB_ID('TEST') IS NO ...
- 简单的FTP上传下载(java实现 swing界面)
/** *阅读前请自己在win7上建立FTP主机 *具体步骤如:http://jingyan.baidu.com/article/574c5219d466c36c8d9dc138.html * 然后将 ...
- AUL使用初记
案例:部门有一个数据库因为机器无故重启,无法启动,初步判断是系统表空间出问题了.尝试过各种不同手段,均无法修复.后来发现上面只有一个用户的数据,遂想到直接通过AUL工具从数据文件中抽取出整个库. 准备 ...