Makefile中 的 phony target,empty target
phony target
Makefile的语法很简单
<target> : <prerequisites>
[tab] <commands>
目标、先决条件、命令 构成了Makefile的全部规则
一般而言,说到目标总给人一种非要产生么东西出来的感觉,如果带着这种感觉理解phony target(伪目标)可能有些吃力。更好的一种理解是将phony target理解成一个动作,动作的特点是不一定非得产生么东西出来,但是会执行一些操作。Makefile中的phony target就是这样一个特殊target ,使用.PHONY将一个(或一些)target指定为phony target,这样可以确保phony target对应的commands无论如何都会被执行。phony target参考这个
empty target
empty target在行为上很像 phony target,可以视为phony target的一种变体。empty target通常用于保存某个动作的一组方法,你可以在任何地方任何时候显式执行这个动作。不像phony target,empty target对应的文件可以实际存在,文件的内容是啥没关系,通常是空的。empty target的目的是当commands的最后一条命令执行完后更新empty target的最后修改时间(last-modification time)。这通常是靠touch来实现的,代码如下
print: foo.c bar.c
lpr -p $?
touch print
empty target应该有prerequisites ,否则的话emoty target存在也没啥意义。当你执行make XXX的时候,XXX是empty target,如果prerequisites 任何文件新于empty target,则empty target对应的commands就会执行,并在最后更新empty target时间。按照上面代码来讲,也就是说自你上次make empty_target后,prerequisites 中任何文件有变化,再次make empty_target就会把哪些变化的文件打印出来,$?用于表示哪些变化的文件。更多参考Automatic-Variables
phony target的替代方案
参考:Rules without Recipes or Prerequisites
某些版本或者某些平台的make可能不支持.PHONY,这时候可以采取如下替代方案
clean: FORCE
rm $(objects)
FORCE:
Makefile中 的 phony target,empty target的更多相关文章
- Makefile 中的.PHONY
PHONY 目标并非实际的文件名:只是在显式请求时执行命令的名字.有两种理由需要使用PHONY 目标:避免和同名文件冲突,改善性能. 所谓的PHONY这个单词就是伪造的意思,makefile中将.PH ...
- Makefile中.PHONY的作用
单词phony (即phoney)的意思是:伪造的,假的.来自collins的解释是: If you describe something as phoney, you disapprove of i ...
- makefile中的target到底代表什么?
刚开始用make的时候,以为makefile中名字叫做main的target就是make默认执行的target(中文翻译叫做标的(di,四声),下面统一称呼为标的),然后曾经很天真地犯过这样的错误,就 ...
- MySQL中You can't specify target table for update in FROM clause一场
mysql中You can't specify target table <tbl> for update in FROM clause错误的意思是说,不能先select出同一表中的某些值 ...
- mysql中You can’t specify target table for update in FROM clause错误解决方法
mysql中You can't specify target table for update in FROM clause错误的意思是说,不能先select出同一表中的某些值,再update这个表( ...
- makefile中PHONY的重要性
伪目标是这样一个目标:它不代表一个真正的文件名,在执行make时可以指定这个目标来执行所在规则定义的命令,有时也可以将一个伪目标称为标签.伪目标通过 PHONY来指明. PHONY定义伪目标的命令 ...
- MySQL中You can't specify target table for update in FROM clause异常
mysql中You can't specify target table <tbl> for update in FROM clause错误的意思是说,不能先select出同一表中的某些值 ...
- .PHONY makefile中的伪目标
我的理解: 拿clean举例,如果make完成后,自己另外定义一个名叫clean的文件,再执行make clean时,将不会执行rm命令. 为了避免出现这个问题,需要.PHONY: clean === ...
- Mysql中You can't specify target table for update in FROM clause错误的意思是说,不能先select出同一表中的某些值,再update这个表(在同一语句中)。
将select出的结果再通过中间表select一遍,这样就规避了错误.注意,这个问题只出现于mysql,mssql和oracle不会出现此问题. mysql中You can't specify tar ...
随机推荐
- 【JS新手教程】JS修改css样式的几种方法
本文试验了几种JS修改css样式的方法,方法1:元素.style.样式=样式值.方法2:元素.style.cssText=样式:样式值方法3:元素.style[样式]=样式值 .cssText这种,可 ...
- WEUI switch 如何取值?
let id = $(this).attr("id"); let name = $(this).attr("data-name"); HTML: <div ...
- Java进阶教程:使用Lombok提升开发效率
Java进阶教程:使用Lombok提升开发效率 Lombok Lombok是一种Java™实用工具,可用来帮助开发人员消除Java的冗长代码,尤其是对于简单的Java对象(POJO).它通过注释实现这 ...
- 【GStreamer开发】GStreamer基础教程07——多线程和Pad的有效性
目标 GStreamer会自动处理多线程这部分,但在有些情况下,你需要手动对线程做解耦.本教程会教你怎样才能做到这一点,另外也展示了Pad的有效性.主要内容包括: 如何针对部分的pipeline建立一 ...
- sql 表的连接与查找
A.left outer join: 左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行. SQL: select a.a, a.b, a.c, b.c, b.d, b.f fro ...
- go零碎总结
1.go里通过首字母大小写来区分它是私有的还是公有的,比如对于一个结构体属性一般就以大写开头(和Java不一样,不需要什么getter,setter方法):而对于方法而言,它是隶属于包(包名一定是小写 ...
- LeetCode 674. 最长连续递增序列(Longest Continuous Increasing Subsequence) 18
674. 最长连续递增序列 674. Longest Continuous Increasing Subsequence 题目描述 给定一个未经排序的整型数组,找到最长且连续的递增序列. Given ...
- python openpyxl模块实现excel的读取,新表创建及原数据表追加新数据
当实际工作需要把excel表的数据读取出来,或者把一些统计数据写入excel表中时,一个设计丰富,文档便于寻找的模块就会显得特别的有吸引力,本文对openpyxl模块的一些常见用法做一些记录,方便工作 ...
- lnmp 是不是该吐吐槽
lnmp 提供提供了便捷 , 并且手也伸的挺长的,它已不仅仅是个服务器环境那么简单 作为服务器继承环境来讲,可能每个人的认知程度不一,总之用了它需要服从它的规则 但从个人感觉上,其埋的坑还是让人不适, ...
- linux服务器安装svn并上传项目
一.安装svn (1)安装svn服务器: yum install subversion (2)查看版本(随自己意愿): svnserve --version 二.创建svn仓库并配置 (1)创建svn ...