u-boot中makefile的執行步驟
本文分析的uboot版本是2013.04.主要目的是通過分析uboot頂目錄下的makefile檔案,瞭解uboot的大致執行步驟和順序。
簡而言之就是先讀取makefile檔案;然後讀取include包含的檔案;重建已讀取makefile檔案的規則;展開變數和函式等。
所以當我們在在shell中輸入make後,不論是否帶引數(make帶引數會影響makefile的執行過程)都是先執行sinclude的部分
sinclude $(obj).boards.depend
$(obj).boards.depend: boards.cfg
awk '(NF && $$1 !~ /^#/) { print $$1 ": " $$1 "_config; $$(MAKE)" }' $< > [email protected]
這個sinclude的主要目錄是看看資料夾下是否右.boards.depend檔案,如果沒有則依賴boards.cfg檔案,更具awk規則來生成一個。
擷取.boards.depend的部分內容,格式如下:
mini2440: mini2440_config; $(MAKE)
VCMA9: VCMA9_config; $(MAKE)
smdk2410: smdk2410_config; $(MAKE)
omap1510inn: omap1510inn_config; $(MAKE)
可以發現最左側的都是目標,比如目標mini2440或smdk2410
並且這些目標都是依賴$(board)_config型別的檔案,規則都是執行make動作。
那為啥要生成這個.boards.depend檔案呢?後面再解釋,先往下看。
sinclude之後就要重建規則,展開變數,執行makefile了。
我們先分析在shell中直接輸入make且不帶引數的情況。這種case下,在sinclude等之後就會順序執行到makefile中的如下處:
ifeq ($(obj)include/config.mk,$(wildcard $(obj)include/config.mk))
這是個判斷語句,就是在include目錄中查詢是否右config.mk檔案
預設情況下是沒有這個檔案的,並且如果我們直接在shell中輸入make,那make執行到這裡的時候也只是執行sinclude的動作,並沒有去建立config.mk檔案
所以這裡就應該直接跑到else的中執行:
else # !config.mk
all $(obj)u-boot.hex $(obj)u-boot.srec $(obj)u-boot.bin \
$(obj)u-boot.img $(obj)u-boot.dis $(obj)u-boot \
$(filter-out tools,$(SUBDIRS)) \
updater depend dep tags ctags etags cscope $(obj)System.map:
<span style="white-space:pre"> </span>@echo "System not configured - see README" >&2
<span style="white-space:pre"> </span>@ exit 1
可以看到這裡就一個目標,就是從all開始的字元一直到 $(obj)System.map,這個目標就會作為makefile的最終目標。
但是這個目標只是列印了句:system not configured然後提示我們看下READE檔案就退出了。
這說明什麼呢?說明在shell中僅輸入make不帶引數的話是編不出u-boot.bin檔案的。 ^_^
如何正確編出u-boot.bin檔案這裡就不說了,請看README的提示吧。
下面我們再來分析另外一種,shell中輸入make 帶引數的命令。
比如我們要編譯mini2440的u-boot。那麼可以輸入 make mini2440或者make mini2440_config
我們先分析輸入make mini2440的情況。
輸入make mini2440之後,首先做的和前面一樣,先執行sinclude等操作,然後再執行其它動作。
這裡我們輸入的是make mini2440,注意這時make的執行過程和前面不帶引數的make執行過程是不一樣的!
具體如下:
make mini2440引數mini2440是目標,make會去Makefile檔案中尋找mini2440對應的依賴和規則。
那我們的Makefile中有mini2440這個規則嗎?答案是有!而且是sinclude執行之後才有的。
前面分析過sinclude執行之後是生成了一個.boards.depend的檔案,這裡麵包含了一條:
mini2440: mini2440_config; $(MAKE)
並且該檔案是通過sinclude引入的,所以最終這條語句相當於被插入到了Makefile檔案中。所以當輸入make mini2440後, 是先去執行mini2440對應的規則,而不是之前不帶引數的make執行到ifeq處!
接著我們分析這個mini2440的目標,它依賴的是mini2440_config檔案,規則是$(MAKE)也就是再執行make。
那這個mini2440_config依賴檔案存在嗎?答案是存在!
在頂目錄的Makefile中我們看到右如下語句:
%_config:: unconfig
<span style="white-space:pre"> </span>@$(MKCONFIG) -A $(@:_config=)
這個%_config就是前面依賴的檔案,%是萬用字元,只要字串中帶有後綴_config的都會引用到這裡,那mini2440_config當然也不例外。
所以mini2440_config的規則也就是在這裡定義,這裡會先執行unconfig的相關規則,然後再執行自己的規則。
替換之後就相當於執行./mkconfig -A mini2440。這時就跑到頂目錄的mkconfig中去執行了,
執行完這個之後在include目錄下就生成樂config.mk檔案。
接著我們再回過頭去看mini2440的規則,mini2440的規則是$(MAKE),那就是相當於執行完頂目錄的mkconfig之後再執行make且不帶引數。
這時候就會從頂目錄Makefile開頭開始執行,這時就會執行到ifeq語句,此時include目錄下已經有了config.mk檔案,條件判斷成立,後續就
執行ifeq裡面的內容去了,最終就會生成u-boot.bin等檔案。
我們再理一下這個make mini2440的過程,如下:
1.執行sinclude,生成.boards.depend檔案,
mini2440: mini2440_config; $(MAKE)
被插入到頂目錄的Makefile檔案中
2.檢查make引數mini2440對應的依賴檔案mini2440_config
3.檢查mini2440_config對應的依賴檔案和規則
%_config:: unconfig
<span> </span>@$(MKCONFIG) -A $(@:_config=)
4.執行unconfig
unconfig:
<span style="white-space:pre"> </span>@rm -f $(obj)include/config.h $(obj)include/config.mk \
<span style="white-space:pre"> </span>$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp \
<span style="white-space:pre"> </span>$(obj)include/autoconf.mk $(obj)include/autoconf.mk.dep
5.執行@$(MKCONFIG) -A $(@:_config=)
在include目錄下生成config.mk檔案
6.執行mini2440: mini2440_config; $(MAKE)中的規則$(MAKE)
相當與再執行一次不帶引數的make命令
7從頭開始執行頂目錄Makefile,此時已存在config.mk檔案,所以如下判斷成立
ifeq ($(obj)include/config.mk,$(wildcard $(obj)include/config.mk))
所以在這個ifeq裡面會去做一些編譯連結,最終生成u-boot等檔案。
回顧前面,我們說了生成mini2440的uboot可以使用兩個命令。make mini2440或make mini2440_config。
那如果輸入make mini2440_config的執行過程是怎麼樣的呢?
如果輸入make mini2440_config檔案,步驟和make mini2440是一樣的,只是不需要依賴.boards.depend檔案而已!
記得以前老版本的uboot,比如1.1.6版本,要編譯mini2440的uboot的話,應該要分開輸入兩條命令。
1.先make mini2440_config
2.再make all
所以這個新版本的uboot這麼寫的makefile的好處大概就是隻需要在shell中輸入 Target名稱就可以,不需要再多輸入"_config"。
而且只需要輸入這一邊就可以得到u-boot.bin檔案。
相關推薦
u-boot中makefile的執行步驟
本文分析的uboot版本是2013.04.主要目的是通過分析uboot頂目錄下的makefile檔案,瞭解uboot的大致執行步驟和順序。 簡而言之就是先讀取makefile檔案;然後讀取include包含的檔案;重建已讀取makefile檔案的規則;展開變數和函式等。
分析u-boot的Makefile
選項 lin 編譯平臺 create cpp port n) ati inux 這裏分析三星s5pv210芯片官方u-boot 先看u-boot 版本號 VERSION = 1 #主版本號PATCHLEVEL = 3 #次版本號SUBLEVEL
u-boot主makefile分析2
1.包含主目錄的config.mk # load other configuration include $(TOPDIR)/config.mk 在config.mk中主要做了哪些工作呢? 1.編譯工具定義 # # Include the make variables (CC, et
u-boot主makefile分析1
1.u-boot版本號 VERSION = 1 PATCHLEVEL = 1 SUBLEVEL = 6 EXTRAVERSION = U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) VERSIO
u-boot中nand相關命令使用---- ubi, ubifsls, ubifsmount, ubifsumount
轉載地址:https://blog.csdn.net/voice_shen/article/details/8425763 [Version: 2013-01-rc2] [Author: Bo Shen <[email protected]>] 1. &
u-boot(二)makefile
目錄 u-boot(二)makefile 引入 目錄結構(1.1.6) 配置檔案 目標 配置具體的單板 編譯階段 過程 連結入口 配置連結地址 附錄
u-boot 中增加自定義命令hjlcmd2------(新增檔案來定義)
1,在 "[email protected]:/home/hjl/Downloads/uboot/common#" 目錄中新增檔案 cmd_hjl.c ,加上標頭檔案 #include <common.h> &nbs
u-boot 中增加自定義命令hjlcmd1
在uboot/common資料夾下找到command.c檔案,進入編輯: 對照隨便一個命令,如: do_version (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { extern char version_strin
u-boot中新增mtdparts支援以及Linux的分割槽設定
閱讀目錄(Content) 簡介 作者:彭東林 u-boot版本:u-boot-2015.04 Linux版本:Linux-3.14 硬體平臺:tq2440, 記憶體:64M NandFlash: 256MB 下面我們分兩部分,u-boot和k
在U-boot中新增乙太網驅動
版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/mao0514/article/details/17523803 當定義CONFIG_CMD_NET和CONFIG_CMD_PING,編譯之後執行ping命令,告警沒有
am335x uboot2016.05 (MLO u-boot.img)執行流程(轉)
eve eset dog 不同的 common 速度 star setup oba am335x的cpu上電後,執行流程:ROM->MLO(SPL)->u-boot.img 第一級bootloader:引導加載程序,板子上電後會自動執行這些代碼,如啟動方式(SD
GNU ARM彙編--(十七)u-boot的makefile和mkconfig解讀
自己寫的bootloader可以引導kernel了,我以為曾經神祕的u-boot程式碼將變得毫無挑戰,然事實表明u-boot作為優秀的開原始碼,閱讀起來還是很有挑戰的,值得一讀! 閱讀碰到的頭等問題:Makefile和shell指令碼看不懂.
U-boot主Makefile分析
原文:http://blog.csdn.net/qq_28992301/article/details/51802885 U-boot主Makefile分析 主Makefile位於uboot原始碼的根目錄下,其內容主要結構為: 1. 確定版本號及主機資訊
u-boot中:rm:無法刪除 "asm":是一個目錄
轉自:http://blog.163.com/zhangyingxin_/blog/static/218307222201331291755998/ uboot移植編譯小問題 ———rm:無法刪除 "asm":是一個目錄 我之前所做的uboot移植工作都快要完成了,想要拷貝
在U-BOOT中實現讀取電池電量
platform: s3c2440 + u-boot 1.1.4 + linux 2.6.18 為了防止低電開機啟動到一半的時候系統down掉,所以有必要在 u-boot 中加入電池電量的偵測。 偵測電池電量只需讀 AN0 口上的 AD 值就可以了,當電量少於 5
在U-boot中新增Cubieboard(全志A10)乙太網驅動
當定義CONFIG_CMD_NET和CONFIG_CMD_PING,編譯之後執行ping命令,告警沒有找到乙太網。 因此,需要開啟U-boot的網路功能, u-boot-sunxi-sunxi中沒有找到明顯的網路驅動程式碼,或許有通用的驅動,但可以獲得資料的途徑有限,再說我
u-boot中mkimage工具的具體使用
通常,u-boot為kernel提供一些kernel無法知道的資訊,比如ramdisk在RAM中的地址。Kernel也必須為U-boot提供必要的資訊,如通過mkimage這個工具(在u-boot程式碼的tools目錄中)可以給zImage新增一個header,也就是使得通常
《轉》u-boot移植燒寫步驟、u-boot命令和kernel燒寫步驟
轉自:《http://blog.sina.com.cn/s/blog_726c4bd20100unjn.html》 移植燒寫步驟 1. 解壓u-boot原始檔 2. 從u-boot/include/configs裡找相近的配置,複製成自已的名字 3. 改make
命令在Linux中的執行步驟
命令在Linux中的執行分為4步: 第一步:判斷路徑 判斷使用者是否以絕對路徑或相對路徑的方式輸入命令(如/bin/ls),如果是的話直接執行。 第二步:檢查別名 Linux系統檢查使用者輸入的
U-Boot中MAC地址設定及往核心中傳遞
一、核心引數的傳遞 U-Boot向Linux驅動傳遞引數的方式有兩種,一為在系統啟動的時候由bootloader傳入,還有一種是將驅動編譯成模組,將引數作為模組載入的引數傳入。 核心通過setup介面接受Bootloader傳入的引數。方式如下: st