Makefile中.PHONY的含义

本文转载自http://www.cnblogs.com/hnrainll/archive/2011/04/12/2013377.html

 

Phony Targets

PHONY 目标并非实际的文件名:只是在显式请求时执行命令的名字。有两种理由需要使用PHONY 目标:避免和同名文件冲突,改善性能。

如果编写一个规则,并不产生目标文件,则其命令在每次make 该目标时都执行。例如:
  clean:
  rm *.o temp
因为"rm"命令并不产生"clean"文件,则每次执行"make clean"的时候,该命令都会执行。如果目录中出现了"clean"文件,则规则失效了:没有依赖文件,文件"clean"始终是最新的,命令永远不会 执行;为避免这个问题,可使用".PHONY"指明该目标。如:
  .PHONY : clean
  这样执行"make clean"会无视"clean"文件存在与否。

已知phony 目标并非是由其它文件生成的实际文件,make 会跳过隐含规则搜索。这就是声明phony 目标会改善性能的原因,即使你并不担心实际文件存在与否。
  完整的例子如下:
  .PHONY : clean
  clean :
  rm *.o temp

phony 目标可以有依赖关系。当一个目录中有多个程序,将其放在一个makefile 中会更方便。因为缺省目标是makefile 中的第一个目标,通常将这个phony 目标叫做"all",其依赖文件为各个程序:
  all : prog1 prog2 prog3
  .PHONY : all
  prog1 : prog1.o utils.o
            cc -o prog1 prog1.o utils.o
  prog2 : prog2.o
            cc -o prog2 prog2.o
  prog3 : prog3.o sort.o utils.o
            cc -o prog3 prog3.o sort.o utils.o

假设你的一个项目最后需要产生两个可执行文件。你的主要目标 是产生两个可执行文件,但这两个文件是相互独立的——如果一 个文件需要重建,并不影响另一个。你可以使用“假象目的”来 达到这种效果。一个假象目的跟一个正常的目的几乎是一样的, 只是这个目的文件是不存在的。因此, make 总是会假设它需要 被生成,当把它的依赖文件更新后,就会执行它的规则里的命令 行。

如果在我们的 makefile 开始处输入:

all : exec1 exec2

其中 exec1 和 exec2 是我们做为目的的两个可执行文件。 make 把这个 'all' 做为它的主要目的,每次执行时都会尝试把 'all' 更新。但既然这行规则里没有哪个命令来作用在一个叫 'all' 的 实际文件(事实上 all 并不会在磁碟上实际产生),所以这个规 则并不真的改变 'all' 的状态。可既然这个文件并不存在,所以 make 会尝试更新 all 规则,因此就检查它的依靠 exec1, exec2 是否需要更新,如果需要,就把它们更新,从而达到我们的目的。

假象目的也可以用来描述一组非预设的动作。例如,你想把所有由 make 产生的文件删除,你可以在 makefile 里设立这样一个规则:

veryclean :
rm *.o
rm myprog

前提是没有其它的规则依靠这个 'veryclean' 目的,它将永远 不会被执行。但是,如果你明确的使用命令 'make veryclean' , make 会把这个目的做为它的主要目标,执行那些 rm 命令。

如果你的磁碟上存在一个叫 veryclean 文件,会发生什么事?这 时因为在这个规则里没有任何依靠文件,所以这个目的文件一定是 最新的了(所有的依靠文件都已经是最新的了),所以既使用户明 确命令 make 重新产生它,也不会有任何事情发生。解决方法是标 明所有的假象目的(用 .PHONY),这就告诉 make 不用检查它们 是否存在于磁碟上,也不用查找任何隐含规则,直接假设指定的目 的需要被更新。在 makefile 里加入下面这行包含上面规则的规则:

.PHONY : veryclean

就可以了。注意,这是一个特殊的 make 规则,make 知道 .PHONY 是一个特殊目的,当然你可以在它的依靠里加入你想用的任何假象 目的,而 make 知道它们都是假象目的。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在makefile,.PHONY是一个特殊的目标,它表示这个目标不是一个真正的文件名,而是一个伪目标。.PHONY通常用于定义一些不需要生成文件的目标,例如clean、all等。当我们执行make命令时,如果目标名与.PHONY定义的目标名相同,make就会执行该目标下的命令,而不会检查是否存在对应的文件。因此,.PHONY可以帮助我们避免一些不必要的文件生成和检查,提高make的执行效率。 ### 回答2: makefile的.phony指示符表示一些目标名称是伪目标(Phony Targets),而不是要被构建的真正目标。伪目标通常用于定义一些常用的指令或操作,例如clean,all,install等。 使用伪目标的好处是让make工具忽略对这些目标关联的文件是否存在的检查,不会在执行时去检查是否生成了对应的文件,而是直接执行对应的指令或操作。这样可以避免因文件名重复等错误导致的构建失败问题。 在makefile文件,使用.phony指示符声明的目标名会被make工具当作伪目标处理。例如: .PHONY: all all: main.o utils.o gcc -o main main.o utils.o .PHONY: clean clean: rm -f main *.o 在上述例子,all和clean被声明为伪目标,make工具在执行构建过程时会直接执行定义好的指令而不会检查文件是否存在。因此,当执行make clean时,会直接删除main和*.o文件,而不会去检查这些文件是否存在。 总之,使用.phony指示符可以方便地定义伪目标,避免因文件不完整或无效导致的构建失败问题。 ### 回答3: Makefile是一种用于自动化构建软件的工具。Makefile的.phony是一个特殊的目标标签,它表示“虚构的”、“假的”或者“伪造的”,其作用是告诉make程序其所依赖的目标并不是实际的文件,而是一个伪目标,该伪目标只是一个标识符,用于执行一些特定的操作,比如清除文件、测试代码等。 Makefile是根据目标及其对应的依赖关系来进行构建的,如果某个目标没有依赖文件或者依赖文件的时间戳比目标文件要新,那么make程序就不需要重新构建这个目标,直接跳过去。然而,有些时候,我们需要执行一些特定的操作,即使目标文件已经存在或者没有对应的依赖文件,这时,就可以使用.phony伪目标来标识这些操作。 .phony目标的用法非常简单,只需要将其作为目标的名称,并不需要指定依赖的文件,而是直接指定要执行的操作。例如,我们可以定义一个伪目标clean,用于清除生成的文件,如下所示: .PHONY: clean clean: rm -rf *.o program 上述代码,我们使用.phony定义了一个伪目标clean,然后指定rm命令清除生成的文件。 总之,.phony伪目标在Makefile非常重要,它能够确保我们执行特定的操作,而不会受到已有文件或者时间戳的影响。因此,在编写Makefile时,一定要充分利用.phony伪目标,以便更加灵活地控制软件的构建过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值