第12课 - 自动生成依赖关系(中)
1. makefile中的include
关键字
-
类似C语言中的
include
-
将其他文件的内容原封不动地搬入当前文件
-
make对
include
关键字的处理方式:在当前目录搜索或指定目录搜索目标文件:1)搜索成功:将文件内容搬入当前makefile中
2)搜索失败:产生警告
-
以文件名作为目标查找并执行对应规则;
-
当文件名对应的规则不存在时,最终产生错误
编程实验:makefile.1
.PHONY : all include test.txt all : @echo "this is all" test.txt : @echo "test.txt" @touch test.txt
运行结果:
2. makefile中命令的执行机制
-
规则中的每个命令默认是在一个新的进程中执行(Shell)
-
可以通过接续符(
\
)将多个命令组合成一个命令 -
组合的命令依次在同一个进程中被执行
-
set -e
指定发生错误后立即退出执行
编程实验:makefile.2
.PHONY : all all : set -e; \ mkdir test; \ cd test; \ mkdir subtest
运行结果:
3. 解决方案得初步思路
1)通过gcc -MM
和sed
得到.dep
依赖文件(目标的部分依赖)
技术点:规则中命令的连续执行
2)通过include
指令包含所有的.dep
依赖文件
技术点:当.dep
依赖文件不存在时,使用规则自动生成
编程实验:
.PHONY : all clean MKDIR := mkdir RM := rm -fr CC := gcc SRCS := $(wildcard *.c) DEPS := $(SRCS:.c=.dep) -include $(DEPS) all : @echo "all" %.dep : %.c @echo "Creating $@ ..." @set -e; \ $(CC) -MM -E $^ | sed 's,\(.*\)\.o[ :]*,objs/\1.o : ,g' > $@ clean : $(RM) $(DEPS)
运行结果:
func.dep
objs/func.o : func.c func.h
main.dep
objs/main.o : main.c func.h