GNU ARM匯編--(十七)u-boot的makefile和mkconfig解讀
主要是一些變量和函數(shù)的定義,編譯鏈接的參數(shù)設(shè)置以及依賴規(guī)則.本文引用地址:http://butianyuan.cn/article/201611/321714.htm
最后分析下make:
[cpp]view plaincopy
- $(obj)include/autoconf.mk.dep:$(obj)include/config.hinclude/common.h
- @$(XECHO)Generating$@;
- set-e;
- :Generatethedependancies;
- $(CC)-xc-DDO_DEPS_ONLY-M$(CFLAGS)$(CPPFLAGS)
- -MQ$(obj)include/autoconf.mkinclude/common.h>$@
- $(obj)include/autoconf.mk:$(obj)include/config.h
- @$(XECHO)Generating$@;
- set-e;
- :Extracttheconfigmacros;
- $(CPP)$(CFLAGS)-DDO_DEPS_ONLY-dMinclude/common.h|
- sed-n-ftools/scripts/define2mk.sed>$@.tmp&&
- mv$@.tmp$@
第二個(gè)是根據(jù)include/config.h的文件內(nèi)容,利用tools/scripts/define2mk.sed腳本將所有的CONFIG提取到autoconf.mk文件中
終極目標(biāo)是:ALL-y += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map
u-boot.srec也是根據(jù)u-boot用objcopy工具搞出來的,不知的什么作用
u-boot.bin也是根據(jù)u-boot用objcopy工具搞出來的,最終燒寫的二進(jìn)制bin檔
System.map是符號列表
[cpp]view plaincopy
- $(obj)u-boot.bin:$(obj)u-boot
- $(OBJCOPY)${OBJCFLAGS}-Obinary$<$@
- $(BOARD_SIZE_CHECK)
- ###################################################################################
- #要得到最后的u-boot.bin,必須得到u-boot.u-boot.bin是最后要燒寫到板子上的二進(jìn)制bin檔
- #利用objcopy來得到這個(gè)二進(jìn)制文件($@是規(guī)則的目標(biāo)文件名,$<是規(guī)則的第一個(gè)依賴文件名)
- #調(diào)用BOARD_SIZE_CHECK
- ###################################################################################
u-boot的依賴分析:
$(obj)u-boot: depend
$(SUBDIR_TOOLS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds
$(GEN_UBOOT)
u-boot 依賴depend $(SUBDIR_TOOLS) $(OBJS) $(LIBBOARD) $(LIBS) $(LDSCRIPT) $(obj)u-boot.lds
然后用$(GEN_UBOOT)生成最后的u-boot,GEN_UBOOT就是用ld鏈接的過程
a.看一下depend:
depend dep: $(TIMESTAMP_FILE) $(VERSION_FILE)
$(obj)include/autoconf.mk
$(obj)include/generated/generic-asm-offsets.h
$(obj)include/generated/asm-offsets.h
for dir in $(SUBDIRS) $(CPUDIR) $(LDSCRIPT_MAKEFILE_DIR) ; do
$(MAKE) -C $$dir _depend ; done
對$(SUBDIRS) $(CPUDIR) $(LDSCRIPT_MAKEFILE_DIR)目錄生成depend依賴文件;
而_depend是在rules.mk中定義的,利用CC的-M選項(xiàng)生成依賴文件.
b.看一下$(SUBDIR_TOOLS):
tools目錄
c.看一下$(OBJS):
$(OBJS): depend
$(MAKE) -C $(CPUDIR) $(if $(REMOTE_BUILD),$@,$(notdir $@))
看下$(if $(REMOTE_BUILD),$@,$(notdir $@))
因?yàn)?(REMOTE_BUILD)為空,所以返回的是$(notdir $@)的值;
因?yàn)?@指的是規(guī)則的目標(biāo),所以就是$(OBJS),而$(OBJS)就是arch/arm/cpu/arm920t/start.o
notdir內(nèi)嵌函數(shù)返回的文件名;所以返回start.o
執(zhí)行makc -C arch/arm/cpu/arm920t start.o
d.$(LIBBOARD)
$(LIBBOARD): depend $(LIBS)
$(MAKE) -C $(dir $(subst $(obj),,$@))
執(zhí)行make -C board/samsung/smdk2410
e.$(LIBS)
$(LIBS): depend $(SUBDIR_TOOLS)
$(MAKE) -C $(dir $(subst $(obj),,$@))
進(jìn)入到LIBS包含的很多目錄,執(zhí)行make,生成很多.a文件.
f.$(LDSCRIPT)
$(LDSCRIPT): depend
$(MAKE) -C $(dir $@) $(notdir $@)
在前面找鏈接腳本時(shí)已然知曉LDSCRIPT就是arch/arm/cpu/u-boot.lds
執(zhí)行make -C arch/arm/cpu u-boot.lds 這個(gè)目錄沒有makefile,這什么意思??。?!
g.$(obj)u-boot.lds
$(obj)u-boot.lds: $(LDSCRIPT)
$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D__ASSEMBLY__ -P - <$^ >$@
這些就是編譯uboot的規(guī)則,分析的比較粗糙,在移植的過程中肯定還會遇到各式各樣的問題,在移植過程中再進(jìn)一步深入并修正.
評論