makefile里的Phony

引用:https://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 知道它们都是假象目的。

原文地址:https://www.cnblogs.com/renzmin/p/12094196.html

时间: 2024-08-30 08:24:46

makefile里的Phony的相关文章

makefile里PHONY的相关介绍

Phony Targets PHONY 目标并非实际的文件名:只是在显式请求时执行命令的名字.有两种理由需要使用PHONY 目标:避免和同名文件冲突,改善性能. 如果编写一个规则,并不产生目标文件,则其命令在每次make 该目标时都执行.例如: clean: rm *.o temp因为"rm"命令并不产生"clean"文件,则每次执行"make clean"的时候,该命令都会执行.如果目录中出现了"clean"文件,则规则失效

Makefile 第十二章 Makefile里有什么?

Makefile里主要包含了五个东西:显式规则.隐晦规则.变量定义.文件指示和注释. 显式规则.显式规则说明了,如何生成一个或多的的目标文件.这是由Makefile的书写者明显指出,要生成的文件,文件的依赖文件,生成的命令. 隐晦规则.由于我们的make有自动推导的功能,所以隐晦的规则可以让我们比较简略地书写Makefile,这是由make所支持的. 变量的定义.在Makefile中我们要定义一系列的变量,变量一般都是字符串,这个有点像你C语言中的宏,当Makefile被执行时,其中的变量都会被

Makefile里调用Shell注意点

http://www.linuxidc.com/Linux/2012-04/59093.htm 大家经常编写和使用Makefile, Makefile里面也经常用到shell, 但对其中一些需要注意的地方未必会去留意, 这里列出几个来, 不知是否对大家有用.1. 注意Makefile的变量和shell变量, 看如下示例:    DIRS = src bin lib   all:    @for i in $(DIRS); /     do /         echo " " $$i;

makefile里的一些常用函数

ROOT = $(shell pwd) 获得Makefile的当前路径 $(shell find $(SRC_DIR) -name '*.h')  #寻找SRC_DIR所代表目录下的所有名字后缀为.h的头文件 $(sort $(foreach i, $(INC_DIR), -I$(i)))   #对INC_DIR所代表的头文件进行排序 $(shell find $(SRC_DIR) -name '*.cpp')  #寻找SRC_DIR所代表目录下的所有名字后缀为.cpp的头文件 $(patsub

makefile 里的vpath

https://www.cmcrossroads.com/article/basics-vpath-and-vpath Only missing prerequisites matching the pattern are searched using the associated path. So vpath makes it possible, for example, to specify just a path to search for header (.h) files: vpath

Makefile中.PHONY的作用

单词phony (即phoney)的意思是:伪造的,假的.来自collins的解释是: If you describe something as phoney, you disapprove of it because it is false rather than genuine. 那么,在Makefile中,.PHONY后面的target表示的也是一个伪造的target, 而不是真实存在的文件target,注意Makefile的target默认是文件. 举个例子: $ cat -n Make

vim、g++、gdb及makefile的学习

<一>.vim 一.vim有主要有三种模式:命令模式.插入模式.底行模式 1.命令模式(command mode) 控制光标的移动.字符.字或行的删除,移动复制某段进入Insert mode下,或者lastline         mode. 2.插入模式(Insert mode) 只有在Insert mode下,才可以做文字输入,按[Esc]键可回到命令行模式 3.底行模式(lastline mode) 将文件保存(:w)或者退出(:q),也可以设计编辑环境,如寻找字符串,列出行号等等 二.

转:跟我一起写Makefile (PDF重制版)

原文地址:http://seisman.info/how-to-write-makefile.html 其它一些问题  不妨看一下:http://blog.csdn.net/huyansoft/article/details/8924624 简化版  不妨看一下:http://blog.chinaunix.net/uid-26980210-id-3244651.html 跟我一起写 Makefile (PDF 重制版)By [email protected]作者: 陈皓2014 年 03 月 0

一篇文章教你读懂Makefile

makefile很重要      什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂.这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义.特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力.因为,makefil