我们来思考一下makefile中的目标究竟是什么?实际上,在默认情况下:

   1、make将makefile的目标认为是一个文件;
   2、make解释器比较目标文件和依赖文件的新旧关系,决定是否执行命令;
   3、make以文件作为第一优先级。
如果不进行特殊的makefile控制,make解释器在解析makefile文件时,在解析到一个规则时,会将这个规则中的目标认为是一个文件,并进一步判断目标文件和依赖文件的新旧关系。
    编写以下的makefile文件,并执行make clean。
    
    正常情况下,当前目录下的*.o hello.out文件全部被删除了,没有任何错误,但那时当我们在当前目录下新建一个名字为clean的文件,然后再执行make clean,此时会提示clean文件是最新的。如下所示:
    这是因为make解释器默认将clean目标当作一个文件处理,而不是一个标签。将clean当成一个文件时,make发现当前目录下有此文件,而且此目标没有依赖,即认为目标四最新的。最终make给出了clean是最新的结论。
 那么怎么解决这个问题呢?幸好,gun make中提供了关键字.PHONY,这个关键字用于定义一个伪目标,此时,伪目标不再对应任何实际的文件,make不再将伪目标当作文件处理,而是当成一个标签。不管伪目标的依赖是否更新,命令总是执行。将程序更改如下所示:
    此时,保持当前目录下存在clean文件,并再次执行make clean,可以成功删除相应的文件。此时,make不再将clean目标当作文件处理,而是始终执行这个目标下的命令。
    伪目标的用法是先声明后使用,伪目标实质:伪目标是make中特殊目标.PHONY的依赖。
 
    伪目标的妙用:规则调用(函数调用),如下所示:
    上图定义了三个伪目标,当执行make rebuild时,clean目标对应的规则会先被执行,然后执行all目标对应的规则。原理为:当一个目标的依赖包含伪目标时,伪目标所定义的命令总是会被执行。这样就完成了规则调用的目的,执行rebuild规则,该规则调用clean和all规则。
 绕开.PHONY关键字定义伪目标,.PHONY是gun make中的关键字,在其他平台中,或许不存在这个关键字,那么怎么办呢?请看如下处理方式。

定义一个目标FORCE,该目标没有依赖,该规则下也没有命令,并让clean依赖这个目标。此时,就算当前路径下存在clean文件,执行make clean时,clean目标对应的命令也始终会被执行。

原理:

如果一个规则没有命令或者依赖,并且它的目标不是一个存在的文件名;在执行此规则时,目标总会被认为是最新的。当前目录下不能有文件名为FORCE的文件存在。FORCR总会被认为是最新的,因此,即使当前目录下有clean文件,那么clean对应的规则也会被执行。

参考如下:

狄泰软件教程与课件

GUN make手册

专业嵌入式软件开发

 
 
 
 
 
 
 
 
 
    

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

 
 
 
 

