我们来思考一下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;">

 
 
 
 

最新文章

  1. MVC中你必须知道的13个扩展点
  2. Linq之select子句
  3. 数据挖掘系列(4)使用weka做关联规则挖掘
  4. 加速Eclipse使其成为超快的IDE
  5. CentOS hadoop配置错误Incorrect configuration: namenode address dfs.namenode.servicerpc-address ...
  6. grunt自动化工具
  7. SQL Server XML Path[转]
  8. zookeeper环境的搭建
  9. iOS中默认样式修改-b
  10. Windows Phone 8.1 新功能 - 应用栏控件
  11. Angular中使用$watch监听
  12. poj 3620
  13. lock了mutex的线程退出了却没有unlock时会怎么样?
  14. 为什么ArrayList、LinkedList线程不安全,Vector线程安全
  15. 带你开发一款给Apk中自动注入代码工具icodetools(完善篇)【申明:来源于网络】
  16. Spring Boot中JSON参数传递,后台实体接受问题
  17. Flutter采坑之路 Run Configuration error:broken configuration due to unavailable
  18. IMU 预积分推导
  19. 009 搭建Spark的maven本地windows开发环境以及测试
  20. Jmeter之目录结构

热门文章

  1. pandas demo 示例
  2. pandas 设置单元格的值
  3. shell 杀掉指定进程的服务
  4. Enumerable扩展方法
  5. python2 安装scrapy出现错误提示解决办法~
  6. visudo使用笔记
  7. 我为什么放弃使用mybatis3的mapper注解了
  8. ArcGIS 要素闪烁
  9. LICEcap 和 FS Capture入门教程
  10. 从0开始接触html--第一天学习内容总结