1. 程式人生 > >vivi的Makefile檔案解析(1)

vivi的Makefile檔案解析(1)

     這段時間學習的壓力要小的多,處理做LFS外,還編譯了vivi,vivi是mizi公司一款bootloader,總體說了,這是一個輕量級的bootloader,程式碼的規模比較小,非常適合用於學習研究,不想uboot,萬行的程式碼,不是那麼容易讀的,同時,vivi還有一個優點,就是它的Makefile檔案結構,完全是仿照kernel的Makefile,所以,學習vivi的Makefile是很有價值的,可以從vivi的makefile看出,很多的Makefile是直接從kernel的檔案中的貼上過來的。廢話不說了,我們開始解析下vivi的Makefile檔案吧。   首先需要看一些vivi的檔案組織形式:
|-- COPYING  //這是一個GPL檔案
|-- CVS       //這是一個版本控制軟體的資料夾
|-- Documentation  //相關說明文件
|-- Makefile     //Makefile檔案
|-- Rules.make   //Makefile通用規則
|-- arch         //與平臺板卡相關的檔案
|-- drivers      //驅動檔案
|-- include      //標頭檔案
|-- init        // 系統初始化檔案
|-- lib       //庫檔案
|-- scripts   //一些vivi的配置指令碼,同時包含有menuconfig的原始碼
|-- util    //二進位制工具,這裡有兩個工具:imagewrite 和ecc

上邊就是vivi的檔案組織結構,有一些檔案是與編譯無關的,一些說明文件、版本控制檔案以及其他一些檔案,我們把不需要的檔案刪除,util這裡邊的工具用在其他的地方,可以選擇性的編譯,但這些檔案是與vivi的編譯無關的,當然,GPL協議是非常重要的,這裡不是說GPL不重要,刪除只是為了列舉與vivi編譯有關的檔案。下邊是精簡的檔案組織形式:

|-- Makefile   //主Makefile
|-- Rules.make   //通用Makefile規則
|-- arch        //與平臺板卡相關的檔案
|-- drivers      //驅動檔案
|-- include      //標頭檔案
|-- init       //初始化檔案
|-- lib        //庫檔案
|-- scripts    //配置指令碼與menuconfig的原始碼
我們來分析下vivi從配置到最後生成的總體流程:                make menuconfig 或者 make config 或者 make oldconfig                                |||||                                /    /                                生成 vivi/.config檔案【儲存了配置檔案】                                ||                                //                                然後make ,這時候make根據.config的內容進行編譯。 這裡我們感興趣的是執行make menuconfig後,出現的圖形化選單選項是怎麼完成這個功能的,其實,mizi公司的程式是直接仿照kernel的形式,實質就是COPY過來的。  具體的過程是這樣的,當執行make menuconfig ,首先 進入到scripts/lxdialog檔案下,用gcc編譯一個 menuconfig程式出來,這就是為什麼在你輸入make menuconfig的時候,會打印出來如下的內容:

make -C scripts/lxdialog all
make[1]: Entering directory `/tmp/vivi/scripts/lxdialog' # 跳轉入目錄
make[1]: Leaving directory `/tmp/vivi/scripts/lxdialog' # 編譯完後,離開目錄
bin/sh scripts/Menuconfig arch/config.in #執行lxdialog

arch/config.in
Using defaults found in .config
Preparing scripts: functions, parsing.............done.

它首先是跳轉如scripts/lxdialog資料夾下,然後進行編譯,生成lxdialog的可執行檔案,這個主要用於構建視覺化圖形介面,具體的功能這裡不做詳細介紹了,這樣,編譯生成lxdialog後, 這個可執行檔案和menuconfig指令碼的相互配合下就可以進行配置了,同時需要說明的時,在圖形化配置中,會出現很多的選單化選項,那麼這些選單化選項是否可以更改,當然是可以的,如果你夠仔細,就會發現,在vivi真個目錄中,有很多的config.in檔案,這些檔案就儲存了這些的選單選項,只要修改這些檔案就可以任意的新增自己的選項了,這裡對這些的選單配置檔案做一些簡要的說明。

在arch/config.in中的檔案內容:

choice 'ARM system type' /
  "SA1100-based        CONFIG_ARCH_SA1100 /
   PXA250/210-based    CONFIG_ARCH_PXA250 /
   S3C2400-based    CONFIG_ARCH_S3C2400 /
   S3C2410-based    CONFIG_ARCH_S3C2410"


