Makefile伪目标

来源:互联网 发布:编译c 的软件 编辑:程序博客网 时间:2024/06/15 19:51

Makefile伪目标

伪目标是这样一个目标:它不代表一个真正的文件名,在执行make时可以指定这个目标来执行其所在规则定义的命令,有时也可以将一个伪目标称为一个标签。使用伪目标有两点要求:
1)避免在我们的Makefile中定义的只执行命令的目标和工作目录下的实际文件出现名字冲突。
2)提高执行make时的效率,特别是对一个大型的工程来说,编译的效率也许你同样关心。

1.如果我们需要书写的规则不是去创建一个目标文件,而是通过make命令行明确指定它来执行一些特定的命令。像常见的clean目标:
clean:
规则中“rm”不是创建文件“clean”的命令,而是删除当前目录下的所有.o 文件和temp文件。当工作目录下不存在“clean”这个文件时,我们输入“make clean”就可以完成上述的删除工作。但是如果在当前工作目录下存在“clean”这个文件就不一样了,同样我们输入“make clean”,由于这个规则没有任何依赖文件,所以目标被认为是最新的而不去执行规则所定义的命令,因此“rm”将不会被执行。为解决这个问题,我们将目标“clean”声明为伪目标。

.PHONY:cleanclean:    rm -f *.o temp

2.伪目标的另外一个使用场合是在make的并行和递归执行过程中。此情况下一般会存在一个变量,定义为所有需要make的子目录。对多个目录进行make的实现方式可以是:在一个规则的命令行中使用shell循环来完成。

3.一般情况下,一个伪目标不作为另一个目标的依赖,这是因为当一个目标文件的依赖包含伪目标时,每一次在执行这个规则时伪目标所定义的命令都会被执行。当一个伪目标没有作为任何目标的依赖时,我们只能通过make的命令行来明确指定它为make的终极目标,来执行它所在规则所定义的命令,例如make clean。

4.在Makefile中,一个伪目标可以有自己的依赖。在一个目录下如果需要创建多个可执行程序,我们可以将所有程序的重建规则在一个Makefile中描述。因为Makefile中第一个目标是“终极目标”,约定的做法是使用过一个称为“all”的伪目标来作为终极目标,它的依赖文件就是那些需要创建的程序:

#sample Makefileall : prog1 prog2 prog3.PHONY : allprog1 : prog1.o utils.o    cc -o prog1 prog1.o utils.oprog2 : prog2.o    cc -o prog2 prog2.oprog3 : prog3.o sort.o utils.o    cc -o prog3 prog3.o sort.o utils.o

执行make时,目标“all”作为终极目标。为了完成对它的更新,make会创建或者重建目标“all”的所有依赖文件。当需要单独更新某一个程序时,我们可以通过make的命令行选项来明确指定需要重建的程序,例如make prog1。

2017-11-21-LR 来自GNU make中文手册

原创粉丝点击