1. 程式人生 > >uboot移植之配置編譯過程詳解2

uboot移植之配置編譯過程詳解2

/***********************************************************************************    
        2018.11月
        作者:劉鈺
        注:以uboot\u-boot-samsung-dev為分析物件

      config.mk的前世今生:


****************************************************************************************/
    

    1.config.mk在mkconfig中被建立
        Create include file for Make
        echo "ARCH   = $2" >  config.mk
        echo "CPU    = $3" >> config.mk
        echo "BOARD  = $4" >> config.mk
    
    2.在Makefile中被引用。

        # load other configuration
        include $(TOPDIR)/config.mk
        
    3.config.mk在配置執行過程中在根目錄下生成了一個autoconfig.mk檔案
        # Load generated board configuration
        sinclude $(OBJTREE)/include/autoconf.mk
        此檔案很多內容是“CONFIG_”開頭的巨集,它的作用就是用來指導整個uboot的編譯過程。
    這個檔案不是憑空產生的,配置過程也是需要原材料來產生這個檔案的。原材料在原始碼目錄的inlcude/configs/xxx.h標頭檔案。(行x210開發板中為include/configs/smdk2410.h)。這個h標頭檔案裡面全都是巨集定義。每一個開發板的移植都對應這個目錄下的一個頭檔案,這個標頭檔案裡每一個巨集定義都是移植uboot的關鍵所在。

    4.config.mk一些關於編譯選項的設定:
        CROSS_COMPILE:環境變數(路徑)+交叉編譯鏈的前半部分
    
    下面具體的定義了CROSS_COMPILE:
        export    CONFIG_SHELL HPATH HOSTCC HOSTCFLAGS CROSS_COMPILE \
        AS LD CC CPP AR NM STRIP OBJCOPY OBJDUMP \
        MAKE
        export    TEXT_BASE PLATFORM_CPPFLAGS PLATFORM_RELFLAGS CPPFLAGS CFLAGS AFLAGS
        
        ifeq ($(ARCH),arm)
        ifeq ($(CROSS_COMPILE),powerpc-netbsd-)
        PLATFORM_CPPFLAGS+= -D__ARM__
        endif
        ifeq ($(CROSS_COMPILE),powerpc-openbsd-)
        PLATFORM_CPPFLAGS+= -D__ARM__
        endif
        endif
        
    匯出的環境變數:
        # Include the make variables (CC, etc...)
        AS    = $(CROSS_COMPILE)as
        LD    = $(CROSS_COMPILE)ld
        CC    = $(CROSS_COMPILE)gcc
        CPP    = $(CC) -E
        AR    = $(CROSS_COMPILE)ar
        NM    = $(CROSS_COMPILE)nm
        LDR    = $(CROSS_COMPILE)ldr
        STRIP    = $(CROSS_COMPILE)strip
        OBJCOPY = $(CROSS_COMPILE)objcopy
        OBJDUMP = $(CROSS_COMPILE)objdump
        RANLIB    = $(CROSS_COMPILE)RANLIB
        
     
    5.config.mk指定對應板子配置試的連結指令碼
        ifeq ($(CONFIG_NAND_U_BOOT),y)
        LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds
        else
        LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
        endif
    如果定義了CONFIG_NAND_U_BOOT巨集,則連結指令碼叫u-boot-nand.lds,如果未定義這個巨集則連結指令碼叫u-boot.lds。我們在分析uboot的編譯連結過程時就要考慮u-boot.lds這個連結指令碼。
    
    6.定義了整個uboot連結時指定的連結地址:TEXT_BASE
        ifneq ($(TEXT_BASE),)
        CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE)
        endif