Phony Targets

上一篇提到了makefile基本的rule如下:

Here is what a simple rule looks like:target:   dependencies ...commands...

A phony target is one that is not really the name of a file; rather it is just a name for a recipe to be executed when you make an explicit request. There are two reasons to use a phony target: to avoid a conflict with a file of the same name, and to improve performance.

Phony Target的引入是为了解决某些特定问题的。Phony Target是一系列命令的标识,可以想成是函数名,标号之类。

  • 避免同名文件的冲突
  • 提升性能

The implicit rule search is skipped for .PHONY targets. This is why declaring a target as .PHONY is good for performance, even if you are not worried about the actual file existing.

例如很常见的make clean命令

clean:rm *.o temp...

使用上面的写法,假如目录下没有叫clean的文件并且command中也没有生成叫clean的target的命令,那么每次执行make clean命令,clean都会被执行,符合我们的预期。但是如果目录下有一个叫clean的文件存在或者被生成,那么clean之后的指令将得不到执行。因为clean是一个target却没有依赖,所以它始终被make工具认为是最新的,所以不会被更新,其定义的command也就不会被执行。

为了解决上述问题,我们可以通过把target clean作为.PHONY的依赖条件,显式地声明target为phony类型,.PHONY是make内建的特殊target 名。

.PHONY: clean
clean:rm *.o temp

make 面对phony对象时会无条件地运行该对象的command(recipe)。 如此一来,make clean定义的命令无论目录下是否存在名叫clean的文件都会被执行。

Phony 和 FORCE

对于没有依赖或者命令菜单的规则,并且该规则的target没有同名文件存在,那么这条规则被执行时,这个target会被make假象成被更新过的,也就是最新的。因此我们可以利用这个使得所有依赖这个target的target都将被更新。

clean: FORCErm $(objects)
FORCE:

在这个例子中,FORCE符合最新的条件,所以make clean命令会被强制执行,无论是不是有同名的clean文件存在。

There is nothing special about the name ‘FORCE’, but that is one name commonly used this way.As you can see, using ‘FORCE’ this way has the same results as using ‘.PHONY: clean’.Using ‘.PHONY’ is more explicit and more efficient. However, other versions of make do not support ‘.PHONY’; thus ‘FORCE’ appears in many makefiles.

Phony的其他用法

make的递归使用

大型系统构建时通常会包含很多子目录,我们可以在主目录的makefile中执行命令切换到子目录然后调用make命令来完成子目录的构建。

subsystem:cd subdir && $(MAKE)#上述命令等价于
subsystem:$(MAKE) -C subdir#同样可以声明为phony对象
.PHONY: subsystem subdir
subsystem: subdir
subdir:$(MAKE) -C $@

Phony使用规则

phony target通常不作为其他real target的依赖,否则当real target被更新时phony target对应的命令每次都会被执行;
对于make clean而言,我们是保证clean对象不会作为real target的依赖,所以只有显式调用的时候才会执行;
phony target可以有相应的依赖,这个依赖可以是 phony target,也可以是real target;

.PHONY : all
all : prog1 prog2 prog3prog1 : prog1.o utils.occ -o prog1 prog1.o utils.oprog2 : prog2.occ -o prog2 prog2.oprog3 : prog3.o sort.o utils.occ -o prog3 prog3.o sort.o utils.o

如果phony target的依赖也是phony target,那么被依赖的phony target会作为一个subroutine被执行。

.PHONY: cleanall cleanobj cleandiffcleanall : cleanobj cleandiffrm programcleanobj :rm *.ocleandiff :rm *.diff

GNU Make工具(二)Phony Targets 和 FORCE相关推荐

  1. GNU开发工具的使用方法

    GNU开发工具的使用方法 一.vi编辑器使用方法 1.1 vi编辑器 1.2 vi的基本命令 二.makefile的编写 2.1 makefile简介 2.2 make命令 2.3 隐含规则 三.gc ...

  2. makefile .phony targets

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

  3. GNU make 工具

    默认情况下,GNU make 工具在当前工作目录中按如下顺序搜索 makefile: GNUmakefile makefile Makefile 或者使用:make -f filename 转载于:h ...

  4. 转:TestLink1.9.3测试用例:Excel转换XML工具二实现代码

    TestLink1.9.3测试用例:Excel转换XML工具<二>实现代码 http://blog.csdn.net/candle806/article/details/7490599 以 ...

  5. 爬虫的一些工具(二)

    爬虫的一些工具(二) 1. 常有的工具 (1). python (2). pycharm (3).浏览器 i.chrome ii.火狐 (4).fiddler的使用 2 fiddler的使用  (1) ...

  6. 在 Linux 下安装 GNU ARM 工具链

    可以使用多种工具编写不同版本的 ARM 内核,但最流行的一组工具是 GNU ARM 工具链.更多地了解如何使用 ARM 内核进行嵌入式开发,以及如何安装并使用 GNU 工具. 如果您对在最普遍的微处理 ...

  7. GNU binutils工具集

    前言 GNU binutils工具提供了一系列二进制工具,用于日常开发过程中对程序调试和维护,经常会用到的工具如下: as:汇编编译器,用于将汇编代码编译成目标文件; addr2line:用于得到程序 ...

  8. gnu binutils_9个基本的GNU binutils工具

    gnu binutils 想象一下,虽然无法访问软件的源代码,但仍然能够理解软件的实现方式,在其中找到漏洞,并且可以更好地修复错误. 所有这些都是二进制形式. 听起来像是拥有超级大国,不是吗? 您也可 ...

  9. Linux 环境编程 day01 Linux系统介绍、GNU编译工具、静态/共享库、环境变量表

    Linux 环境编程 day01 Linux系统介绍.GNU编译工具.静态/动态库.环境变量表 学习Linux环境编程的原因 UNIX系统介绍 Linux系统介绍 GNU工程 POSIX标准 GNU通 ...

最新文章

  1. 2018-4-8使用兔子的例子对比说明遗传算法,局部搜索,禁忌搜索,模拟退火方法
  2. Codeforces数学1600day3[数学CodeForces - 1213D2, CodeForces - 1165E 数论,CodeForces - 1165D 因子分解]
  3. 收汇核销系统无法与服务器连接,出口收汇核销网上报系统一直都无法与服务器建立连接.doc...
  4. 如何用js获取外联css,内联外联CSS和JS
  5. LUT Utility for FCPX(Luts调色文件加载工具)支持M1
  6. Android开发之Git提交Template模板配置
  7. 关于毫米波技术的描述
  8. Inversion of Control(控制反转)之 Dependency Injection(依赖注入)
  9. java web相关试卷_JavaWeb试卷四
  10. flink 入门及安装
  11. objdump和 readelf 的区别
  12. python操作微信电脑版_Python通过微信控制电脑
  13. 拿R来画画(八):面积图与堆积图
  14. 是否还为制作PPT而烦恼?珍藏的PPT实用网站打包送给你!
  15. supervisor备忘
  16. python 实现批量抠图
  17. aven 项目 pom.xml 第一行报错 Unknow。。。。。。。解决办法
  18. 005:魔兽世界之一:备战
  19. Mysql数据恢复---闪回恢复
  20. 论一次feign微服务直接多文件上传由版本引发的血案

热门文章

  1. MATLAB与高等数学--获得渐进线
  2. 前端人的前端CI/CD
  3. 杂谈BOSS系统与广电运营
  4. 【龙芯1B】:DS18B20测温例程
  5. chosen.jquery.js 、chosen-select 源码修改控制 chosen:updated 方法动态更新下拉框选项不更新搜索框值 ,chosen 实现远程搜索加载下拉选项
  6. yii的comand模式使用composer的问题
  7. MacOS 升级到 MacOS Catalina 后无法使用PPTP协议问题
  8. Jose Mourinho: 任何成功都来自处心积虑
  9. 电子发热手套方案开发控制板线路板方案设计pcba
  10. 基于JAVA车辆大全和车牌识别系统(Springboot框架+AI人工智能) 开题报告