12-自动生成依赖关系(中)

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 依赖文件不存在时使用规则自动生成
发布了61 篇原创文章 · 获赞 31 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_40794602/article/details/105493344