目录
1.makefile中的include关键字
- 类似C语言中的include
- 将其他文件的内容原封不动的搬入当前文件
2.make对include关键字的处理方式
- 在当前目录搜索或指定目录搜索目标文件
- 搜索成功:将文件内容搬入当前makefile中
- 搜索失败:产生警告
以文件名作为目标查找并执行对应规则
当文件名对应的规则不存在时,最终产生错误
3.下面的代码怎么执行?为什么?
如果有test.txt文件,在里面添加一行代码,按照make回去找第一个目标,所以就不会去执行all这个目标
4.makefile中命令的执行机制
- 规则中的每个命令默认是在一个新的进程中执行(shell)
- 可以通过接续符(;)将多个命令组合成一个命令
- 组合的命令依次在同一个进程中被执行
- set –e指定发生错误后立即退出执行
5.下面的代码想要实现的功能?有没有问题?
并没有达到我们的需求,其实这三条指令:规则中的每个命令默认是在一个新的进程中执行(shell),也就说执行一条就已经结束了。
.PHONY : all
all :
set -e; \
mkdir test; \
cd test; \
mkdir subtest
6.解决方案的初步思路
- 通过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)
- To be continued…
思考:
如何组织依赖文件相关的规则与源码编译相关的规则,进而形成功能完整的makefile程序?