伪目标的引入

思考

makefile 中的目标究竟是什么?

默认情况下

  • make 认为目标对应着一个文件
  • make 比较目标文件和依赖文件的新旧关系,决定是否执行命令
  • make 以文件处理作为第一优先级
  • 默认情况下一个目标对应一个文件

下面代码有什么意义?

clean :
    rm *.o hell.out

make clean

这里代码意思是不希望 clean 是一个目标,而是当作一个标签使用,make clean 希望执行 下面的命令

编程实验1:

hello.out all : func.o main.o
    gcc -o hello.out func.o main.o
    
func.o : func.c
    gcc -o func.o -c func.c
    
main.o : main.c
    gcc -o main.o -c main.c
    
clean :
    rm *.o hello.out

如果此时目录下有一个 clean 文件,此时会提醒 ‘clean’ 是最新的,那么 rm *.o hello.out 就不会执行

原因:
默认情况下,make 认为自己是处理文件的,makefile里面的每一个目标都对应一个具体的文件,这个时候 clean 这个目标确实对应了一个文件,而且发现 clean 文件时最新的,就没必要执行命令;

makefile 中的伪目标

  • 通过 .PHONY 关键字声明一个伪目标
  • 伪目标不对应任何实际文件
  • 不管伪目标的依赖是否更新,命令总是执行

伪目标的语法

先声明,后使用
本质
伪目标是 make 中特殊目标 .PHONY 的依赖

.PHONY : clean
## 注释 ##
clean :
    rm *.o hello.out

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

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

.PHOMY : clean rebuild all

## other rules ##  
rebuild : clean all

clean :
    rm *.o hello.out

技巧:绕开 .PHONY 关键字定义的伪目标

原理:
如果一个规则没有命令或者依赖,并且它的目标不是一个存在的文件名,在执行此规则时,目标总会被认为时最新的

clean : FORCE  
    rm *.o hello.out

FORCE: 

小结

  • 默认情况下,make 认为目标对应着一个文件
  • .PHONY 用于声明一个伪目标,伪目标不对应实际文件
  • 伪目标的本质是 make 中特殊目标 .PHONY 的依赖
  • 使用伪目标可以模拟 '函数调用'

查子木
4 声望1 粉丝

学习 交流 一起进步