本文来了解一下,uboot的 make 过程。继uboot配置命令执行之后,最终生成 uboot.bin 裸机程序的过程。
之前有了解 uboot的配置过程,即执行 "make xxx_deconfig"命令,主要生成 .config配置文件的过程。不同类型的开发板(即EMMC / Nand-Flash)所用的配置文件不同。
配置好 uboot 以后就可以直接 make 编译了,因为没有指明目标,所以会使用默认目标。
顶层 Makefile 中的默认目标如下:
128 # That's our default target when none is given on the command line
129 PHONY := _all
130 _all:
目标_all 又依赖于 all,如下所示:
196 PHONY += all
197 ifeq ($(KBUILD_EXTMOD),)
198 _all: all
199 else
200 _all: modules
201 endif
可以看出,这 里 不 编 译 模 块 , 所 以 KBUILD_EXTMOD 为空,_all 的依赖就是 all。
802 all: $(ALL-y)
731 ALL-y += u-boot.srec u-boot.bin u-boot.sym System.map u-boot.cfg
binary_size_check
732
733 ALL-$(CONFIG_ONENAND_U_BOOT) += u-boot-onenand.bin
734 ifeq ($(CONFIG_SPL_FSL_PBL),y)
735 ALL-$(CONFIG_RAMBOOT_PBL) += u-boot-with-spl-pbl.bin
736 else
737 ifneq ($(CONFIG_SECURE_BOOT), y)
738 # For Secure Boot The Image needs to be signed and Header must also
739 # be included. So The image has to be built explicitly
740 ALL-$(CONFIG_RAMBOOT_PBL) += u-boot.pbl
741 endif
可以看出,ALL-y 包含 u-boot.srec、u-boot.bin、u-boot.sym、 System.map、u-boot.cfg 和 binary_size_check 这几个文件。根据 uboot 的配置情况也可能包含其他的文件,例如,
ALL-$(CONFIG_ONENAND_U_BOOT) += u-boot-onenand.bin
“CONFIG_ONENAND_U_BOOT=y”
ALL-y += u-boot-onenand.bin
825 ifeq ($(CONFIG_OF_SEPARATE),y)
826 u-boot-dtb.bin: u-boot-nodtb.bin dts/dt.dtb FORCE
827 $(call if_changed,cat)
828
829 u-boot.bin: u-boot-dtb.bin FORCE
830 $(call if_changed,copy)
831 else
832 u-boot.bin: u-boot-nodtb.bin FORCE
833 $(call if_changed,copy)
834 endif
1170 u-boot: $(u-boot-init) $(u-boot-main) u-boot.lds FORCE
1171 $(call if_changed,u-boot__)
1172 ifeq ($(CONFIG_KALLSYMS),y)
1173 $(call cmd,smap)
1174 $(call cmd,u-boot__) common/system_map.o
1175 endif
678 u-boot-init := $(head-y)
679 u-boot-main := $(libs-y)
head-y := arch/arm/cpu/$(CPU)/start.o
head-y := arch/arm/cpu/armv7/start.o
620 libs-y += lib/
621 libs-$(HAVE_VENDOR_COMMON_LIB) += board/$(VENDOR)/common/
622 libs-$(CONFIG_OF_EMBED) += dts/
623 libs-y += fs/
624 libs-y += net/
625 libs-y += disk/
626 libs-y += drivers/
627 libs-y += drivers/dma/
628 libs-y += drivers/gpio/
629 libs-y += drivers/i2c/
......
660 libs-y += cmd/
661 libs-y += common/
libs-y := $(patsubst %/, %/built-in.o, $(libs-y))
u-boot.lds: $(LDSCRIPT) prepare FORCE
$(call if_changed_dep,cpp_lds)
链接脚本 u-boot.lds文件,默认是没有的,编译后才会生成。uboot根目录下的链接脚本文件 u-boot.ld 是由其他文件生成的,通过工程搜索,应该是由 arch\arm\cpu\u-boot.lds生成的。
下一篇文章继续了解 uboot的 make过程。