第3课 - makefile伪目标的引入

第3课 - makefile伪目标的引入

1. makefile中的目标究竟是什么?

  (1)默认情况下,make认为目标对应着一个文件 →  目标即文件名

  (2)make首先会检测目标对应的文件是否存在,若不存在则执行依赖和命令。若存在则会比较目标文件和依赖文件的新旧关系,决定是否执行命令。

  (3)make以文件处理作为第一优先级

2. 伪目标的引入

  下面的代码有什么意义?

            clean :

              rm *.o hello.out

              

            make clean

  执行make clean会将第2课中编译生成的中间.o文件和hello.out目标文件删除。但如果该目录下存在名为clean的文件就会导致删除命令执行失败。

  有时我们并不希望目标对应的都是文件,而只是把目标当作一个标签来使用,这就引入了makefile中的伪目标。

  (1)makefile中的伪目标

    — 通过 .PHONY 关键字声明一个伪目标

    — 伪目标不对应任何实际的文件(目录下有同名的文件也不会影响执行)

    — 不管伪目标的依赖是否更新,命令总是执行

  (2)makefile伪目标的语法:先声明,后使用

    本质:伪目标是make中特殊目标 .PHONY 的依赖。

            .PHONY : clean

            clean :

              rm *.o hello.out

 1 # makefile伪目标的引入
 2
 3 hello.out all : func.o main.o
 4     gcc -o hello.out func.o main.o
 5
 6 func.o : func.c
 7     gcc -o func.o -c func.c
 8
 9 main.o : main.c
10     gcc -o main.o -c main.c
11
12 .PHONY : clean
13 clean :
14     rm *.o hello.out

  (3)makefile伪目标的妙用:规则调用(函数调用)

            .PHONY : clean rebuild all

            ## other rules ##

            rebuild : clean all

            clean :

              rm *.o hello.out

    原理:当一个目标的依赖包含伪目标时,伪目标所定义的命令总是会被执行。

    当执行 make rebuild 时首先会删除之前编译生成的垃圾文件,然后重新编译整个工程。

 1 # makefile中利用伪目标实现规则调用
 2
 3 hello.out : func.o main.o
 4     gcc -o hello.out func.o main.o
 5
 6 func.o : func.c
 7     gcc -o func.o -c func.c
 8
 9 main.o : main.c
10     gcc -o main.o -c main.c
11
12 .PHONY : rebuild clean all
13
14 rebuild : clean all
15
16 all : hello.out
17
18 clean :
19     rm *.o hello.out

  (4)技巧:绕开 .PHONY 关键字定义伪目标

    .PHONY 关键字只有标准的make(GNU make)才拥有,在使用非标准的make时可以使用如下技巧定义伪目标。

            clean : FORCE

              rm *.o hello.out

            FORCE :

    原理:如果一个规则只有一个目标,并且该目标不是一个存在的文件名,则在执行此规则时,目标总会被认为是最新的。

    当执行 make clean 时,由于FORCE会被认为是最新的(FORCE比clean要新),clean下的命令必然被执行。

 1 #非GNU make下伪目标的实现方法
 2
 3 hello.out : func.o main.o
 4     gcc -o hello.out func.o main.o
 5
 6 func.o : func.c
 7     gcc -o func.o -c func.c
 8
 9 main.o : main.c
10     gcc -o main.o -c main.c
11
12 clean : FORCE
13     rm *.o hello.out
14 FORCE :    

注:本文整理于《狄泰12月提升计划》课程内容

时间: 2024-10-03 10:09:14

第3课 - makefile伪目标的引入的相关文章

Makefile 文件格式;makefile伪目标

Makefile包含 目标文件.依赖文件.可运行命令三部分. 每部分的基本格式例如以下: test: prog.o  code.o gcc  -o  test   prog.o   code.o 当中,第一行的test是目标文件. prog.o.code.o是依赖文件: 第二行的gcc -o test prog.o code.o是可运行命令. 整个Makefile文件都是这样的格式. 参考链接: https://blog.csdn.net/haoel/article/details/2886 M

Makefile伪目标

