在瑞芯微(RK)Linux SDK開發(fā)中,build.sh是整個(gè)編譯構(gòu)建系統(tǒng)的“入口中樞”——它統(tǒng)一管理環(huán)境配置、命令解析、模塊構(gòu)建與日志輸出,幾乎所有芯片(如RK3588、RV1126)的固件編譯、內(nèi)核構(gòu)建、根文件系統(tǒng)定制都依賴它啟動(dòng)。
本文將從核心知識(shí)點(diǎn)拆解、調(diào)試關(guān)鍵關(guān)注點(diǎn)、開發(fā)實(shí)踐意義三個(gè)維度,帶你吃透build.sh,并通過流程圖可視化其執(zhí)行邏輯。讀完本文你將掌握:
1.build.sh的核心模塊與工作原理;
2.調(diào)試時(shí)如何通過build.sh定位問題;
3.掌握build.sh對(duì)RK平臺(tái)開發(fā)的效率提升點(diǎn);
4.可視化理解RK編譯系統(tǒng)的核心執(zhí)行流程。

一、build.sh核心知識(shí)點(diǎn):拆解編譯系統(tǒng)的“骨架”
build.sh本質(zhì)是一個(gè)Bash腳本,但集成了RK編譯系統(tǒng)的“大腦”邏輯——從環(huán)境初始化到命令執(zhí)行,每一步都圍繞“標(biāo)準(zhǔn)化、可擴(kuò)展、易調(diào)試”設(shè)計(jì)。我們按功能模塊拆解其核心知識(shí)點(diǎn):
1.環(huán)境初始化:為編譯“搭好舞臺(tái)”
setup_environments()函數(shù)是編譯的“地基”,它通過導(dǎo)出全局環(huán)境變量,統(tǒng)一SDK各模塊的路徑與配置,避免因路徑混亂導(dǎo)致的編譯失敗。核心變量及作用如下:
|
環(huán)境變量
|
作用說明
|
關(guān)鍵值示例
|
|
RK_SDK_DIR
|
SDK根目錄(最核心路徑)
|
/home/user/rk3588_linux
|
|
RK_OUTDIR
|
編譯輸出目錄(固件、日志、配置存這里)
|
$RK_SDK_DIR/output
|
|
RK_LOG_DIR
|
日志存儲(chǔ)目錄(按session隔離)
|
$RK_OUTDIR/sessions/2024-05-20_14-30-00
|
|
RK_CHIPS_DIR
|
多芯片配置目錄(管理RK3588/RV1126等)
|
$RK_SDK_DIR/device/rockchip/.chips
|
|
RK_CONFIG
|
編譯配置文件(存儲(chǔ)SDK關(guān)鍵配置)
|
$RK_OUTDIR/.config
|
|
RK_BUILD_HOOK_DIR
|
構(gòu)建鉤子腳本目錄(實(shí)現(xiàn)模塊解耦)
|
build-hooks
|
此外,check_sdk()函數(shù)會(huì)驗(yàn)證SDK完整性(如檢查scripts目錄路徑是否正確),并檢測是否在sudo環(huán)境下運(yùn)行——避免因權(quán)限問題導(dǎo)致的文件讀寫失敗。
2.命令解析:理解“輸入→執(zhí)行”的邏輯
build.sh支持豐富的命令(如kernel、cleanall、defconfig:rk3588_defconfig),其解析邏輯是“先分類、再驗(yàn)證、后執(zhí)行”:
(1)命令分類:按功能劃分為4大階段
通過parse_scripts()解析RK_PARSED_CMDS配置,將命令分為初始化、預(yù)編譯、編譯、后編譯4類,確保執(zhí)行順序不混亂:
?初始化階段(INIT):如chip:rk3588(選擇芯片)、defconfig:rockchip_defconfig(加載默認(rèn)配置);
?預(yù)編譯階段(PRE-BUILD):如menuconfig(修改內(nèi)核配置)、kernel-config(定制內(nèi)核);
?編譯階段(BUILD):如kernel(編譯內(nèi)核)、buildroot-make(編譯根文件系統(tǒng));
?后編譯階段(POST-BUILD):如pack(打包固件)、post-rootfs(根文件系統(tǒng)后處理)。
(2)特殊命令處理
從代碼和--help輸出(文檔2)中,可提煉高頻特殊命令:
?清理命令:cleanall(清理所有編譯產(chǎn)物)、clean-kernel(僅清理內(nèi)核,需對(duì)應(yīng)mk-kernel.sh);
?交互命令:shell(進(jìn)入編譯環(huán)境shell)、edit-parts(交互修改分區(qū)表);
?芯片/配置命令:rk3588:rockchip_defconfig(一鍵選擇芯片+加載配置,等價(jià)于chip:rk3588 defconfig:rockchip_defconfig)。
(3)選項(xiàng)驗(yàn)證:避免無效命令
option_check()函數(shù)會(huì)校驗(yàn)輸入命令是否在支持列表中(如CMDS="$RK_INIT_CMDS $RK_PRE_BUILD_CMDS..."),若輸入./build.sh xxx(無效命令),會(huì)觸發(fā)usage打印幫助信息,降低開發(fā)誤操作。
3.鉤子機(jī)制:實(shí)現(xiàn)“模塊化解耦”
RK編譯系統(tǒng)支持多模塊(內(nèi)核、Buildroot、WiFi/BT)協(xié)同,核心靠run_build_hooks()實(shí)現(xiàn)的鉤子腳本機(jī)制——將不同模塊的編譯邏輯拆分為獨(dú)立.sh腳本,通過“目錄優(yōu)先級(jí)”控制執(zhí)行順序:
?執(zhí)行順序:芯片專屬鉤子(RK_CHIP_DIR/build-hooks)優(yōu)先于通用鉤子(RK_COMMON_DIR/build-hooks),適配不同芯片的定制化需求(如RV1126需特殊工具鏈,RK3588無需);
?鉤子階段:對(duì)應(yīng)編譯全流程,每個(gè)階段執(zhí)行對(duì)應(yīng)鉤子腳本:
?init:初始化配置(如創(chuàng)建輸出目錄);
?pre-build:預(yù)編譯準(zhǔn)備(如下載子模塊、校驗(yàn)依賴);
?build:核心編譯(如內(nèi)核、根文件系統(tǒng)構(gòu)建);
?post-build:固件打包(如生成update.img)。
例如,編譯內(nèi)核時(shí),build-hooks/build/kernel.sh會(huì)被調(diào)用,無需在build.sh中硬編碼內(nèi)核編譯邏輯,便于后續(xù)維護(hù)與擴(kuò)展。
4.日志與錯(cuò)誤處理:調(diào)試的“導(dǎo)航燈”
build.sh的日志與錯(cuò)誤處理設(shè)計(jì),是定位問題的關(guān)鍵,核心包含3部分:
(1)分級(jí)日志:顏色+類型區(qū)分重要性
通過rk_log()函數(shù)定義5級(jí)日志,終端輸出時(shí)帶顏色標(biāo)識(shí),便于快速識(shí)別信息類型:

