U-Boot源码分析3—make
- `all`
从【嵌入式移植】4、U-Boot源码分析1—Makefile文章中可知执行make
命令的时候,没有指定目标则使用默认目标PHONY
,PHONY
依赖项为_all all scripts_basic outputmakefile scripts dtbs
。
all
Makefile
中第129行指定默认目标PHONY
依赖_all
,第198行指定_all
依赖于all
,第859行指明all
依赖于$(ALL-y) cfg
,而在第768行:
最终ALL-y
的值为
ALL-y = checkarmreloc u-boot.srec u-boot.bin u-boot.sym System.map binary_size_check spl/u-boot-spl.bin u-boot.img u-boot.dtb u-boot-dtb.img u-boot.itb
即ALL-y
包含checkarmreloc
、u-boot.srec
、u-boot.bin
、u-boot.sym
、System.map
、binary_size_check
、spl/u-boot-spl.bin
、u-boot.img
、u-boot.dtb
、u-boot-dtb.img
、u-boot.itb
这些目标具体是什么用处呢,结合【嵌入式移植】3、编译U-Boot中U-Boot的编译和烧写过程,最终是将编译生成的sunxi-spl.bin
和u-boot.itb
烧写到SD卡上
其中u-boot.itb
在ALL-y
已经有了,那么sunxi-spl.bin
又是怎么来的呢
查看编译过程
原来sunxi-spl.bin
是使用MKSUNXI
这个工具制作的,查看详细的编译过程输出,找到对应的语句(这里可以使用make CROSS_COMPILE=aarch64-linux-gnu- V=1
语句输出详细的编译过程,单独保存下来查看)
原来sunxi-spl.bin
是使用tools
目录下的mksunxiboot
工具,由spl/u-boot-spl.bi
制作而来;而查看顶层Makefile
,spl/u-boot-spl.bi
依赖于spl/u-boot-spl
,而spl/u-boot-spl
执行的命令为
spl/u-boot-spl: tools prepare \
$(if $(CONFIG_OF_SEPARATE)$(CONFIG_SPL_OF_PLATDATA),dts/dt.dtb) \
$(if $(CONFIG_OF_SEPARATE)$(CONFIG_TPL_OF_PLATDATA),dts/dt.dtb)
$(Q)$(MAKE) obj=spl -f $(srctree)/scripts/Makefile.spl all
前几行为准备编译所需工具,最后一行执行scripts/Makefile.spl
,目标为all
进入scripts/Makefile.spl
文件,目标all
依赖于$(ALL-y)
,而$(ALL-y)
包括$(obj)/$(SPL_BIN).bin
、$(obj)/sunxi-spl.bin
等,其实即需编译生成$(obj)/$(SPL_BIN).bin=spl/u-boot-spl.bin
查看$(obj)/$(SPL_BIN).bin
依赖,根据变量定义,在scripts/Makefile.spl
第232行~233行:
$(obj)/$(SPL_BIN).bin: $(obj)/$(SPL_BIN)-nodtb.bin FORCE
$(call if_changed,copy)
可知spl/u-boot-spl.bin
由$(obj)/$(SPL_BIN)-nodtb.bin
制作(与编译输出匹配cp spl/u-boot-spl-nodtb.bin spl/u-boot-spl.bin
)
在第303行~304行:
$(obj)/$(SPL_BIN)-nodtb.bin: $(obj)/$(SPL_BIN) FORCE
$(call if_changed,objcopy)
可知spl/u-boot-spl-nodtb.bin
由$(obj)/$(SPL_BIN)
通过编译工具aarch-linux-gnu-objcopy
制作,对应编译过程输出为:
aarch64-linux-gnu-objcopy -j .text -j .secure_text -j .secure_data -j .rodata -j .data -j .u_boot_list -j .rela.dyn -j .got -j .got.plt -j .dtb.init.rodata -j .efi_runtime -j .efi_runtime_rel -O binary spl/u-boot-spl spl/u-boot-spl-nodtb.bin
在第356行~358行:
$(obj)/$(SPL_BIN): $(u-boot-spl-platdata) $(u-boot-spl-init) \
$(u-boot-spl-main) $(obj)/u-boot-spl.lds FORCE
$(call if_changed,u-boot-spl)