本节我们讨论一个Makefile中的一个重要的特殊目标:伪目标. 伪目标是这样一个目标:它不代表一个真正的文件名,在执行make时可以指定这个目标来执行其所在规则定义的命令,有时我们也可以将一个伪目标称为标签.使用伪目标有两点原因: 1. 避免在我们的Makefile中定义的只执行命令的的目标(此目标的目的为了执行执行一系列命令,而不需要创建这个目标)和工作目录下的实际文件出现名字冲突. 2. 提高执行make时的效率,特别是对于一个大型的工程来说,编译的效率也许你同样关心. 以下就这两个问题我

第0课 - Makefile引言

Makefile引言 第1课 - make 和 makefile 第2课 - 初识makefile的结构 第3课 - makefile伪目标的引入 第4课 - 变量和不同的赋值方式 第5课 - 预定义变量的使用 第6课 - 变量的高级主题(上) 第7课 - 变量的高级主题(下) 第8课 - 条件判断语句 第9课 - 函数定义及调用 第10课 - 变量与函数的综合示例 第11课 - 自动生成依赖关系(上) 第12课 - 自动生成依赖关系(中) 第13课 - 自动生成依赖关系(下) 第14课 - 自

从头开始写项目Makefile(四):伪目标

[版权声明:转载请保留出处:blog.csdn.net/gentleliu.Mail:shallnew at 163 dot com] 一般情况下,Makefile都会有一个clean目标,用于清除编译过程中产生的二进制文件.我们在第一节的Makefile就用到了这个 clean目标,该目标没有任何依赖文件,并且该目标对应的命令执行后不会生产clean文件. 像这种特点目标,它的规则所定义的命令不是去创建文件,而仅仅通过make指定目标来执行一些特定系统命令或其依赖为目标的规则(如all),称为

makefile中的伪目标

伪目标就是总是被执行的目标,相对于目标来说,伪目标不会去考虑它的依赖的时间戳与自己时间戳的新旧关系,从而决定是否执行规则.伪目标格式: .PHONY:clean clean: -rm *.o 在makefile里面通常会将clean这个目标指定为伪目标,这个目标有个特性就是无依赖,那么每次make clean的时候都会执行它的规则:-rm *.o,那么为什么要指定为伪目标,平时看到的makefile都是把它当中一般目标.假设不指定clean为伪目标,我当前文件夹下有1个文件: a.c.我的mak

.PHONY makefile中的伪目标

我的理解: 拿clean举例,如果make完成后,自己另外定义一个名叫clean的文件,再执行make clean时,将不会执行rm命令. 为了避免出现这个问题,需要.PHONY: clean ======================================================================================= 所谓伪目标就是这样一个目标,它不代表一个真正的文件名,在执行make时可以指定这个目标来执行其所在规则定义的命令,有时我们将一个伪

linux之Makefile 编写、规则、伪目标

什么是Makefile?首先,make是一个工具程序(Utility software),是一种控制编译或者重复编译软件的工具:make可以自动管理软件编译的内容.方式和时机从而使程序员能够把精力集中在编写代码上.那make怎样工作呢?其实make是通过makefile文件实现的.makefile是一个文本形式的数据库文件.其中包含一些规则,这些规则告诉make需要编译哪些文件.怎样编译这些文件以及在什么样的条件下去编译. 关于Makefile的基本规则: target: dependency

第五课 Makefile文件的制作(补充)

序言: 前面的几节课讲解Makefile的一些基本知识也做了一些小例子实践了几下,那么到现在普通的练习则是没有问题.但是如果做项目文件较多又分层次等等还是会碰上好多问题的,这节课补充一些知识. 知识点: 1.makefile的内嵌函数: 2.二级目录的编写: 3.多级目录的编写: 原理: GNU make还提供了相关的函数来帮助我们编写此文件,使得我们在编写makefile文件时更加灵活健壮.提供的函数大致分为有:处理文件名.文本内容.变量.命令四种:在这节中不会讲太多的函数甚至连最基本的去空格

GNU-makefle (三) 规则语法、文件查找、伪目标

参考链接:http://blog.csdn.net/haoel/article/details/2889 当命令和依赖关系描述在同一行时,可以使用分号 分隔. 当命令太长时,也可以用反斜杠 \ 来分隔成多行,分隔出的行首有没有tab都可以(空格更无所谓了). 在指定文件目录时,可以用~来表示系统home目录,因为make会以shell来执行. VPATH Makefile文件中的特殊变量.它指定make可以去哪些目录找寻依赖文件和目标文件. 默认不定义它,则在当前目录找,多目录用冒号(:)分隔