U-Boot Makefile分析(4)具体子Makefile的分析

时间:2023-03-10 23:07:44

  前面分析的都是多数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的更新。