makefile中的.phony作用(防止在Makefile文件中定义的可执行命令的目标规则和工作目录下的实际文件出现名称冲突,并提高执行Makefile的性能)

Posted Dontla

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了makefile中的.phony作用(防止在Makefile文件中定义的可执行命令的目标规则和工作目录下的实际文件出现名称冲突,并提高执行Makefile的性能)相关的知识,希望对你有一定的参考价值。

文章目录

在C项目构建中,经常在Makefile文件中用到.PHONY配置项。.PHONY配置项的主要作用在于避免指定命令和项目下的同名文件冲突,进行性能优化。.PHONY : [command name] 显式指定了一个命令名称【而不是实际文件名】,是为了避免该命令名称与makefile同路径下的文件名重名冲突,以使make [command name]命令可以正确被解析、执行。下面将举例说明。

例 1

如果编写一个规则名称为clean,不产生目标文件,那么该命令在执行make clean时规则都会被执行,makefile内容如下:

clean:
    rm -f *.o temp

rm 命令不产生任何clean文件。

  • 如果目录下不存在名为"clean"的文件,则运行make clean时,命令都会正常执行;
  • 如果目录下存在名为"clean"的文件,则运行make clean时,命令规则会失效,文件"clean"没有依赖文件,始终是最新的,make clean永远不会被执行。

为了解决上述问题,可以使用.PHONY clean指明该clean命令。如下:

.PHONY : clean

clean :
    rm -f *.o temp

这样执行命令make clean会自动忽略名为"clean"文件的存在。已知.PHONY配置项的目标并不是其他文件生成的实际文件,make命令会自动绕过隐含规则搜索过程,因此声明.PHONY配置项会改善性能,bi且不需要担心实际同名文件存在与否。

例 2

如果.PHONY目标有依赖关系。当一个目录中存在多个可运行程序,将其配置在同一个makefile文件。由于make [command name/ Default command]默认缺省规则是makefile文件中的第一个规则,一般将这第一个规则称为"all",其依赖文件为多个可运行程序,如下:

all : p1 p2 p3
.PHONY : all
p1 : p1.o utils.o
       cc -o p1 p1.o utils.o
p2 :  p2.o utils.o
       cc -o p2 p2.o utils.o
p3 :  p3.o utils.o
       cc -o p3 p3.o utils.o

其中p1、p2和p3是三个可执行文件,make把"all"作为主要规则,每次执行时都尝试把"all"更新,因此会检查其依赖文件p1、p2和p3是否需要更新,如果需要,就把它们更新,从而达到我们的目的。通过.PHONY指定目标为all,可以避免目录下同名文件的干扰,即不用检查规则"all"是否有同名文件存在,也不需要查询任何隐含规则,直接假定指定的规则"all"需要被更新。

综上所述,.PHONY是一个伪目标,可以有效防止在Makefile文件中定义的可执行命令的目标规则和工作目录下的实际文件出现名称冲突,并提高了执行Makefile的性能。

参考文章:【C编程系列】Makefile中.PHONY的使用

以上是关于makefile中的.phony作用(防止在Makefile文件中定义的可执行命令的目标规则和工作目录下的实际文件出现名称冲突,并提高执行Makefile的性能)的主要内容,如果未能解决你的问题,请参考以下文章

makefile中的all和.PHONY的作用

Makefile中.PHONY的作用

Makefile——.PHONY

Makefile 中 .PHONY 的用途是啥?

makefile里的Phony

Makefile 8——使用依赖关系文件