
一必備知識(shí)
(資料圖)
1.1. Makefile基礎(chǔ)語(yǔ)法
如果還不熟悉Makefile語(yǔ)法,建議先系統(tǒng)的學(xué)習(xí)一下,特別是以下幾點(diǎn):
(1) Makefile哪些部分包含的是shell語(yǔ)句:
編譯規(guī)則中的指令部分{shell XX},var != XX中的XX部分(if …, XX, XX)中的XX部分
(2) 變量展開(kāi): =(延遲賦值)、:=(立即賦值)、!=(值為shell命令)、?=(條件賦值)、+=(追加)
(3) include:將指定的其它Makefile內(nèi)容,展開(kāi)到當(dāng)前Makefile
-f/-C:嵌套執(zhí)行指定(目錄中的)Makefile
執(zhí)行一個(gè)Makefile,并不是從第一行開(kāi)始執(zhí)行,而是從指定或默認(rèn)的編譯目標(biāo)開(kāi)始執(zhí)行(位置目標(biāo)編譯規(guī)則之前的賦值語(yǔ)句,只在相應(yīng)變量需要被使用時(shí)才會(huì)執(zhí)行),其中,Makefile(包括include內(nèi)容)中的第一個(gè)目標(biāo),為默認(rèn)目標(biāo),如果make命令行中沒(méi)有指定編譯目標(biāo),則執(zhí)行默認(rèn)目標(biāo)。
(4) 自動(dòng)推導(dǎo)依賴文件
(5) 根據(jù)文件時(shí)間戳、中間文件(.d、.cmd),判斷依賴更新,決定是否需要重新編譯
(6) 重要的內(nèi)置函數(shù):
(wildcard pattern)(patsubst pattern, replacement, text)(strip string)(filter pattern, text)(filter-out pattern, text)(call func, args..) …
(7) 自動(dòng)推導(dǎo)變量:
@:編譯目標(biāo)<:依賴列表中的第一個(gè)依賴對(duì)象^:依賴列表中的所有對(duì)象?:依賴文件列表中所有有更新的文件
Makefile教程可以參考以下個(gè):
跟我一起寫makefile(陳皓):Make 命令教程 | 手把手帶你入門 Makefile (精典,超級(jí)詳細(xì))
1.2. Kbuild內(nèi)置函數(shù)
Linux內(nèi)核源碼包含一套Makefile程序,本文基于Linux-5.2.5內(nèi)核源碼分析,其中包括top Makefile,scripts/目錄下的Makefile、Makefile.build、Makefile.lib、Kbuild.include、Makefile.modpost、kconfig/Makefile等,以及其它目錄下的很多子Makefile,統(tǒng)稱為Kbuild。
Kbuild是按照框架設(shè)計(jì)思路實(shí)現(xiàn)的,使得內(nèi)核自身包含或外部提供的大量驅(qū)動(dòng)模塊,只需要按照Kbuild框架的約定,各自提供一個(gè)簡(jiǎn)單的Makefile即可編譯。
所以,理解內(nèi)核或驅(qū)動(dòng)文件的編譯過(guò)程,其實(shí)就是要理解Kbuild這套Makefile程序的實(shí)現(xiàn)邏輯,既然是程序,就免不了會(huì)定義一些函數(shù),由于很多關(guān)鍵的流程,都使用了(build)和(if_changed),所以以下先單獨(dú)介紹(本文分析的Makefile內(nèi)容,來(lái)自Linux-5.2.5內(nèi)核源碼):
1.2.1. $(build)
使用形式:(Q)(MAKE) $(build)=xx目錄 [編譯目標(biāo)]
build內(nèi)部過(guò)程
build作用概括
以下是$(build)的使用形式,以及每個(gè)部分的作用:
1.2.2. $(if_changed)
使用形式:$(call if_changed, xx)
if_changed內(nèi)部過(guò)程
if_changed作用概括
以下是$(if_changed)的使用形式,及其參數(shù)的含義:
二編譯外部模塊
2.1. 涉及Makefile內(nèi)容
2.2. 概要流程
2.3. 詳細(xì)流程
三make menuconfig
3.1. 涉及Makefile內(nèi)容
3.2. 概要流程
3.3. 詳細(xì)流程
四Make [all/_all/modules]
4.1. 涉及Makefile內(nèi)容
make命令行指定all/_all/modules目標(biāo),或者不指定目標(biāo)時(shí),是為了生成vmlinux文件,而vmlinux目標(biāo)間接依賴prepare目標(biāo),且prepare目標(biāo)編譯規(guī)則展開(kāi)內(nèi)容比較多,所以以下分開(kāi)介紹:
vmlinux目標(biāo)
prepare目標(biāo)
4.2. 概要流程
vmlinux目標(biāo)
prepare目標(biāo)
4.3. 詳細(xì)流程
vmlinux目標(biāo)
vmlinuz目標(biāo)
prepare目標(biāo)
審核編輯:湯梓紅
標(biāo)簽: