Openwrt實踐過程--編譯過程

1.注意點

a.make -n可打印makefile執行的命令,而不執行
b.在規則的命令中增加echo跟蹤執行進度

2.頂層Makefile分析

第一個編譯目標world是make的默認編譯目標
編譯簡單可劃分爲兩個邏輯:

world:
ifndef ($(OPENWRT_BUILD),1)
# 第一邏輯
else
# 第二邏輯
endif

第一邏輯
make V=99時,OPENWRTBUILDmakeworldOPENWRT_BUILD沒有定義賦值,所以總是執行“第一邏輯”,“第一邏輯”結束時再次執行make world,此時OPENWRT_BUILD=1,所以執行“第二邏輯”。toplevel.mk中%::解釋world目標的規則。

第二邏輯
首先就引入了target, package, tools, toolchain這四個關鍵目錄裏的Makefile文件。

include target/Makefile
include package/Makefile
include tools/Makefile
include toolchain/Makefile

這些子目錄裏的Makefile使用include/subdir.mk裏定義的兩個函數來動態生成規則,這兩個函數是subdir和stampfile。 subdir會遍歷參數子目錄,執行make -C操作。stampfile可以簡單的看作:

對於target分別生成了:$(target/stamp-prereq), $(target/stamp-compile), $(target/stamp-install)
對於toolchain分別生成了 : $(toolchain/stamp-install)
對於package分別生成了: $(package/stamp-prereq),$(package/stamp-cleanup), $(package/stamp-compile),$(package/stamp-install)
對於tools分別生成了 : $(tools/stamp-install)

依賴關係如下:

$(toolchain/stamp-install): $(tools/stamp-install)
$(target/stamp-compile): $(toolchain/stamp-install) $(tools/stamp-install) $(BUILD_DIR)/.prepared
$(package/stamp-compile): $(target/stamp-compile) $(package/stamp-cleanup)
$(package/stamp-install): $(package/stamp-compile)
$(target/stamp-install): $(package/stamp-compile) $(package/stamp-install)

基本上就是toolchain依賴tools,target依賴toolchain,package依賴target,最後target/stamp-install依賴package。

3.kernel編譯

編譯kernel時clean/prepare/compile/install目標規則出現,涉及的Makefile包括:include/kernel-build.mk,include/kernel-defaults.mk。

4.firmware編譯

firmware由kernel和rootfs兩個部分組成,要對兩個部分先分別處理,然後再合併成一個.bin文件。target/linux/xxxx/image/Makefile中最後定義了生成image的規則:$(eval $(call BuildImage)),本文件中也定義了生成Image鏡像(包含ubifs鏡像)的規則,編譯kernel的compile或install時也會執行image下的compile和install。include/image.mk定義BuildImage命令包。

kernel處理

install–>kernel_prepare -->mkfs_prepare -->image_prepare --> $(call Image/Prepare)
主要處理命令包爲:Image/BuildKernel,將設備樹和鏡像打包成鏡像樹文件:
define Image/BuildKernel

rootfs處理

生成squashfs文件系統鏡像
install–>kernel_prepare -->mkfs_prepare -->(callImage/mkfs/prepare)install>kernelprepare>(call Image/mkfs/prepare) install-->kernel_prepare -->(call BuildImage/mkfs,$(fs))

鏡像打包

install --> $(call Image/mkfs/ubifs)

溫馨提示:
以上文章描述如有不清晰之處,歡迎在評論區評論,如有時間,會第一時間回覆,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章