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