---- 整理自狄泰软件唐佐林老师课程
文章目录
- 1. 思考
- 2. 伪目标的引入
- 2.1 伪目标的语法:先声明,后使用
- 2.2 伪目标的妙用:规则调用(函数调用)
- 2.3 绕开 .PHONY 关键字定义伪目标
1. 思考
-
- Makefile 中的 目标 究竟是什么?
- 默认情况下:
- make 认为 目标 targets 对应着一个文件
- make 以文件处理作为第一优先级
- make 比较目标文件和依赖文件的新旧关系,决定是否执行命令
-
- 下面的代码有什么意义?
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
make clean
- 预期:清理代码
- 如果:此时新建了一个名为 clean 的文件,make 以文件处理作为第一优先级,则会出现如下的现象,和我们预期要清理代码的行为不同
【03 伪目标/00/Makefile】
2. 伪目标的引入
- Makefile 中的伪目标:
- 通过 .PHONY 关键字声明一个伪目标
- 伪目标不对应任何实际的文件(如上述 touch 创建的 clean 文件)
- 不管伪目标的依赖在新旧关系上是否更新,命令总是执行
2.1 伪目标的语法:先声明,后使用
- 本质:伪目标是 make 中特殊目标 .PHONY 的依赖
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
.PHONY: clean # clean被声明为伪目标
clean :
rm *.o hello.out
【03 伪目标/01/Makefile】
2.2 伪目标的妙用:规则调用(函数调用)
hello.out : 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
.PHONY : clean all # 声明伪目标
rebuild : clean all
all : hello.out
clean :
rm *.o hello.out
【03 伪目标/02/Makefile】
- 原理:当一个目标的依赖包含伪目标时,伪目标所定义的命令总是会被执行
2.3 绕开 .PHONY 关键字定义伪目标
- 原理:如果一个规则没有命令或者依赖,并且它的目标不是一个存在的文件名,在执行此规则时,目标总会被认为时最新的。
hello.out : 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
hello.out : 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
hello.out : FORCE
clean : FORCE
rm *.o hello.out
FORCE :
【03 伪目标/03/Makefile】