第三篇 makefile的伪目标的更多相关文章

  1. makefile中伪目标的理解

    1. 我们知道Makefile中的语法是这样: target ... : prerequisites ... command - - 2. 假如编译两个文件可以这么写: a.o:a.c  gcc -c ...

  2. Makefile的伪目标

    1.Makefile伪目标的格式: .PHONY : cleanclean: rm xxxx 2.Makefile伪目标的作用: 第一种情况: 如果我们需要书写这样的一个规则:规则所定义的命令不是去创 ...

  3. makefile之伪目标

    伪目标 1. 伪目标的语法: 在书写伪目标时,首先需要声明伪目标,然后再定义伪目标规则. 1.1 声明伪目标: .PHONY clean (这里声明clean是伪目标) 1.2 定义伪目标规则: cl ...

  4. ARM开发工具软件命令具体解释---嵌入式回归第三篇

    先从bootloader開始,由于临时眼下这些都会是裸机程序相关. 本人这里是VMwarm10.0上安装的红帽linux虚拟机.从以下的截图中能够看出 裸机开发流程: 这里先做第三步(第一步第二步已提 ...

  5. Makefile编写 三 伪目标的作用

    本节我们讨论一个Makefile中的一个重要的特殊目标:伪目标. 伪目标是这样一个目标:它不代表一个真正的文件名,在执行make时可以指定这个目标来执行其所在规则定义的命令,有时我们也可以将一个伪目标 ...

  6. Makefile 文件格式;makefile伪目标

    Makefile包含 目标文件.依赖文件.可运行命令三部分. 每部分的基本格式例如以下: test: prog.o  code.o gcc  -o  test   prog.o   code.o 当中 ...

  7. 第3课 - makefile伪目标的引入

    第3课 - makefile伪目标的引入 1. makefile 中的目标究竟是什么? (1)默认情况下,make 认为目标对应着一个文件  ==>  目标即文件名 (2)make 首先会检测目 ...

  8. Makefile 描述的是文件编译的相关规则,它的规则主要是两个部分组成,分别是依赖的关系和执行的命令 PHONY伪目标实践

    Makefile的工作流程 http://c.biancheng.net/view/7091.html Makefile文件是什么? 我们教程主要是讲的是 Makefile .很多 Linux(Uni ...

  9. Makefile目标,伪目标,头文件自动依赖

    目标 即我们最终要生成的文件,make默认生成第一个目标,注意 makefile中tab和空格不是一回事,规则使用tab缩进,编辑器不要设置诸如"将tab替换为空格之类的选项",目 ...

随机推荐

  1. json字符串在javascript和java代码中的表示方式

    最近在使用js写json形式的字符串的时候,当我把json形式的字符串放到函数JSON.parse()的时候,总是报错Uncaught SyntaxError: Unexpected token ' ...

  2. /etc/fstab 文件解析

    首先介绍一下fstab :这个文件描述系统中各种文件系统的信息.一般而言,应用程序仅读取这个文件,而不对它进行写操作.对它的维护是系统管理员的工作.在这个文件中,每个文件系统用一行来描述,在每一行中, ...

  3. jsp动作之 forward

    forward说明了,就想当于php的include,require函数.(但是它是跳转.forward之前的数据都不会显示) 这么说你明白了吗.就是包含,说的好听点就是跳转,但是url地址栏却是没有 ...

  4. 免费下载知网文献的方法 | sci-hub免费下载SCI论文方法

    部分方法参考自在家里如何免费使用中国知网? - 大学生 - 知乎的回答,已注明出处. 知网文献下载:idata中国知网 idata中国知网网址:idata中国知网 https://www.cn-ki. ...

  5. 【异常】redis.clients.jedis.exceptions.JedisDataException: ERR unknown command 'PSETEX'

    在spring中 针对 RedisTemplate类: private RedisTemplate<String, String> template; 当调用下面方法 template.o ...

  6. hdoj4283 You Are the One

    题意:每个人出场时获得等待时间*值的unhappy值.有个栈换出场顺序.问怎样最小? 一开始的时候觉得在中间取断点,dp[i][j]表示区间全出场后的最小值.那么dp[i][j]=dp[i][k]+d ...

  7. SMTP 发邮件

    public class EmailOrderProcessor :IOrderProcessor { private EmailSettings es; public EmailOrderProce ...

  8. C# 中的时间(DataTime)

    在做报表或查询的时候,常常会预设一些可选的日期范围,如本周.本月.本年等,利用 C# 内置的DateTime基本上都可以实现这些功能. 当前时间: DateTime dt = DateTime.Now ...

  9. 网络编程基础——System.Net.Socket 命名空间及相关类的使用

    System.Net.Socket 命名空间主要提供制作 Socket 网络应用程序的相关类.(Socket 类.TcpClient 类.TcpListener 类 和 UdpClient 类) 1. ...

  10. IntelliJ IDEA 自动导入包 快捷方式 关闭重复代码提示

    idea可以自动优化导入包,但是有多个同名的类调用不同的包,必须自己手动Alt+Enter设置 设置idea导入包 勾选标注 1 选项,IntelliJ IDEA 将在我们书写代码的时候自动帮我们优化 ...