2019独角兽企业重金招聘Python工程师标准>>>

Phony Targets

.phony是一个特殊工作目标(special target)
它用来指定一个假想的工作目标,也就是说它后面的并不是一个实际文件,而且肯定要视为未更新(也就是说条件总是满足,需要处理)

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://my.oschina.net/dddttttt/blog/77794

makefile phony相关推荐

  1. makefile .phony targets

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

  2. Makefile .PHONY用法

    为什么需要.PHONY? 栗子: 如果make后,如果新建一个:touch clean文件,再执行make clean时,将不会执行rm命令,因为make clean和文件clean重名问题.为了避免 ...

  3. linux Makefile PHONY作用

    PHONY 目标并非实际的文件名:只是在显式请求时执行命令的名字.有两种理由需要使用PHONY 目标:避免和同名文件冲突,改善性能. 如果编写一个规则,并不产生目标文件,则其命令在每次make 该目标 ...

  4. makefile .PHONY

    PHONY .PHONY :clean clean:rm -rf a.out makfile经常会看到.PHONY的命令..PHONY 的作用是什么 1首先要知道makefile中除了一些常量的声明外 ...

  5. makefile PHONY目标

    Phony Targets PHONY 目标并非实际的文件名:只是在显式请求时执行命令的名字.有两种理由需要使用PHONY 目标:避免和同名文件冲突,改善性能. 如果编写一个规则,并不产生目标文件,则 ...

  6. Linux Kernel Makefile Test

    一.本文说明 本文为linux内核Makefile整体分析的续篇,是依据Linux内核Makefile体系的主要内容编写一个简要的测试工程.Linux内核Makefile体系就好像一只"大鸟 ...

  7. Makefile学习(三)[第二版]

    make常用内嵌函数 1.函数调用 $(function arguments) #$引用的结果就是函数生成的结果 2.Makefile下常用的函数 1)$(wildcard PATTERN) #匹配当 ...

  8. Makefile 指南

    Makefile 指南 文章目录 Makefile 指南 前言 Makefile 介绍 编写原则 Makefile 规则 Makefile 示例 Make 工作方式 Makefile 中的变量 Mak ...

  9. 简单Makefile编写教程

    Makefile编写 1. make和Makefile的介绍 1.1 make工具 利用make工具可以自动完成编译工作.这些工作包括: 如果仅仅修改了某几个源文件,则只重新编译这几个源文件: 如果某 ...

最新文章

  1. 全国首个人工智能专业,怎么学?
  2. 康奈尔机器人的肌肉是爆米花做的,果然很有爆发力 | ICRA 2018
  3. 设计模式学习笔记------简单工厂
  4. 各大软件的 java版本_Java 各个版本的软件 1.4 1.5 5.0 6.0
  5. Linux学习笔记——网络组成
  6. 常见的集合的面试题总结
  7. 收货地址表结构 以及创建修改流程
  8. 三、动态构建GStreamer管道
  9. oracle remote diagnostic agent,Oracle数据库收集、分析工具RDA(RemoteDiagnostic Agent)下载
  10. TVB西游记2观音的眼泪化作金河送唐僧回长安
  11. 作为APIcaller识别发票信息
  12. oracle stdevp函数,ORACLE和SQL语法区别归纳整理.doc
  13. 贪心算法实现最大收益
  14. 什么是安全测试?一文教会你如何开展系统安全测试…
  15. 计算机网络——第二章(应用层)
  16. 简单20行代码爬取王者荣耀官网1080p壁纸
  17. 服务器显卡驱动安装NVIDIA-1080Ti
  18. 昆仑通泰mcgs触摸屏和台达VFD-M变频器的rtu通讯示例硬件:mcgs触摸屏(没屏电脑也可实现),台达vfd-m变频器
  19. 【实战项目i护理上篇】vue-cli3+vue-admin+egg
  20. 目标检测数据集:潜艇(1)

热门文章

  1. [Ext JS 4] MVC 应用程序框架
  2. php连贯操作,Thinkphp 3.2.3 sql的一些连贯操作方法
  3. linux运行库,Linux C 静态库 共享库 运行库
  4. linux 查看内存消耗情况,Linux终端:用smem查看内存占用情况
  5. java正则表达式 后顾,正则表达式:从Copy到手写
  6. python3.7适用的opencv_通过python3.7.3使用openCV截图一个区域
  7. Layui--颜色选择器layui.colorpicker
  8. 32树莓派_树莓派推出8GB内存版本
  9. php web服务器部署,php – 如何配置apache web服务器以部署laravel 5
  10. 感觉自己不适合编程 确学了计算机专业,高薪程序员:“我劝他学医,别学计算机,却被冤枉在害人”...