1. include关键字
makefile 中的 include 关键字:
- 类似 C 语言中的 include
- 将其它文件的内容原封不动的搬入当前文件
make 对 include 关键字的处理方式:
- 在当前目录搜索或指定目录搜索目标文件
- 搜索成功,将文件内容搬入当前文件中
- 搜索失败,产生警告,以文件名作为目标查找并执行对应规则,当文件名对应的规则不存在时,最终产生错误
小贴士:使用 -include
可以消除文件不存在时的警告以及没有对应规则产生的错误
2. makefile 中命令的执行机制
- 规则中的每个命令默认是在一个新的进程中执行 ( Shell )
- 可以通过接续符
;
将多个命令组合成一个命令,组合的命令一次在同一个进程中被执行 set -e
指定发生错误后立即退出执行 ( 如果使用include
即使发生错误命令依旧会执行)
EG1:
.PHONY : all
#all 想要完成的操作是在当前目录下创建一个 test 的文件夹,然后进入 test 文件夹,接着创建一个 subtest 文件夹
all :
mkdir test
cd test
mkdir subtest
执行结果:与预期结果不一致,在当前目录下分别创建了 test 和 subtest 文件夹
结果分析:因为 makefile 中规则的每个命令默认是在一个新的进程中执行的
改进EG2:
.PHONY : all
all :
set -e; \
mkdir test; \
cd test; \
mkdir subtest
改进后结果和预期结果一致
3. 自动生成依赖关系的初步探索
.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
代码走读:
- 第 10 行代码包含依赖关系的文件,但是依赖关系文件刚开始不存在
- 第 25~18 行,因为依赖关系文件不存在便开始匹配和依赖关系文件名一样的规则,在这个规则下生成依赖文件
根据以上代码得出解决方案的初步思路:
- 通过 gcc -MM 和 sed 得到 .dep 依赖文件 ( 目标的部分依赖 )
- 通过 include 指令包含所有的 .dep 依赖文件,当 .dep 依赖文件不存在时使用规则自动生成