1. makefile中的include
关键字
-
类似C语言中的
include
-
将其他文件的内容原封不动地搬入当前文件
![](https://upload-images.jianshu.io/upload_images/5600819-00834fd13a893cbd.png?imageMogr2/auto-orient/strip|imageView2/2/w/682/format/webp)
-
make对
include
关键字的处理方式:在当前目录搜索或指定目录搜索目标文件:1)搜索成功:将文件内容搬入当前makefile中
2)搜索失败:产生警告
-
以文件名作为目标查找并执行对应规则;
-
当文件名对应的规则不存在时,最终产生错误
编程实验:makefile.1
.PHONY : all include test.txt all : @echo "this is all" test.txt : @echo "test.txt" @touch test.txt
运行结果:
2. makefile中命令的执行机制
-
规则中的每个命令默认是在一个新的进程中执行(Shell)
-
可以通过接续符(
)将多个命令组合成一个命令
-
组合的命令依次在同一个进程中被执行
-
set -e
指定发生错误后立即退出执行
编程实验:makefile.2
.PHONY : all all : set -e; mkdir test; cd test; mkdir subtest
运行结果:
3. 解决方案得初步思路
1)通过gcc -MM
和sed
得到.dep
依赖文件(目标的部分依赖)
技术点:规则中命令的连续执行
2)通过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)
运行结果:
func.dep
objs/func.o : func.c func.h
main.dep
objs/main.o : main.c func.h