uboot源码——主Makefile分析
以下內容源于朱有鵬嵌入式課程的學習,如有侵權,請告知刪除。
一、配置編譯初體驗
1、uboot來源于官方(uboot官網下載),或者SoC官方(研發s5pv210芯片的公司推出的開發板,SMDKV210),或者具體的開發板的官方(深圳市九鼎科技,X210)。
- 這里以針對x210開發板移植好的uboot進行配置、編譯和分析。
2、步驟
- 將源碼解壓在適當的目錄下;
- 配置,即在uboot的根目錄下執行make ?x210_sd_config;
- 編譯,即在uboot的根目錄下執行make(或者make -j2,或者make -s,前者多線程編譯,后者靜默編譯)。
二、uboot的源目錄分析
1、包括文件、文件夾。
2、主要的文件有uboot根目錄下的mkconfig,Makefile,前者負責uboot的編譯,后者負責編譯。
3、主要的文件夾有board,cpu、common、include等。board文件夾中每個子文件夾表示一個開發板。cpu文件夾中每個子文件夾都是一個SoC系列。
三、uboot的配置分析
1、配置,即確定所使用的文件夾、文件的路徑。
2、總結
(1)在uboot的根目錄下執行make ?x210_sd_config時,x210_sd_config是目標,在主Makefile中有如下代碼:
x210_sd_config : unconfig@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk- 調用MKCONFIG所表示的腳本,即uboot根目錄下的mkconfig腳本;
- 該腳本接收6個參數,分別是x210_sd,arm,s5pc11x,x210,samsung,s5pc110;
- $(@:_config=)表示匹配后面帶有_config的參數,并取除去_config的部分,即取x210_sd。
(2)在mkconfig腳本(見博客http://blog.csdn.net/oqqhutu12345678/article/details/73166954)
- 創建符號鏈接;
- 創建include/config.mk文件;注意這里的config.mk不是根目錄下的config.mk文件;
- 創建include/config.h文件。
(3)創建include/config.mk文件是為了讓主Makefile在第133行包含。(見四7)
(4)include/config.h文件中,僅有一行代碼:#include<configs/x210_sd.h>
- 這里的configs是include文件夾里的一個子文件夾;
- configs下的每個文件對應一個開發板的頭文件,它是一些宏定義配置文件,是移植時最主要的文件。
- 其中x210_sd.h被用來生成autoconfig.mk文件。
- autoconfig.mk文件被主Makefile引入,指導整個編譯過程,此文件中的宏會影響uboot中的大部分.C文件中的一些條件編譯的選擇,從而實現最終的可移植性。
四、uboot的主Makefile分析
1、uboot的版本號(24~29行)
VERSION = 1 PATCHLEVEL = 3 SUBLEVEL = 4 EXTRAVERSION = U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) VERSION_FILE = $(obj)include/version_autogenerated.h2、(1)export ? HOSTARCH ?HOSTOS,HOSTARCH 、 HOSTOS分別表示主機的CPU架構和操作系統;
? ? ? (2) ?| ?表示管道?
3、靜默編譯:make -s
- -s表示參數,silent執行(50~54行)
4、2種編譯管理方法(78~123行)
(1)原地編譯:編譯得到的文件和源文件在同一個目錄下,簡單但是會污染源目錄;
(2)單獨文件夾輸出的編譯:設置一個輸出目錄,承載編譯輸出結果。
(3)默認原地編譯。
(4)指定具體的輸出目錄方法
- a、編譯時,用make O=輸出目錄;
- b、或者先export BUILD_DIR=輸出目錄,然后編譯時直接make。
5、OBJTREE,SRCTREE,TOPDIR
- 三者分別表示編譯后,.o文件存放的目錄的根目錄( \root\uboot\ ),源碼目錄的根目錄(\root\uboot\),頂層目錄。原地編譯時,前者和中者目錄是相等的。
6、MKCONFIG(101行):是Makefile中定義的一個變量,值為源碼根目錄下的mkconfig,而mkconfig是一個腳本。
7、$(obj)include/config.mk(主Makefile中的133行)
- include/config.mk文件是在配置階段生成的,見本文的三2(2)。 此文件的內容如下:
- 配置值來自主Makefile第2589行的配置項里的傳參;
- 在主Makefile中的134行將這些變量export出來作為環境變量。
8、ARCH和CROSS_COMPILE(主Makefile中的136~182行)
- 這兩個是環境變量;
- ARCH定義為當前編譯的目標的CPU架構,在這里是ARM;
- CROSS_COMPILE定義交叉編譯工具的前綴;
---------------------------------------------根目錄下的config.mk文件-----------------------------------------------------------------
見博客http://blog.csdn.net/oqqhutu12345678/article/details/73167054
9、include $(TOPDIR)/config.mk(主Makefile中的185行)
- 這是根目錄下的config.mk文件,不是include/config.mk
10、編譯工具定義(根目錄下的config.mk文件中的94~107行)
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)RANLIB11、包含開發板配置項目(根目錄下的config.mk文件中的112行)
(1)代碼為
sinclude $(OBJTREE)/include/autoconf.mk(2)autoconf.mk是在配置中自動生成的,參見三2(4),它是一些宏,指導編譯進行方向。(3)原料是include/configs/x210_sb.h,include/configs下的每個頭文件對應一個開發板。
12、鏈接腳本(根目錄下的config.mk文件中的142~149行)
(1)如果定義了CONFIG_NAND_U_BOOT,則鏈接腳本是u-boot-nand.lds,沒有定義則鏈接腳本為u-boot.lds。
- uboot的最終鏈接地址是在Makefile中用-Ttext xxxx的形式來指定,好像和鏈接鏈接腳本沒有多大的關聯?
(2)實際在board\samsung\x210下的u-boot.lds。見博文http://blog.csdn.net/oqqhutu12345678/article/details/73166096
13、TEXT_BASE(在根目錄下的config.mk中的156~158行):為整個uboot鏈接時指定鏈接地址。
14、自動推導規則(在根目錄下的config.mk中的239~256行)。
-------------------------------------------------------------------------------------------------------------------------------------------------
15、在主Makefile中,第291行出現了整個Makefile的第一個目標ALL,其實我們make時,就是make ALL。
綜上所述,整個配置和編譯過程涉及的文件主要有:
主目錄下的Makefile文件
根目錄下的config.mk文件(被主Makefile文件調用)
根目錄下的mkconfig文件(配置階段的配置腳本)。
總結
以上是生活随笔為你收集整理的uboot源码——主Makefile分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: apizza的使用方法
- 下一篇: 查看javajdk版本