從庖丁解牛說uboot如何編譯

作者:下家山

很多人拿到uboot,編譯不知如何下手!
其實,這個世界上的萬事萬物,都有一個“紋理”。我讀中學的時候劈柴,如果順着木頭的紋理劈下去很輕易的就劈開了,但如果反其道而行之不但劈不開而且斧頭還會彈回來傷人!呵呵,城裏出生的孩子是沒這個體會,即使現在農村的孩子因爲家裏都燒液化氣也沒有這個機會體驗了。
庖丁解牛之所以遊刃有餘,是因爲他掌握了牛的紋理,順着這些紋理就應該很容易。
那麼我們的uboot的紋理在哪裏呢?
很多初學者,拿到這種代碼從來沒有去看過它的readme或者document!這兩個文本文件是非常重要的東西,可惜呀!很多人不去看readme而去請教別人,googlebaidu,跑圖書館。其實,有些東西當你問到別人的時候,聰明的人也是去看readme然後給你解答的。
下面我們就去找uboot的紋理!
本文u-boot版本U-Boot 1.1.4
我們按正常人的思維(智商90)來分析。
首先,是要編譯,那麼編譯就要執行命令make,而make實際上就是執行makefile文件。第一次make肯定是不能成功的。聽從觀音菩薩的教誨“從哪裏來就到哪裏去”!make 出問題,我們就去makefile裏找原因。Makefile裏有這樣一段話:
TOPDIR := $(shell if [ "$$PWD" != "" ]; then echo $$PWD; else pwd; fi)
export     TOPDIR
 
ifeq (include/config.mk,$(wildcard include/config.mk))
# load ARCH, BOARD, and CPU configuration
include include/config.mk
export     ARCH CPU BOARD VENDOR SOC
# load other configuration
include $(TOPDIR)/config.mk
 
ifndef CROSS_COMPILE
ifeq ($(HOSTARCH),ppc)
CROSS_COMPILE =
else
ifeq ($(ARCH),ppc)
CROSS_COMPILE = powerpc-linux-
endif
ifeq ($(ARCH),arm)
CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux-
endif
ifeq ($(ARCH),i386)
ifeq ($(HOSTARCH),i386)

CROSS_COMPILE =

else
CROSS_COMPILE = i386-linux-
endif
endif
ifeq ($(ARCH),mips)
CROSS_COMPILE = mips_4KC-
endif
ifeq ($(ARCH),nios)
CROSS_COMPILE = nios-elf-
endif
ifeq ($(ARCH),nios2)
CROSS_COMPILE = nios2-elf-
endif
ifeq ($(ARCH),m68k)
CROSS_COMPILE = m68k-elf-
endif
ifeq ($(ARCH),microblaze)
CROSS_COMPILE = mb-
endif
endif
endif
 
export     CROSS_COMPILE
這段腳本就是設置交叉編譯路徑CROSS_COMPILE,在設置這個路徑前要判斷我們所用的平臺是什麼,即ARCH是什麼。我們這裏以ARM爲例。那麼我們的ARCH從哪裏來呢?
上面有這樣一段話:
export     ARCH CPU BOARD VENDOR SOC
export表示從外部引進的變量。那麼ARCH是從哪裏引進來的呢?
上面還有一句話:
ifeq (include/config.mk,$(wildcard include/config.mk))
# load ARCH, BOARD, and CPU configuration
include include/config.mk
其實已經說的很直觀了,是從include/config.mk這個文件中裝載ARCH這些變量的。
那麼,我們再來看include/config.mk這個文件。
從官方下載的uboot是沒有這個文件的。
很多人到這裏就傻眼了,不過更多的人還跟不到這裏!
沒有這個文件怎麼辦!
還有一個很重要的文件沒有看readme。
 
在readme中有這樣一段話
Selection of Processor Architecture and Board Type:
---------------------------------------------------
For all supported boards there are ready-to-use default
configurations available; just type "make _config".
 
Example: For a TQM823L module type:
 
       cd u-boot
       make TQM823L_config
 
For the Cogent platform, you need to specify the cpu type as well;
e.g. "make cogent_mpc8xx_config". And also configure the cogent
directory according to the instructions in cogent/README.
也許你不知道TQM823L_config是什麼,但如果你腦子靈活你應該看到了configurations available; just type "make _config".這句話。如果你不能夠看到這句話,說明你不怎麼適合搞嵌入式。因爲嵌入式道路上的難度遠不止於此,不過這也算不上難度,這是一個悟性問題。
但如果你看了uboot的整個目錄結構和文件結構也許會知道TQM823L是什麼。說實話,你在編譯uboot之前你應該看一遍uboot的代碼,至少目錄結構應該清楚,如果你什麼都沒有看,就來編譯,也說明你是一個不善於學習的人,也可以說,你不怎麼適合搞嵌入式,因爲嵌入式知識面比較廣,需要你“博覽羣書”。
TQM823L是我們uboot目錄board下的一個文件夾名稱,board下面是uboot所有所支持的BSP。
如果我們是smdk2410,我們就應該是
Make smdk2410 _config
這樣我們就可以在include下得到config.mk這個配置文件,內容如下:
ARCH   = arm
CPU    = arm920t
BOARD = smdk2410
SOC    = s3c24x0
這樣,在makefile中,就可以導出
export     ARCH CPU BOARD VENDOR SOC給makefile所用。
本文僅做拋磚引玉的作用,接下來的事情就靠讀者自己去解決了。

祝你好運!

 

                   2010-8-18 11:06 寫於上海.松江
 (請尊重原創,轉載請註明:作者,下家山)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章