一文講解Linux內(nèi)核Makefile執(zhí)行流程
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)依賴(lài)文件
(5) 根據(jù)文件時(shí)間戳、中間文件(.d、.cmd),判斷依賴(lài)更新,決定是否需要重新編譯
(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)
$<:依賴(lài)列表中的第一個(gè)依賴(lài)對(duì)象
$^:依賴(lài)列表中的所有對(duì)象
$?:依賴(lài)文件列表中所有有更新的文件
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)稱(chē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ì)流程

【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個(gè)人覺(jué)得比較好的學(xué)習(xí)書(shū)籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!?。。ê曨l教程、電子書(shū)、實(shí)戰(zhàn)項(xiàng)目及代碼)? ? ?


零聲白金VIP體驗(yàn)卡(含基礎(chǔ)架構(gòu)/高性能存儲(chǔ)/golang/QT/音視頻/Linux內(nèi)核)課程:?

三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)間接依賴(lài)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)

原文作者:看雪學(xué)苑
