目录
1、静态模式规则
2、静态模式规则和隐含模式规则
3、双冒号规则
4、自动产生依赖规则
////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
4、自动依赖
.o文件和头文件的依赖关系
gcc -M 输出结果中包含对标准库的头文件的依赖关系描述
gcc -MM 输出结果中不需要在依赖关系中考虑标准库头文件
++++++++++++++++++++++++++++++++++++++++++++++++++++++
如下规则可以自动生成每一个.c 文件对应的.d 文件:
%.d: %.c
$(CC) -M $(CPPFLAGS) $< > $@.$$$$;
sed 's,($*).o[ :]*,1.o $@ : ,g' < $@.$$$$ > $@;
rm -f $@.$$$$
解释:
(1) .d文件描述了.o文件依赖的头文件。采用这种方式,只有源文件在修改之后才会重新使用命令生成新的依赖关系描述文件“NAME.o”
(2) CPPFLAGS 执行C预处理器“cc -E”的命令行参数(C 和 Fortran 编译器会用到)。
(3) “$$$$” 表示当前进程号
(4) 第二行;使用c 编译器自自动生成依赖文件($<)的头文件的依赖关系,并输出成为一个临时文件,“$$$$”表示当前进程号。如果$(CC) 为GNU的c 编译工具,产生的依赖关系的规则中,依赖头文件包括了所有的使用的系统头文件和用户定义的头文件。如果需要生成的依赖描述文件不包含系统头文件,可使用“-MM”代替“-M”。
(5) 第三行;使用sed 处理第二行已产生的那个临时文件并生成此规则的目标文件。这里sed 完成了如下的转换过程。例如对已一个.c 源文件。将编译器产生的依赖关系:
main.o : main.c defs.h
转成:
main.o main.d : main.c defs.h
这样就将.d 加入到了规则的目标中,其和对应的.o 文件文件一样依赖于对应的.c 源文件和源文件所包含的头文件。当.c 源文件或者头文件被改变之后规则将会被执行,相应的.d 文件同样会被更新。
(6) 第四行,删除临时文件。