http://blog.csdn.net/darennet/article/details/8185881
 
Makefile中使用$$的使用
    在makefile中,会经常使用shell命令,也经常见到$var 和

var的情况,有什么区别呢,区别大了。不要认为在makefile的规则的命令行中使用$var就是将makefile的变量和shell共享了,这里仅仅是读取makefile的变量然后扩展开,将其值作为参数传给了一个shell命令。而

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

随机推荐

  1. Wap touch flispan demo

    直接上代码了 仔细看看例子就会明白 简单实用 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8& ...

  2. Binary Tree Zigzag Level Order Traversal 解答

    Question Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, fro ...

  3. 【C++基础之十四】函参的缺省

    可能会有这么一个函数,在大部分的情况下,我们不用给它传递参数,但在某些特殊情况下,我们需要给它传递参数,那怎么办呢? 简单啊,写两个一样的方法,一个带参,一个不带参... 这样也太没水准了.来点高端的 ...

  4. java POI读取excel 2007/2003

    2003版office excel读取 import java.io.FileNotFoundException; import java.io.IOException; import java.io ...

  5. C,C#,C++中&&和||,&和|的联系和区别

    本文来自:http://www.cnblogs.com/GT_Andy/archive/2010/03/30/1921805.html 两者计算结果相同(针对各自的运算对象),只是性能上有差别而已. ...

  6. Yeslab现任明教教主数据中心第二门课程UCS 视频教程下载

    Yeslab现任明教教主数据中心第二门课程UCS 视频教程下载 视频教程目录 Yeslab现任明教教主数据中心第二门课程UCS.1.介绍UCS.rar Yeslab现任明教教主数据中心第二门课程UCS ...

  7. Spting使用memcached

    applicationContext.xml配置文件: <?xml version="1.0" encoding="UTF-8"?> <bea ...

  8. dl dt dd标签

    <dl>标记定义了一个定义列表,定义列表中的条目是通过使用<dt>标记(“definition title”,定义标题)和<dd>标记(“definition de ...

  9. Lowest Common Ancestor of a Binary Search Tree、Lowest Common Ancestor of a Binary Search Tree

    1.Lowest Common Ancestor of a Binary Search Tree Total Accepted: 42225 Total Submissions: 111243 Dif ...

  10. Ubuntu下安装arm-linux-gcc

    安装步骤: 这里采用友善之臂发布的arm-linux-gcc-4.4.3.tar.gz软件包. 一.将压缩包arm-linux-gcc-4.4.3.tar.gz存放在opt目录下. 执行解压命令:su ...