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

1. makefile中的include关键字

  • 类似C语言中的include

  • 将其他文件的内容原封不动地搬入当前文件

      
  • makeinclude关键字处理方式:在当前目录搜索指定目录搜索目标文件

    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 -MMsed得到.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



posted @ 2018-09-05 23:56  梦心之魂  阅读(215)  评论(0编辑  收藏  举报