Chinaunix首页 | 论坛 | 博客
  • 博客访问: 652251
  • 博文数量: 128
  • 博客积分: 4385
  • 博客等级: 上校
  • 技术积分: 1546
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-22 14:05
文章分类

全部博文(128)

文章存档

2012年(2)

2011年(51)

2010年(75)

分类: LINUX

2011-07-19 11:03:12

http://hi.baidu.com/kj_28/blog/item/20e068d9c519922410df9b60.html
make的工作方式

GNU的make工作时的执行步骤入下:(想来其它的make也是类似)

     1、读入所有的Makefile。
     2、读入被include的其它Makefile。
     3、初始化文件中的变量。
     4、推导隐晦规则,并分析所有规则。
     5、为所有的目标文件创建依赖关系链。
     6、根据依赖关系,决定哪些目标要重新生成。
     7、执行生成命令。

命令执行

当依赖目标新于目标时,也就是当规则的目标需要被更新时,make会一条一条的执行其后的命令。需要注意的是,如果你要让上一条命令的结果应用在下一条命 令时,你应该使用分号分隔这两条命令。比如你的第一条命令是cd命令,你希望第二条命令得在 cd之后的基础上运行,那么你就不能把这两条命令写在两行上,而应该把这两条命令写在一行上,用分号分隔。如:

    示例一:
        exec:
                cd /home/hchen
                pwd

    示例二:
        exec:
                cd /home/hchen; pwd

当我们执行“make exec”时,第一个例子中的cd没有作用,pwd会打印出当前的Makefile目录,而第二个例子中,cd就起作用了,pwd会打印出“/home/hchen”。(因为第一个例子中两条命令其实是在不同的shell中执行的)

make一般是使用环境变量SHELL中所定义的系统Shell来执行命令,默认情况下使用UNIX的标准Shell——/bin/sh来执行命令。

伪目标

最早先的一个例子中,我们提到过一个“clean”的目标,这是一个“伪目标”,

     clean:
             rm *.o temp

正像我们前面例子中的“clean”一样,即然我们生成了许多文件编译文件,我们也应该提供一个清除它们的“目标”以备完整地重编译而用。 (以“make clean”来使用该目标)

因为,我们并不生成“clean”这个文件。“伪目标”并不是一个文件,只是一个标签,由于“伪目标”不是文件,所以make无法生成它的依赖关 系和决定它是否要执行。我们只有通过显示地指明这个“目标”才能让其生效。当然,“伪目标”的取名不能和文件名重名,不然其就失去了“伪目标”的意义了。

当然,为了避免和文件重名的这种情况,我们可以使用一个特殊的标记“.PHONY”来显示地指明一个目标是“伪目标”,向make说明,不管是否有这个文件,这个目标就是“伪目标”。

     .PHONY : clean

只要有这个声明,不管是否有“clean”文件,要运行“clean”这个目标,只有“make clean”这样。于是整个过程可以这样写:

      .PHONY: clean
     clean:
             rm *.o temp

关于冒号

      makefile中,“:”除了表示目标依赖关系外,还用于分隔不同的目录,如:

      SRC_PATH ?= .:..

阅读(1658) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~