mainmenu_option next_comment
comment 'Implementations'
if [ "$CONFIG_ARCH_SA1100" = "y" ]; then
  choice 'Platform' /
    "KINGS    CONFIG_SA1100_KINGS /
     FORTE    CONFIG_SA1100_FORTE /
     SUNS    CONFIG_SA1100_SUNS /
     SUNS_OLD    CONFIG_SA1100_SUNS_OLD /
     GILL    CONFIG_SA1100_GILL /
     ENDA    CONFIG_SA1100_ENDA /
     EXILIEN102    CONFIG_SA1100_EXILIEN102 /
     WISMO    CONFIG_SA1100_WISMO"

這裡只截取了一小部分, 這些指令碼都是相似的,如果感興趣可以自己去開啟看看,相似的指令碼還出現在/driver/mtd  driver/mtd/nand driver/mtd/nor driver/mtd/maps  driver/serial等資料夾下,這些是和kernel的選單化配置一樣的,都是直接copy過來,給我們一個提示:

   學習的第一層是優秀的模仿,學會模仿也是一種學習能力。

通過上邊的操作,我們認為所有的配置已經完成了,應該開始編譯工作了,至於編譯的流程需要我們看看makefile檔案。由於Makefile檔案比較長,不方便全部貼在這裡。我們分段進行分析。

VERSION = 0
PATCHLEVEL = 1
SUBLEVEL = 4

VIVIRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)

ARCH := arm

CONFIG_SHELL := $(shell if [ -x"$$BASH" ]; then echo $$BASH; /
    else if [ -x /bin/bash ]; then echo /bin/bash; /
    else echo sh; fi ; fi)
TOPDIR    := $(shell /bin/pwd)

#
# change this to point to the Linux include directory
#
LINUX_INCLUDE_DIR    = /usr/local/arm/2.95.3/include/


VIVIPATH = $(TOPDIR)/include

HOSTCC = gcc
HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer

CROSS_COMPILE = /usr/local/arm/2.95.3/bin/arm-linux-
#CROSS_COMPILE = /opt/host/armv4l/bin/armv4l-redhat-linux-

#
# Include the make variables (CC, etc...)
#

AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nm
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
MAKEFILES = $(TOPDIR)/.config
MD5SUM        = md5sum
PERL = perl
AWK        = awk

export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE /
        CONFIG_SHELL TOPDIR VIVIPATH HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC /
    CPP AR NM STRIP OBJCOPY OBJDUMP MAKE MAKEFILES MD5SUM PERL AWK

# 版本號  在生成的vivi中,開頭的版本號就是有這個地方的變數來決定

VERSION = 0
PATCHLEVEL = 1
SUBLEVEL = 4  

# VIVI 這裡設定輸出版本資訊的格式。
VIVIRELEASE=$(VERSION).$(PATCHLEVEL).$(SUBLEVEL)

#  ":=" 與"="的區別: ”:=“為直接展開,”=“為遞迴展開,詳細內容看GNU make中文手冊6.2.2
# ”:=“在此處會定義一個變數,直接對其賦值,對於引用會直接找到引用的源,表示立即展開
#”:“只是簡單的替換,不會直接找到引用的源,在以後,如果引用的源發生變化,此處的變數也會發生變化。表示遞迴展開
#########  舉例  ######### 
#
# VAR1=TMP1;
# TMP=$(VAR1)
#  VAR1=TMP2
# TMP1:=$(VAR1)
#ECHO $(TMP)  ===>顯示 TMP2
#ECHO $(TMP1)===>顯示 TMP1
#
#ARCH是定義體系結構, VIVI此處的定義是說明該VIVI是針對ARM平臺
ARCH := arm


# 這裡一處make函式的呼叫,該函式為shell,該行語句的主要作用是設定shell命令直譯器
#這條命令的作用是執行函式把結果給變數
#make函式的呼叫語法為:$()或者${}
#shell函式的作用是”執行命令,把命令的執行結果作為變數的內容“
#COMFIG_SHELL  指定命令直譯器
CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; /
 else if [ -x /bin/bash ]; then echo /bin/bash; /
 else echo sh; fi ; fi)
# 設定當前頂層目錄, 該Makefile所在目錄  shell函式的用法,把命令pwd的結果賦值給TOPDIR
TOPDIR := $(shell /bin/pwd)

#
# change this to point to the Linux include directory
#  指定LINUX核心的INCLUDE目錄,在vivi中,沒有起作用,可以刪除該語句
#
LINUX_INCLUDE_DIR = /usr/local/arm/2.95.3/include/

# 指定vivi的標頭檔案所在目錄
#
VIVIPATH           = $(TOPDIR)/include

