首页 > 代码库 > 第3课 - makefile伪目标的引入

第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月提升计划》课程内容

 

第3课 - makefile伪目标的引入