|
日志函數(shù)
|
顏色代碼
|
作用場景
|
示例
|
|
message
|
36(淺藍(lán))
|
普通信息(如日志路徑)
|
message "Log saved at /xxx"
|
|
notice
|
35(紫色)
|
重要提示(如SDK版本)
|
notice "Version: linux-5.10-rkr12"
|
|
warning
|
34(深藍(lán))
|
警告(如無效session)
|
warning "Session is invalid!"
|
|
error
|
91(淺紅)
|
錯(cuò)誤(如缺工具鏈)
|
error "No prebuilt GCC!"
|
|
fatal
|
31(深紅)
|
致命錯(cuò)誤(如SDK損壞)
|
fatal "SDK corrupted!"
|
(2)日志歸檔:按session隔離,保留歷史
start_log()函數(shù)會(huì)為每個(gè)命令生成獨(dú)立日志文件(如build_2024-05-20_14-30-00.log),并軟鏈接到$RK_LOG_DIR/build.log方便查看;同時(shí)自動(dòng)清理舊日志(保留最新10個(gè)),避免磁盤占用過大。
(3)錯(cuò)誤捕捉:打印調(diào)用棧,精準(zhǔn)定位
通過trap 'err_handler' ERR,build.sh會(huì)捕捉所有腳本執(zhí)行錯(cuò)誤(返回碼非0),并調(diào)用err_handler()打?。?/span>
?錯(cuò)誤返回碼、出錯(cuò)行號(hào)、出錯(cuò)命令;
?完整調(diào)用棧(如build.sh: main(100) → run_build_hooks(50) → mk-kernel.sh: build(20));
例如,內(nèi)核編譯失敗時(shí),日志會(huì)明確顯示“在mk-kernel.sh的第20行執(zhí)行make失敗”,無需逐行排查腳本。
5.工具鏈與內(nèi)核版本:適配多平臺(tái)的關(guān)鍵
build.sh通過兩個(gè)核心函數(shù),解決“多芯片、多架構(gòu)”的適配問題:
?get_toolchain():自動(dòng)選擇工具鏈。如X86_64主機(jī)編譯RK3588(AArch64架構(gòu))時(shí),會(huì)從prebuilts/gcc目錄找aarch64-linux-gnu-gcc;RV1126則使用定制工具鏈rockchip830;
?kernel_version():檢測內(nèi)核版本。優(yōu)先從內(nèi)核目錄名(如kernel-5.10)提取,若目錄名不標(biāo)準(zhǔn),則解析kernel/Makefile的VERSION和PATCHLEVEL(如VERSION=5、PATCHLEVEL=10→版本5.10)。
二、調(diào)試時(shí)關(guān)注build.sh:快速定位問題的“鑰匙”
開發(fā)中遇到編譯失敗(如內(nèi)核編譯報(bào)錯(cuò)、固件打包缺失),build.sh的日志、環(huán)境變量、錯(cuò)誤信息是最直接的調(diào)試依據(jù)。以下是4個(gè)核心關(guān)注項(xiàng):
1.優(yōu)先看日志:所有執(zhí)行細(xì)節(jié)都在RK_LOG_DIR
build.sh的日志是“問題字典”,調(diào)試時(shí)第一步要找到日志目錄(啟動(dòng)時(shí)會(huì)打印Log saved at $RK_LOG_DIR),重點(diǎn)看3類文件:
?階段日志:如init.log(初始化階段)、build.log(編譯階段),記錄鉤子腳本的執(zhí)行輸出,若某鉤子失?。ㄈ?/span>kernel.sh),會(huì)在這里顯示具體錯(cuò)誤(如make: *** No rule to make target 'Image');
?環(huán)境變量日志:initial.env(初始環(huán)境)、final.env(最終環(huán)境),對(duì)比兩者可排查是否有環(huán)境變量被意外覆蓋(如RK_KERNEL_VERSION是否正確);
?后處理日志:若執(zhí)行post-rootfs,post-rootfs.log會(huì)記錄根文件系統(tǒng)的修改(如新增/刪除的文件)。
2.錯(cuò)誤時(shí)看調(diào)用棧:定位出錯(cuò)的腳本與行號(hào)
當(dāng)build.sh打印fatal "ERROR: Running ... failed!"時(shí),下方會(huì)輸出調(diào)用棧,例如:
|
fatal "ERROR: call stack:"
fatal " build.sh: run_build_hooks(250)"
fatal " build.sh: main(300)"
fatal " mk-kernel.sh: build(20)"
|
這表明:main函數(shù)調(diào)用run_build_hooks,后者執(zhí)行mk-kernel.sh的build函數(shù)時(shí),在第20行出錯(cuò)。直接打開mk-kernel.sh第20行,即可快速定位問題(如make命令參數(shù)錯(cuò)誤)。
3.驗(yàn)證命令與模塊:確保命令合法、模塊存在
若執(zhí)行./build.sh clean-xxx報(bào)錯(cuò),需檢查:
?命令是否合法:clean-xxx對(duì)應(yīng)的模塊腳本是否存在(如clean-kernel需mk-kernel.sh,且腳本中含clean_hook函數(shù));
?芯片配置是否正確:若執(zhí)行./build.sh rk3588:xxx,需確認(rèn)RK_CHIPS_DIR/rk3588目錄存在,且defconfig在rk3588的配置列表中(參考文檔2的defconfig available列表)。
4.檢查工具鏈與依賴:避免“缺工具”導(dǎo)致的失敗
若日志中出現(xiàn)error "No prebuilt GCC toolchain for $MODULE!",需通過get_toolchain的邏輯排查:
?架構(gòu)是否匹配:如編譯AArch64內(nèi)核,工具鏈?zhǔn)欠駷?/span>aarch64-linux-gnu-;
?工具鏈目錄是否存在:檢查$RK_SDK_DIR/prebuilts/gcc/linux-x86/aarch64是否有對(duì)應(yīng)的gcc二進(jìn)制文件;
?特殊芯片適配:如RV1126需確認(rèn)RK_CHIP_FAMILY是否設(shè)為rv1126_rv1109(確保加載定制工具鏈)。
三、掌握build.sh的開發(fā)意義:效率與標(biāo)準(zhǔn)化的雙重提升
build.sh不僅是“編譯入口”,更是RK平臺(tái)開發(fā)的“效率引擎”,其核心價(jià)值體現(xiàn)在3個(gè)方面:
1.標(biāo)準(zhǔn)化構(gòu)建流程:減少“環(huán)境不一致”問題
在多人協(xié)作或多設(shè)備開發(fā)中,最頭疼的是“我這能編譯,他那編譯失敗”。build.sh通過:
?統(tǒng)一環(huán)境變量(如RK_SDK_DIR固定SDK根路徑);
?自動(dòng)加載配置(load_config從RK_CONFIG讀取關(guān)鍵參數(shù));
?標(biāo)準(zhǔn)化鉤子執(zhí)行(不同模塊按階段執(zhí)行,避免順序混亂);
確保所有開發(fā)者使用“同一份規(guī)則”編譯,大幅減少因環(huán)境差異導(dǎo)致的問題。
2.靈活擴(kuò)展:適配定制化需求
RK平臺(tái)開發(fā)常需定制(如新增分區(qū)、修改內(nèi)核配置、集成自定義驅(qū)動(dòng)),build.sh的設(shè)計(jì)讓擴(kuò)展更簡單:
?新增模塊:只需在build-hooks目錄下添加xxx.sh,實(shí)現(xiàn)對(duì)應(yīng)階段的鉤子函數(shù)(如build函數(shù)),即可通過./build.sh xxx調(diào)用;
?定制芯片:在RK_CHIPS_DIR下新增芯片目錄(如rk3599),添加對(duì)應(yīng)的mk-*.sh腳本,即可支持該芯片的編譯;
?修改分區(qū):通過mod-parts或edit-parts命令,無需手動(dòng)修改分區(qū)表文件,交互即可完成分區(qū)增刪改(參考文檔2的partition相關(guān)命令)。
3.自動(dòng)化支持:集成CI/CD,提升迭代效率
build.sh的命令行接口(如./build.sh rk3588 kernel buildroot pack)可直接集成到CI/CD流程(如Jenkins、GitLab CI),實(shí)現(xiàn):
?代碼提交后自動(dòng)編譯,及時(shí)發(fā)現(xiàn)編譯錯(cuò)誤;
?自動(dòng)生成固件和日志,無需人工干預(yù);
?多芯片并行編譯(如同時(shí)構(gòu)建RK3588和RV1126的固件)。
四、build.sh核心執(zhí)行流程:可視化理解
為更直觀掌握build.sh的工作邏輯,我們用流程圖(基于Mermaid)展示從啟動(dòng)到執(zhí)行完成的核心步驟:

