1. 程式人生 > >u-boot中makefile的執行步驟

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-bootmakefile執行步驟

本文分析的uboot版本是2013.04.主要目的是通過分析uboot頂目錄下的makefile檔案,瞭解uboot的大致執行步驟和順序。 簡而言之就是先讀取makefile檔案;然後讀取include包含的檔案;重建已讀取makefile檔案的規則;展開變數和函式等。

分析u-bootMakefile

選項 lin 編譯平臺 create cpp port n) ati inux   這裏分析三星s5pv210芯片官方u-boot 先看u-boot 版本號 VERSION = 1    #主版本號PATCHLEVEL = 3   #次版本號SUBLEVEL

u-bootmakefile分析2

1.包含主目錄的config.mk # load other configuration include $(TOPDIR)/config.mk 在config.mk中主要做了哪些工作呢? 1.編譯工具定義 # # Include the make variables (CC, et

u-bootmakefile分析1

 1.u-boot版本號 VERSION = 1 PATCHLEVEL = 1 SUBLEVEL = 6 EXTRAVERSION = U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) VERSIO

u-bootnand相關命令使用---- 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-bootmakefile和mkconfig解讀

        自己寫的bootloader可以引導kernel了,我以為曾經神祕的u-boot程式碼將變得毫無挑戰,然事實表明u-boot作為優秀的開原始碼,閱讀起來還是很有挑戰的,值得一讀!         閱讀碰到的頭等問題:Makefile和shell指令碼看不懂.

U-bootMakefile分析

原文: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-bootmkimage工具的具體使用

通常,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-BootMAC地址設定及往核心傳遞

一、核心引數的傳遞 U-Boot向Linux驅動傳遞引數的方式有兩種,一為在系統啟動的時候由bootloader傳入,還有一種是將驅動編譯成模組,將引數作為模組載入的引數傳入。 核心通過setup介面接受Bootloader傳入的引數。方式如下: st