[makefile 笔记]之一--Make的工作方式、命令执行、伪目标与冒号

来源:互联网 发布:多比特五子棋软件 编辑:程序博客网 时间:2024/06/17 02:27
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 ?= .:..
0 0