總結(jié):build.sh是RK開發(fā)的“入門鑰匙”
build.sh作為RK平臺(tái)編譯系統(tǒng)的核心入口,不僅承擔(dān)“命令分發(fā)”的角色,更通過標(biāo)準(zhǔn)化環(huán)境、模塊化鉤子、詳細(xì)日志,解決了多芯片適配、多模塊協(xié)作、調(diào)試效率低等關(guān)鍵問題。
對(duì)于開發(fā)者而言:
?新手掌握它,能快速上手RK編譯流程,減少“踩坑”時(shí)間;
?老手吃透它,能靈活擴(kuò)展編譯功能(如新增模塊、定制流程),提升開發(fā)效率;
?調(diào)試時(shí)依賴它,能通過日志和調(diào)用棧快速定位問題,避免“無頭蒼蠅式”排查。
掌握build.sh,就掌握了RK平臺(tái)開發(fā)的“主動(dòng)權(quán)”——無論是日常編譯、問題調(diào)試,還是定制化開發(fā),都能游刃有余。
-
Linux
+關(guān)注
關(guān)注
88文章
11758瀏覽量
219004 -
調(diào)試
+關(guān)注
關(guān)注
7文章
646瀏覽量
35648 -
瑞芯微
+關(guān)注
關(guān)注
27文章
792瀏覽量
54277
發(fā)布評(píng)論請(qǐng)先 登錄
如何讓OpenHarmony編譯速度“狂飆”
鴻蒙OpenHarmony【輕量系統(tǒng) 編譯】 (基于Hi3861開發(fā)板)
鴻蒙OpenHarmony【小型系統(tǒng) 編譯】(基于Hi3516開發(fā)板)
迅為RK3568開發(fā)板篇OpenHarmony實(shí)操HDF驅(qū)動(dòng)配置LED-編譯源碼
使用build.sh腳本編譯時(shí)出現(xiàn)錯(cuò)誤該怎么辦
._build.sh 失敗怎么解決?
build.sh失敗該怎樣去解決呢
ROC-RK3308主板CC固件編譯的知識(shí)點(diǎn)解析,絕對(duì)實(shí)用
淺析RK3308開發(fā)板固件編譯的方法及其步驟
【飛凌RK3588開發(fā)板試用】源碼編譯
toybrick_RK3568X開發(fā)板:瑞芯微 SDK 編譯 android 過程
鴻蒙OpenHarmony【標(biāo)準(zhǔn)系統(tǒng) 編譯】(基于RK3568開發(fā)板)
基于RK3576開發(fā)板的多路網(wǎng)絡(luò)攝像頭取流方案
深入解析U-Boot命令處理核心文件:功能、調(diào)試與開發(fā)價(jià)值
深入解析RK平臺(tái)編譯核心:build.sh的知識(shí)點(diǎn)、調(diào)試技巧與開發(fā)價(jià)值
評(píng)論