版权所有,转载请注明:本文出自学与思linux编程网
接着Makefile入门(2)继续来学习Makefile
在前面的例子中,Makefile中的每个目标体都是一个文件,但事实上我们在看别人写得比较正规的Makefile时,我们会发现有些目标体并不是文件,比如常见的clean和install目标体,如下面这个真实的Makefile片断:
install:
cp sunrise /usr/bin/
clean:
rm *.o sunrise
这种在Makefile中不是文件的目标体我们称之为伪目标,它仅仅起到标签的作用。如这里clean和
install这两个目标体都是伪目标,有了它们我们就可以在命令行输入make
install来把sunrise这个程序安装到/usr/bin/目录中,或者输入make
clean来清除以前编译好的目标文件和可执行程序以完整的重新编译整个程序。
那如果make程序正在处理的目录中正好有一个叫install的文件,我们输入make install会发生什么事情呢?回忆前一篇文章我们学习的make工作流程可知:
因为clean这个目标对应的规则中没有依赖体,所以make会认为install文件是最新的,于是就不会去执行该条规则对应的 cp sunrise /usr/bin/ 这条命令了,我们的安装也就没有真正完成。
为了避免上述情况,我们可以用 .PHONY 这个伪目标关键字来显示指明某个目标是伪目标,如:
.
.
.
.PHONY : install clean
install:
.
.
.PHONY : install clean
install:
cp sunrise /usr/bin/
clean:
rm *.o sunrise
有了这样显示的说明,当我们输入make install时,不管make正在处理的目录是否包含一个叫install的文件,make程序总是会去执行这条规则所对应的命令 cp sunrise /usr/bin/ ,对clean这个目标的处理也类似。
前面我们看到的install和clean这两个伪目标都没有依赖体,那是不是伪目标不能有依赖体呢?其实不是,伪目标也可以有依赖体,如:
.PHONY : all
all: sunrise
.
.
.
all: sunrise
.
.
.
这样我们就可以输入make all(如果all对应的规则是整个Makefile的第一条规则,我们只需简单的输入make就行了)来编译这个sunrise了。
对Makefile的伪目标总结一下:除非显示的用.PHONY对一个目标体作说明外,make在处理普通目标体(目标体是文件)和伪目标(目标体
不是文件)时流程都一样,决定是否执行该目标对应规则的命令的依据也一样,但对于用.PHONY显示指明的伪目标,make程序则不会管这个目标体所对应
的依赖体的时间只会去分析这些依赖体是否已经准备好(如果有依赖体),然后就去执行该规则的命令(如果有命令部分)。