我们来思考一下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. python 元组列表转为字典

    #create a list l = [(), (), (), (), (), ()] d = {} for a, b in l: d.setdefault(a, []).append(b) prin ...

  2. shell 输出双引号

    #!/bin/sh your_name='runoob' str="Hello, I know you are \"$your_name\"! \n" echo ...

  3. SQLServer中round函数

    ---SQL四舍五入问题1: SELECT CAST('123.456' as decimal) ---123 将会得到 123(小数点后面的将会被省略掉). ---如果希望得到小数点后面的两位.则需 ...

  4. Jsp基础语法(由简入杂)

    JSP基础语法 一,JSP简介 Jsp是一个简化的Servlet设计,是在服务器端执行,他实现了再Java中使用HTML标签. Jsp是一种动态网页技术标准也是JAVAEE的标准 二,常见动态网站开发 ...

  5. Codeforces 855B - Marvolo Gaunt's Ring

    855B - Marvolo Gaunt's Ring 思路:①枚举a[j],a[i]和a[k]分别用前缀最小值最大值和后缀最小值和后缀最大值确定. ②dp,dp[i][j]表示到第j为止,前i+1个 ...

  6. Linux上安装Oracle的教程-centos7

    一.安装Oracle前准备 1.创建运行oracle数据库的系统用户和用户组   [humf@localhost ~]$ su root #切换到root   Password:   [root@lo ...

  7. C#中的?

    1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; 是正确的,int i=null; 编译器就会报错.为了使值类型也 ...

  8. python模块——hashlib模块(简单文件摘要算法实现)

    #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "loki" # Usage: hashlib模块 import ...

  9. 20170727xlVBA根据总名单和模板生成多页名单

    Sub CountingDown() Dim Dic As Object '用于分类统计 Dim i As Long Dim CountDown As Long '每页最多几条信息 Dim x As ...

  10. Rspec: everyday-rspec实操。FactoryBot预构件 (rspec-expectations gem 查看匹配器) 1-4章

    总文档连接: RSpec.info/documentation/ 包括core, expectiation,rails , mock, 点击最新版本,然后右上角搜索class, method. 第3章 ...