1 makefile中目标的本质
思考:makefile中的目标究竟是什么?
- 默认情况下:
- make认为目标对应这一个文件
- 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
2 伪目标的引入
makefile中的伪目标
- 通过.PHONY关键字声明一个伪目标
- 伪目标不对应任何实际的文件
- 不管伪目标的依赖是否更新,命令总是执行
伪目标的语法:先声明,后使用
- 本质:伪目标是make中特殊目标.PHONY的依赖
.PHONY : clean
## 注释 ##
clean :
rm -rf *.o hello.out
编程实验:使用伪目标
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 :
rm -rf *.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
.PHONY : rebuild clean all
rebuild : clean all
all : hello.out
clean :
rm *.o hello.out
技巧:绕开.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 : FORCE
rm *.o hello.out
FORCE :
3 小结
- 默认情况下,make认为目标对应着一个文件
- .PHONY用于声明一个伪目标,伪目标不对应着实际的文件
- 伪目标的本质是make中特殊目标.PHONY的依赖
- 使用伪目标可以模拟“函数调用”
修改记录
时间 | 动作 |
---|---|
2017.7.4 | 首次上传 |
参考资料
唐老师 — 狄泰软件学院 — 十二月提升计划