# 定義本地的編譯器 這裡指定編譯器為gcc
HOSTCC          = gcc
#定義本地的編譯器的編譯引數,vivi的編譯需用使用arm-linux-gcc(交叉編譯器),那麼定義gcc有什麼作用?
#解答: 在一次使用make menuconfig的時候,需要使用gcc編譯menuconfig選項程式,只為配置服務。
#跳轉到scripts/lxdialog
#執行該目錄下的make all
# make menuconfig :::---->>
###跳轉到scripts/lxdialog
###執行該目錄下的make all
###make -C scripts/lxdialog all
###make[1]: Entering directory `/tmp/vivi/scripts/lxdialog' # 跳轉入目錄
###make[1]: Leaving directory `/tmp/vivi/scripts/lxdialog'  # 編譯完後,離開目錄
###/bin/sh scripts/Menuconfig arch/config.in                #執行Menuconfig arch/config.in  
###Using defaults found in .config
###Preparing scripts: functions, parsing.............done.

HOSTCFLAGS      = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer


#定義交叉編譯器的路徑,要注意一些公認的定義方法,一般CROSS_COMPILE就是交叉編譯器 ARCH就是於體系結構相關的
CROSS_COMPILE   = /usr/local/arm/2.95.3/bin/arm-linux-
#CROSS_COMPILE   = /opt/host/armv4l/bin/armv4l-redhat-linux-

#
# Include the make variables (CC, etc...)
#  定義工具鏈 tools chains
#
AS              = $(CROSS_COMPILE)as
LD              = $(CROSS_COMPILE)ld
CC              = $(CROSS_COMPILE)gcc
CPP             = $(CC) -E
AR              = $(CROSS_COMPILE)ar
NM              = $(CROSS_COMPILE)nm
STRIP           = $(CROSS_COMPILE)strip
OBJCOPY         = $(CROSS_COMPILE)objcopy
OBJDUMP         = $(CROSS_COMPILE)objdump
MAKEFILES       = $(TOPDIR)/.config
#MD5 
MD5SUM  = md5sum
# PERL   指令碼
PERL            = perl
AWK  = awk
# 匯出前邊定義的變數 主要是因為主makefile需要呼叫很多子makefile,
# 這樣匯出後,就可以讓子makefile使用這些以前定義的變量了。
export  VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE /
        CONFIG_SHELL TOPDIR VIVIPATH HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC /
 CPP AR NM STRIP OBJCOPY OBJDUMP MAKE MAKEFILES MD5SUM PERL AWK
# 定義就宣告結束了
#下邊是具體的編譯規則

相關推薦

vivi的Makefile檔案解析(1)

     這段時間學習的壓力要小的多,處理做LFS外,還編譯了vivi,vivi是mizi公司一款bootloader,總體說了,這是一個輕量級的bootloader,程式碼的規模比較小,非常適合用於學習研究,不想uboot,萬行的程式碼,不是那麼容易讀的,同時,vivi還

vue-cli生成的配置檔案解析(1)

一、前言       已經一個月沒寫部落格了。。。這一個月一直在加班,幸好手上的專案一階段也算完了,這週末也有點空閒時間了,於是好好把專案的配置檔案給解讀了一遍。這篇文章就先來解讀vue-cli生成的配置檔案中的dev-server.js吧。       從package

Mybatis原始碼分析(1)—— Mapper檔案解析

