伪目标的引入
思考
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 的依赖
- 使用伪目标可以模拟 ‘函数调用’