前面分析的都是多数Makefile要读入的文件,这次我们以drivers/mtd/nand/Makefile为例,分析一个具体的子Makefile是如何工作的。
子Makefile的结构是固定的:
include $(TOPDIR)/config.mk 读入配置信息
LIB := $(obj)lib_name.o 当前Makefile的目标文件
添加源文件,COBJS-y是要编译的对象。
COBJS := $(COBJS-y) 指定目标文件
SRCS := $(COBJS:%.o=%.c) 指定源文件
OBJS := $(addprefix $(obj),$(COBJS)) 给目标文件加上obj前缀
all: $(LIBS) 伪目标
$(LIBS): $(obj).depend $(OBJS) 链接所有目标文件成当前lib_name.o
$(call cmd_link_o_target, $(OBJS))
#include $(SRCTREE)/rules.mk 依赖文件的生成
sinclude $(obj).depend 汇总的依赖信息
指定源文件的时候,会根据config.mk读入的autoconf.mk决定某个目标文件是否需要编译生成,如:
COBJS-$(CONFIG_NAND_S5PV210) += s5p_nand.o
如果include/autoconf.mk中CONFIG_NAND_S5PV210=y,那么s5p_nand.o就会被编译生成,并最终加入到libnand.o中。
每一个源文件,在汇总的依赖信息中都有一条依赖描述信息,形如:
s5p_nand.o: s5p_nand.c
header1
header2
,,,
但是依赖信息下面并没有执行命令,需要执行的命令放在了config.mk中静态模式中,也就是说依赖是依赖,静态模式是静态模式,静态模式可以决定执行什么命令,但是依赖就是只是一种描述。当源文件有了改动,那么LIB的依赖OBJS就比目标新,显然就要执行cmd_link_o_target更新,当头文件发生了改动,根据依赖信息,对应的.o目标文件就会更新,而且.depend也会更新,所以一定会带来目标LIB的更新。