自动生成依赖关系(中)
makefile中的include关键字
- 类似C语言中的include
- 将其它文件的内容原封不动的搬入到当前文件
make对include关键字的处理方式
- 在当前目录搜索或指定目录搜索目标文件
- 搜索成功:将文件内容搬入当前makefile中
- 搜索失败:产生警告
- 以文件名作为目标查找并执行对应规则
- 当文件名对应的规则不存在时,最终产生错误
下面代码怎么执行?为什么?
.PHONY : all
include test.txt
all :
@echo "this is $@"
test.text :
@echo "test.txt"
@echo "test.txt"
在当前目录搜索test.txt文件,文件不存在发出警告,并以文件名为目标查找并执行规则;
编程实验
初探include关键字
.PHONY : all
include test.txt
all :
@echo "this is all"
test.txt :
@echo "test.txt"
@touch test.txt
实验截图
makefile中命令的执行机制
- 规则中的每个命令默认实在一个新的进程中执行(Shell)
- 可以通过接续符(;)将多个命令组合成一个命令
- 组合的命令一次在同一个进程中执行
- set-e指定发送错误后立即退出执行
下面的代码想要实现的功能?有没有问题?
.PHONY : all
all :
mkdir test
cd test
mkdir subtest
想要实现在test文件夹下建立子文件夹,代码并不能实现该功能。从上述的makefile中命令的执行机制就可以值得是什么原因。
编程实验
makefile的命令执行
.PHONY : all
all :
set -e; \
mkdir test; \
cd test; \
mkdir subtest
实验截图
生成自动依赖关系的解决方案的初步思路
-
通过gcc -MM和sed得到.dep依赖文件(目标的部分依赖)
- 技术点:规则中命令的连续执行
-
通过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)
实验截图
参考资料:
狄泰软件教学课件