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