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

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

/**************************************************************************************
    2018.10下旬
    針對三星官方為210移植過的uboot和kernel內Makefile的分析
/*****************************************************************************************

重點:CROSS_COMPILE,環境變數(路徑)+交叉編譯工具鏈的字首  (7) 

1.***uboot的版本配置資訊:
    VERSION = 1   
    PATCHLEVEL = 3
    SUBLEVEL = 4
    EXTRAVERSION =
    U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
    
2.***在根目錄下的include內建立了一個巨集。編譯之後生成。

    
    VERSION_FILE = $(obj)include/version_autogenerated.h
    

3.***環境變數的設定    
    HOSTARCH := $(shell uname -m | \
    ............
    HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \
            sed -e 's/\(cygwin\).*/cygwin/')
    export    HOSTARCH 
    

4.***實現靜默編譯    
    ifeq (,$(findstring s,$(MAKEFLAGS)))
    XECHO = echo
    else
    XECHO = :
    endif
    
5.***三個重要的引數:OBJTREE,SRCTREE,TOPDIR
    OBJTREE:編譯之後.o檔案的存放位置。
    在預設編輯的情況下OBJTREE等於當前目錄,在o=xx編譯下,OBJTREE是我們設定的輸出目錄
    SRCTREE:原始碼目錄,也就是uboot的根目錄目錄,當前目錄。
    TOPDIR:被賦值於SRCTREE,是uboot的根目錄目錄,當前目錄。

6.***兩個重要的環境變數:
    ARCH:當前編譯目標的CPU架構。  126    
    CROSS_COMPILE:交叉編譯工具鏈的字首,由於不同CPU架構的交叉編譯工具鏈之間只是字首的不同,將字首用環境變數單獨設定,保證了uboot的可移植性。  136
    CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
    =後面就是交叉編譯工具鏈的儲存位置。
    
7.***5個與板子資訊有關的環境變數:
    ARCH CPU BOARD VENDOR SOC    
    具體的定義在smdkv210onenand_config : unconfig   2597
    
8.***CROSS_COMPILE定義交叉編譯工具鏈的字首。在不停的CPU架構下的交叉編譯工具鏈字首都不相同
    字尾一樣,將前後綴分開可以實現移植的目的。

    
9.***include $(TOPDIR)/config.mk  (169)
    引用了主目錄下一個config.mk資料夾,資料夾內具體的說明了其應用。
    其中以下定義了一些交叉編譯工具鏈:
    
    在config.mk中有一個TEXT_BASE,是我們將來整個uboot連結時指定的連結地址
    
    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
    這個檔案就是用來指導整個uboot的編譯過程,這個檔案的內容其實就是很多的CONFIG開頭的巨集,這些巨集會影響我們uboot的編譯過程。
    這個檔案產生於原始碼根目錄下的include/configs/xxx.h標頭檔案。此config目錄下包括了各個版本開發板的全部標頭檔案。在移植的時候,只要是將對應的標頭檔案留下,並作出相應的修改。這些配置是我們移植的關鍵所在。
    
    編譯連結的一個指令碼連結在根目錄下的u-boot.lds
    config.mk內的TEXT_BASE是整個uboot連結時指定的連結地址。而這個地址是一個虛擬地址對映,具體的地址取決於uboot中的虛擬地址對映關係。
    

***整個Makefile的第一個主目標:
    291行:all:        $(ALL)
    
    smdkc110n_mtd_config :    unconfig
    即我們進行編譯時,make只是編譯其中的個別目標。而這個目標在2558行有著具體的解釋。    而這個目標在2558行有著具體的解釋。同時他也依賴於前面的unconfig這個目標,使得uboot可以實現重複多次編譯。