感覺CSDN對markdown的支援不夠友好,總是伴隨各種問題,很惱火! xxMapper.xml的解析主要由XMLMapperBuilder類完成,parse方法來完成解析: public void parse() { if (!configuration.isRes

JavaEE-SSM:004 Mybatis的配置檔案解析1

1.配置項:不可顛倒順序     2.Properties配置   好處就是:一處配置,多處使用。當然不嫌麻煩,直接配置,不使用property也是可以的。 在Properties下配置相關的配置Property:name是引用的時候的名稱

Android7.1 [Camera] cam_board.xml 檔案解析原始碼分析(一)

        原始碼平臺:rk3399           RK支援了很多個攝像頭,在驅動目錄hardware/rockchip/camer

系統啟動時,spring配置檔案解析失敗,報”cvc-elt.1: 找不到元素 'beans' 的宣告“異常

轉自: http://blog.163.com/[email protected]/blog/static/86556803201342210243656/ 現象:Tomcat啟動時,spring載入配置檔案applicationContext.xml出錯,丟

用C語言開發一個BT下載軟體 (四) ------ 程式碼實現-1-種子檔案解析模組

//parse_metafile.h #ifndef PARSE_METAFILE #define PARSE_METAFILE // 儲存從種子檔案中獲取的tracker的URL typedef struct _Announce_list { char ann

ibatis原始碼分析—配置檔案解析1

一、程式入口 1、目前專案中的ibatis是結合spring一起使用,採用spring的檔案配置。 <bean id="sqlMapClient"class="org.springframework.orm.ibatis.SqlMapClientFactoryB

不會解析配置檔案1秒鐘應用到專案中

記得...... 在2003年那個夜晚,我接觸到了熱血傳奇這樣一個遊戲, 從此以後我就迷失了自我,每天沉浸在傳奇的世界裡。 你是否還記得新手村的稻草人? 你是否還記得豬洞的野豬? 你是否還記得你答應我要陪我到老嗎? 你是否還記得什麼是兄弟嗎? 無兄弟不傳奇,這句話你還記得嗎? 每天八點我們會集體

Cts框架解析(1)-windows下cts配置

javac 啟動 snippet htm html stc host ech 技術分享 環境搭建 下載 cts工具的下載地址:http://source.android.com/compatibility/downloads.html

File Inclusion 代碼解析 1

require != 本地文件 簡單 刪除 配置文件 block 失敗 ado File Inclusion,意思是文件包含(漏洞),是指當服務器開啟allow_url_include選項時,就可以通過php的某些特性函數(include(),require()和inclu

thinkphp5源碼解析(1)數據庫

thinkphp源碼解析前言tp5的數據庫操作全部通過Db類完成,比較符合國人的習慣,比如簡單的Db::query()、Db::execute(),還有復雜的鏈式操作Db::table('user')->where('id=1')->select(),下面就通過源碼

視覺SLAM算法框架解析(1) PTAM

eee pla 只需要 加速計 取出 插值 比較 觀察 single   版權聲明:本文為博主原創文章,未經博主允許不得轉載。   本系列文章旨在總結主流視覺SLAM算法的框架,對比各個算法在子模塊的差異,最終提煉出融合各個算法優點的架構。   PTAM[1]是視覺

EOS智能合約案例解析(1)

EOS智能合約為了幫助大家熟悉 EOS 智能合約,EOS 官方提供了一個代幣(資產)智能合約 Demo —— eosio.token。eosio.token 智能合約目前還不是特別完善,個別功能還沒有完成。但這個示例合約給出了 EOS 官方智能合約開發的標準結構和開發方法,並且真正的 EOS 代幣也會借鑒這個

dex文件解析(1)

targe rom bject address \n mat fff ati ID CommonUtils #!/usr/bin/env python #coding:utf-8 def byte_to_buma(val): binVal = bin(val)[2

Atitit 分散式檔案系統 hdfs nfs fastfs 目錄 1. 分散式檔案系統 1 2. 什麼是FastDFS 1 2.1. FastDFS特性: 1 2.1.1. fastdfs是否可在

Atitit 分散式檔案系統 hdfs nfs fastfs   目錄 1. 分散式檔案系統 1 2. 什麼是FastDFS 1 2.1. FastDFS特性: 1 2.1.1. fastdfs是否可在windows系統下安裝?可以的話,哪位可以..._百度知道 2

nginx1-dns域名解析|nginx入門|win下搭建|配置檔案解析

DNS域名解析器 DNS,域名系統,是網際網路上作為域名和IP地址相互對映的一個分散式資料庫 目的:將域名轉化成ip 過程 ------------------本機------------------ 1.輸入網址(www.163.com) 2.瀏覽器檢查快取中有沒有這個域名

linux中/etc/passwd檔案解析

在Linux /etc/passwd檔案中每個使用者都有一個對應的記錄行,它記錄了這個使用者的一些基本屬性。系統管理員經常會接觸到這個檔案的修改以完成對使用者的管理工作。 它的內容類似下面的例子: 從上面的例子我們可以看到,/etc/passwd中一行記錄對應著一個使用者,每行記錄又被

Tomcat配置檔案解析

Tomcat作為一個開源的輕量級web容器,使用非常廣泛; 其配置檔案一般都在 server.xml中配置; server.xml中的每一個元素都對應tomcat的一個元件,位於 tomcat的conf目錄下面 一個完整的 server.xml(tomcat 7) <?xml ve

EasyUI內部CSS檔案解析

  .panel { overflow: hidden;/*溢位*/ text-align: left; margin: 0; border: 0; -moz-border-radius: 0 0 0 0; -webkit-borde