• 第三篇 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;">





  • 相关阅读:
    ASP.NET MVC 动态加载图像
    ASP.NET:以域用户身份访问网络资源
    ASP.NET MVC 动态加载 *.ascx
    4月
    3月
    2月
    每天充点小能量
    每天进步一点点
    FreeMarker标签与使用
    eclipse启动tomcat, http://localhost:8080无法访问
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/8409176.html
Copyright © 2020-2023  润新知