第三篇 makefile的伪目标

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

 
 
 
 





转载于:https://www.cnblogs.com/wanmeishenghuo/p/8409176.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值