版权全部,转载请注明:本文出自
学与思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程序则不会管这个目标体所对应 的依赖体的时间只会去分析这些依赖体是否已经准备好(若是有依赖体),而后就去执行该规则的命令(若是有命令部分)。