Openwrt實踐過程--編譯過程
1.注意點
a.make -n可打印makefile執行的命令,而不執行
b.在規則的命令中增加echo跟蹤執行進度
2.頂層Makefile分析
第一個編譯目標world是make的默認編譯目標
編譯簡單可劃分爲兩個邏輯:
world:
ifndef ($(OPENWRT_BUILD),1)
# 第一邏輯
else
# 第二邏輯
endif
第一邏輯
make V=99時,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 -->(call BuildImage/mkfs,$(fs))
鏡像打包
install --> $(call Image/mkfs/ubifs)
溫馨提示:
以上文章描述如有不清晰之處,歡迎在評論區評論,如有時間,會第一時間回覆,謝謝!