先从配置命令开始分析:
Make distclean
Make wjy2440_config
Make
1、先在顶层Makefile中搜索distclean关键字
distclean: clobber unconfig
搜索clobber 、unconfig这两个依赖
unconfig:
@rm -f $(obj)include/config.h $(obj)include/config.mk \
$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp \
$(obj)include/autoconf.mk $(obj)include/autoconf.mk.dep
从这里可以知道unconfig主要是删除一些配置脚本
clobber: clean
@find $(OBJTREE) -type f \( -name '*.depend' \
-o -name '*.srec' -o -name '*.bin' -o -name u-boot.img \) \
-print0 \
| xargs -0 rm -f
@rm -f $(OBJS) $(obj)*.bak $(obj)ctags $(obj)etags $(obj)TAGS \
$(obj)cscope.* $(obj)*.*~
@rm -f $(obj)u-boot $(obj)u-boot.map $(obj)u-boot.hex $(ALL)
@rm -f $(obj)u-boot.kwb
@rm -f $(obj)u-boot.imx
@rm -f $(obj)tools/{env/crc32.c,inca-swap-bytes}
@rm -f $(obj)arch/powerpc/cpu/mpc824x/bedbug_603e.c
@rm -fr $(obj)include/asm/proc $(obj)include/asm/arch $(obj)include/asm
@rm -fr $(obj)include/generated
@[ ! -d $(obj)nand_spl ] || find $(obj)nand_spl -name "*" -type l -print | xargs rm -f
@[ ! -d $(obj)onenand_ipl ] || find $(obj)onenand_ipl -name "*" -type l -print | xargs rm -f
@[ ! -d $(obj)mmc_spl ] || find $(obj)mmc_spl -name "*" -type l -print | xargs rm -f
这里也是清除上次编译生成的文件
2、在Makefile搜索wjy2440_config关键字
wjy2440_config: unconfig
@mkdir -p $(obj)include $(obj)board/samsung/wjy2440
@mkdir -p $(obj)nand_spl/board/samsung/wjy2440
@echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h
@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
@echo "RAM_TEXT = 0x33000000" >> $(obj)board/samsung/wjy2440/config.tmp
@$(MKCONFIG) wjy2440 arm arm920t - samsung s3c24x0
@echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk
wjy2440_config主要是依赖unconfig,先执行unconfig,删除配置的脚本文件。然后在执行下面的语句,最终执行@$(MKCONFIG) wjy2440 arm arm920t - samsung s3c24x0,其他的命令主要是为了支持从nandflash启动。
3、现在分析@$(MKCONFIG) wjy2440 arm arm920t - samsung s3c24x0这里我们主要是MKCONFIG不知道是什么意思。在查找MKCONFIG
MKCONFIG := $(SRCTREE)/mkconfig
是根目录下的mkconfig文件
@$(MKCONFIG) wjy2440 arm arm920t - samsung s3c24x0这个命令相当于执行
Mkconfig wjy2440 arm arm920t - samsung s3c24x0
4、分析mkconfig文件
看到$1=”-A”想到在makefile中有:
%_config:: unconfig
@$(MKCONFIG) -A $(@:_config=)
%_config--这个应该是所有没有配置的make ***_config都会执行这个语句,S1=-A。
猜下这里的意思,在board.cfg和makefile中如果是没有定义***config执行这条语句,然后在mkconfig中会报错。
执行完这个字include/config.mk文件下生成
BOARDDIR=samsung/wjy2440
新建config.h这个文件在include下
向config.h追加以下内容
到这里配置过程全部分析完了
5、分析编译过程,也就是执行make命令的时候
打开根目录下的makefile,一直找下来发现第一个目标是all
这里主要是包含几个配置文件
接下来找链接脚本
LDSCRIPT在之前是没有定义的,所以
LDSCRIPT = arch/samsung/cpu/arm920t/u-boot.lds
但是配置了spl的nandflash启动,在include/config.mk 中最后追加CONFIG_NAND_U_BOOT=Y, 由于在编译完成的时候,LDSCRIPT =............u-boot-nand.lds
打开arch/samsung/cpu/arm920t/u-boot.lds的链接脚本
这里找到了第一个执行的程序arch/arm/cpu/arm920t/start.S
回到根目录的makefile
OBJS = arch/arm/cpu/arm920t/start.o
这里第一个目标是编译目标也是start.s
一直读,找到这个
现在就要去找ALL依赖
ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map
找u-boot.srec
其中OBJCOPY = arm-linux-objcopy
再去找依赖的u-boot
$(obj)u-boot: depend \
$(SUBDIRS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds
$(GEN_UBOOT)
ifeq ($(CONFIG_KALLSYMS),y)
smap=`$(call SYSTEM_MAP,u-boot) | \
awk '$$2 ~ /[tTwW]/ {printf $$1 $$3 "\\\\000"}'` ; \
$(CC) $(CFLAGS) -DSYSTEM_MAP="\"$${smap}\"" \
-c common/system_map.c -o $(obj)common/system_map.o
$(GEN_UBOOT) $(obj)common/system_map.o
Endif
其中
GEN_UBOOT = \
UNDEF_SYM=`$(OBJDUMP) -x $(LIBBOARD) $(LIBS) | \
sed -n -e 's/.*\($(SYM_PREFIX)__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
cd $(LNDIR) && $(LD) $(LDFLAGS) $(LDFLAGS_$(@F)) $$UNDEF_SYM $(__OBJS) \
--start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
-Map u-boot.map -o u-boot
$(obj)u-boot.bin: $(obj)u-boot
$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@
$(BOARD_SIZE_CHECK)
到此,makefile已经全部分析完成。