91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深入解析RK平臺編譯核心:build.sh的知識點、調(diào)試技巧與開發(fā)價值

jf_44130326 ? 來源:Linux1024 ? 2026-02-03 16:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

瑞芯微RKLinux SDK開發(fā)中,build.sh是整個編譯構(gòu)建系統(tǒng)的入口中樞”——它統(tǒng)一管理環(huán)境配置、命令解析、模塊構(gòu)建與日志輸出,幾乎所有芯片(如RK3588RV1126)的固件編譯、內(nèi)核構(gòu)建、根文件系統(tǒng)定制都依賴它啟動。

本文將從核心知識點拆解調(diào)試關(guān)鍵關(guān)注點、開發(fā)實踐意義三個維度,帶你吃透build.sh,并通過流程圖可視化其執(zhí)行邏輯。讀完本文你將掌握:

1.build.sh的核心模塊與工作原理

2.調(diào)試時如何通過build.sh定位問題;

3.掌握build.shRK平臺開發(fā)的效率提升點;

4.可視化理解RK編譯系統(tǒng)的核心執(zhí)行流程。

wKgZO2kamkCAYd1YAADG-3jVIdk814.png

一、build.sh核心知識點:拆解編譯系統(tǒng)的骨架

build.sh本質(zhì)是一個Bash腳本,但集成了RK編譯系統(tǒng)的大腦邏輯——從環(huán)境初始化到命令執(zhí)行,每一步都圍繞標準化、可擴展、易調(diào)試設(shè)計。我們按功能模塊拆解其核心知識點:

1.環(huán)境初始化:為編譯搭好舞臺

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

日志存儲目錄(按session隔離)

$RK_OUTDIR/sessions/2024-05-20_14-30-00

RK_CHIPS_DIR

多芯片配置目錄(管理RK3588/RV1126等)

$RK_SDK_DIR/device/rockchip/.chips

RK_CONFIG

編譯配置文件(存儲SDK關(guān)鍵配置)

$RK_OUTDIR/.config

RK_BUILD_HOOK_DIR

構(gòu)建鉤子腳本目錄(實現(xiàn)模塊解耦)

build-hooks

此外,check_sdk()函數(shù)會驗證SDK完整性(如檢查scripts目錄路徑是否正確),并檢測是否在sudo環(huán)境下運行——避免因權(quán)限問題導(dǎo)致的文件讀寫失敗。

2.命令解析:理解輸入執(zhí)行的邏輯

build.sh支持豐富的命令(如kernel、cleanalldefconfig:rk3588_defconfig),其解析邏輯是先分類、再驗證、后執(zhí)行

1)命令分類:按功能劃分為4大階段

通過parse_scripts()解析RK_PARSED_CMDS配置,將命令分為初始化、預(yù)編譯、編譯、后編譯4類,確保執(zhí)行順序不混亂:

?初始化階段(INIT:如chip:rk3588(選擇芯片)、defconfig:rockchip_defconfig(加載默認配置);

?預(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)核,需對應(yīng)mk-kernel.sh);

?交互命令shell(進入編譯環(huán)境shell)、edit-parts(交互修改分區(qū)表);

?芯片/配置命令rk3588:rockchip_defconfig(一鍵選擇芯片+加載配置,等價于chip:rk3588 defconfig:rockchip_defconfig)。

3)選項驗證:避免無效命令

option_check()函數(shù)會校驗輸入命令是否在支持列表中(如CMDS="$RK_INIT_CMDS $RK_PRE_BUILD_CMDS..."),若輸入./build.sh xxx(無效命令),會觸發(fā)usage打印幫助信息,降低開發(fā)誤操作。

3.鉤子機制:實現(xiàn)模塊化解耦

RK編譯系統(tǒng)支持多模塊(內(nèi)核、Buildroot、WiFi/BT)協(xié)同,核心靠run_build_hooks()實現(xiàn)的鉤子腳本機制——將不同模塊的編譯邏輯拆分為獨立.sh腳本,通過目錄優(yōu)先級控制執(zhí)行順序:

?執(zhí)行順序:芯片專屬鉤子(RK_CHIP_DIR/build-hooks)優(yōu)先于通用鉤子(RK_COMMON_DIR/build-hooks),適配不同芯片的定制化需求(如RV1126需特殊工具鏈,RK3588無需);

?鉤子階段:對應(yīng)編譯全流程,每個階段執(zhí)行對應(yīng)鉤子腳本:

?init:初始化配置(如創(chuàng)建輸出目錄);

?pre-build:預(yù)編譯準備(如下載子模塊、校驗依賴);

?build:核心編譯(如內(nèi)核、根文件系統(tǒng)構(gòu)建);

?post-build:固件打包(如生成update.img)。

例如,編譯內(nèi)核時,build-hooks/build/kernel.sh會被調(diào)用,無需在build.sh中硬編碼內(nèi)核編譯邏輯,便于后續(xù)維護與擴展。

4.日志與錯誤處理:調(diào)試的導(dǎo)航燈

build.sh的日志與錯誤處理設(shè)計,是定位問題的關(guān)鍵,核心包含3部分:

1)分級日志:顏色+類型區(qū)分重要性

通過rk_log()函數(shù)定義5級日志,終端輸出時帶顏色標識,便于快速識別信息類型:

wKgZO2kamkCAIrDmAAAelB3RiPs387.png

日志函數(shù)

顏色代碼

作用場景

示例

message

36(淺藍)

通信息(如日志路徑)

message "Log saved at /xxx"

notice

35(紫色)

重要提示(如SDK版本)

notice "Version: linux-5.10-rkr12"

warning

34(深藍)

警告(如無效session

warning "Session is invalid!"

error

91(淺紅)

錯誤(如缺工具鏈)

error "No prebuilt GCC!"

fatal

31(深紅)

致命錯誤(如SDK損壞)

fatal "SDK corrupted!"

2)日志歸檔:按session隔離,保留歷史

start_log()函數(shù)會為每個命令生成獨立日志文件(如build_2024-05-20_14-30-00.log),并軟鏈接到$RK_LOG_DIR/build.log方便查看;同時自動清理舊日志(保留最新10個),避免磁盤占用過大。

3)錯誤捕捉:打印調(diào)用棧,精準定位

通過trap 'err_handler' ERR,build.sh會捕捉所有腳本執(zhí)行錯誤(返回碼非0),并調(diào)用err_handler()打?。?/span>

?錯誤返回碼、出錯行號、出錯命令;

?完整調(diào)用棧(如build.sh: main(100) → run_build_hooks(50) → mk-kernel.sh: build(20));

例如,內(nèi)核編譯失敗時,日志會明確顯示mk-kernel.sh的第20行執(zhí)行make失敗,無需逐行排查腳本。

5.工具鏈與內(nèi)核版本:適配多平臺的關(guān)鍵

build.sh通過兩個核心函數(shù),解決多芯片、多架構(gòu)的適配問題:

?get_toolchain():自動選擇工具鏈。如X86_64主機編譯RK3588AArch64架構(gòu))時,會從prebuilts/gcc目錄找aarch64-linux-gnu-gcc;RV1126則使用定制工具鏈rockchip830;

?kernel_version():檢測內(nèi)核版本。優(yōu)先從內(nèi)核目錄名(如kernel-5.10)提取,若目錄名不標準,則解析kernel/MakefileVERSIONPATCHLEVEL(如VERSION=5PATCHLEVEL=10版本5.10)。

二、調(diào)試時關(guān)注build.sh:快速定位問題的鑰匙

開發(fā)中遇到編譯失?。ㄈ鐑?nèi)核編譯報錯、固件打包缺失),build.sh的日志、環(huán)境變量、錯誤信息是最直接的調(diào)試依據(jù)。以下是4個核心關(guān)注項:

1.優(yōu)先看日志:所有執(zhí)行細節(jié)都在RK_LOG_DIR

build.sh的日志是問題字典,調(diào)試時第一步要找到日志目錄(啟動時會打印Log saved at $RK_LOG_DIR),重點看3類文件:

?階段日志:如init.log(初始化階段)、build.log(編譯階段),記錄鉤子腳本的執(zhí)行輸出,若某鉤子失?。ㄈ?/span>kernel.sh),會在這里顯示具體錯誤(如make: *** No rule to make target 'Image');

?環(huán)境變量日志initial.env(初始環(huán)境)、final.env(最終環(huán)境),對比兩者可排查是否有環(huán)境變量被意外覆蓋(如RK_KERNEL_VERSION是否正確);

?后處理日志:若執(zhí)行post-rootfspost-rootfs.log會記錄根文件系統(tǒng)的修改(如新增/刪除的文件)。

2.錯誤時看調(diào)用棧:定位出錯的腳本與行號

當(dāng)build.sh打印fatal "ERROR: Running ... failed!"時,下方會輸出調(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.shbuild函數(shù)時,在第20行出錯。直接打開mk-kernel.sh20行,即可快速定位問題(如make命令參數(shù)錯誤)。

3.驗證命令與模塊:確保命令合法、模塊存在

若執(zhí)行./build.sh clean-xxx報錯,需檢查:

?命令是否合法:clean-xxx對應(yīng)的模塊腳本是否存在(如clean-kernelmk-kernel.sh,且腳本中含clean_hook函數(shù));

?芯片配置是否正確:若執(zhí)行./build.sh rk3588:xxx,需確認RK_CHIPS_DIR/rk3588目錄存在,且defconfigrk3588的配置列表中(參考文檔2defconfig available列表)。

4.檢查工具鏈與依賴:避免缺工具導(dǎo)致的失敗

若日志中出現(xiàn)error "No prebuilt GCC toolchain for $MODULE!",需通過get_toolchain的邏輯排查:

?架構(gòu)是否匹配:如編譯AArch64內(nèi)核,工具鏈是否為aarch64-linux-gnu-;

?工具鏈目錄是否存在:檢查$RK_SDK_DIR/prebuilts/gcc/linux-x86/aarch64是否有對應(yīng)的gcc二進制文件;

?特殊芯片適配:如RV1126需確認RK_CHIP_FAMILY是否設(shè)為rv1126_rv1109(確保加載定制工具鏈)。

三、掌握build.sh的開發(fā)意義:效率與標準化的雙重提升

build.sh不僅是編譯入口,更是RK平臺開發(fā)的效率引擎,其核心價值體現(xiàn)在3個方面:

1.標準化構(gòu)建流程:減少環(huán)境不一致問題

在多人協(xié)作或多設(shè)備開發(fā)中,最頭疼的是我這能編譯,他那編譯失敗build.sh通過:

?統(tǒng)一環(huán)境變量(如RK_SDK_DIR固定SDK根路徑);

?自動加載配置(load_configRK_CONFIG讀取關(guān)鍵參數(shù));

?標準化鉤子執(zhí)行(不同模塊按階段執(zhí)行,避免順序混亂);

確保所有開發(fā)者使用同一份規(guī)則編譯,大幅減少因環(huán)境差異導(dǎo)致的問題。

2.靈活擴展:適配定制化需求

RK平臺開發(fā)常需定制(如新增分區(qū)、修改內(nèi)核配置、集成自定義驅(qū)動),build.sh的設(shè)計讓擴展更簡單:

?新增模塊:只需在build-hooks目錄下添加xxx.sh,實現(xiàn)對應(yīng)階段的鉤子函數(shù)(如build函數(shù)),即可通過./build.sh xxx調(diào)用;

?定制芯片:在RK_CHIPS_DIR下新增芯片目錄(如rk3599),添加對應(yīng)的mk-*.sh腳本,即可支持該芯片的編譯;

?修改分區(qū):通過mod-partsedit-parts命令,無需手動修改分區(qū)表文件,交互即可完成分區(qū)增刪改(參考文檔2partition相關(guān)命令)。

3.自動化支持:集成CI/CD,提升迭代效率

build.sh的命令行接口(如./build.sh rk3588 kernel buildroot pack)可直接集成到CI/CD流程(如Jenkins、GitLab CI),實現(xiàn):

?代碼提交后自動編譯,及時發(fā)現(xiàn)編譯錯誤;

?自動生成固件和日志,無需人工干預(yù);

?多芯片并行編譯(如同時構(gòu)建RK3588RV1126的固件)。

四、build.sh核心執(zhí)行流程:可視化理解

為更直觀掌握build.sh的工作邏輯,我們用流程圖(基于Mermaid)展示從啟動到執(zhí)行完成的核心步驟:

wKgZO2kamkCABR86AAGrAWm5V3A982.png

總結(jié):build.shRK開發(fā)的入門鑰匙

build.sh作為RK平臺編譯系統(tǒng)的核心入口,不僅承擔(dān)命令分發(fā)的角色,更通過標準化環(huán)境、模塊化鉤子、詳細日志,解決了多芯片適配、多模塊協(xié)作、調(diào)試效率低等關(guān)鍵問題。

對于開發(fā)者而言:

?新手掌握它,能快速上手RK編譯流程,減少踩坑時間;

?老手吃透它,能靈活擴展編譯功能(如新增模塊、定制流程),提升開發(fā)效率;

?調(diào)試時依賴它,能通過日志和調(diào)用棧快速定位問題,避免無頭蒼蠅式排查。

掌握build.sh,就掌握了RK平臺開發(fā)的主動權(quán)”——無論是日常編譯、問題調(diào)試,還是定制化開發(fā),都能游刃有余。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11756

    瀏覽量

    218995
  • 調(diào)試
    +關(guān)注

    關(guān)注

    7

    文章

    646

    瀏覽量

    35633
  • 瑞芯微
    +關(guān)注

    關(guān)注

    27

    文章

    790

    瀏覽量

    54255
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    如何讓OpenHarmony編譯速度“狂飆”

    OpenHarmony 有兩種編譯方式,一種是通過 hb 工具編譯,一種是通過 build.sh 腳本編譯。本文筆者將提升 build.sh
    的頭像 發(fā)表于 02-14 09:31 ?2756次閱讀

    鴻蒙OpenHarmony【輕量系統(tǒng) 編譯】 (基于Hi3861開發(fā)板)

    OpenHarmony支持hb和build.sh兩種編譯方式。此處介紹hb方式,build.sh腳本編譯方式請參考[使用build.sh腳本
    的頭像 發(fā)表于 05-14 17:53 ?2593次閱讀
    鴻蒙OpenHarmony【輕量系統(tǒng) <b class='flag-5'>編譯</b>】 (基于Hi3861<b class='flag-5'>開發(fā)</b>板)

    鴻蒙OpenHarmony【小型系統(tǒng) 編譯】(基于Hi3516開發(fā)板)

    OpenHarmony支持hb和build.sh兩種編譯方式。此處介紹hb方式,build.sh腳本編譯方式請參考[使用build.sh腳本
    的頭像 發(fā)表于 05-10 15:59 ?1545次閱讀
    鴻蒙OpenHarmony【小型系統(tǒng) <b class='flag-5'>編譯</b>】(基于Hi3516<b class='flag-5'>開發(fā)</b>板)

    鴻蒙ArkUI-X框架開發(fā):【編譯

    使用build.sh編譯腳本進行編譯,編譯腳本常用選項
    的頭像 發(fā)表于 05-25 16:42 ?2574次閱讀
    鴻蒙ArkUI-X框架<b class='flag-5'>開發(fā)</b>:【<b class='flag-5'>編譯</b>】

    迅為RK3568開發(fā)板篇OpenHarmony實操HDF驅(qū)動配置LED-編譯源碼

    重新編譯 Openharmony4.1 源碼,如下所示: ./build.sh --product-name rk3568 --ccache 或者單獨編譯部件 ./
    發(fā)表于 02-10 10:23

    使用build.sh腳本編譯時出現(xiàn)錯誤該怎么辦

    直接使用build.sh腳本一起編譯的時候出現(xiàn)下面的錯誤:百度了一下 make distclean 后再編譯還是報錯,有沒有技術(shù)支持幫忙看一下這個問題咋解決fakeroot: preload
    發(fā)表于 01-04 07:55

    ._build.sh 失敗怎么解決?

    make distclean,后面再./build.sh的話,很容易出現(xiàn)上述問題(我這邊出現(xiàn)3次了),那不是說,只要小改一代碼,都很可能要makedistclean,再來一遍,這個時間,長。。。
    發(fā)表于 01-05 06:17

    build.sh失敗該怎樣去解決呢

    make distclean,后面再./build.sh的話,很容易出現(xiàn)上述問題(我這邊出現(xiàn)3次了),那不是說,只要小改一代碼,都很可能要makedistclean,再來一遍,這個時間,長。。。
    發(fā)表于 01-13 08:48

    ROC-RK3308主板CC固件編譯知識點解析,絕對實用

    ROC-RK3308主板CC固件編譯知識點解析,絕對實用
    發(fā)表于 03-09 07:29

    淺析RK3308開發(fā)板固件編譯的方法及其步驟

    上使用以下命令:./build.sh路徑:Y:\\hxy\\RK3308\\sdk-1.5\\device\\rockchip\\common(全自動化編譯腳本原始文件)Y:\\hxy\\RK
    發(fā)表于 09-29 15:56

    【飛凌RK3588開發(fā)板試用】源碼編譯

    編譯前配置在 device/forlinux/rk3588/目錄下,有不同板型的配置文件。選擇配置文件進行編譯:$./build.sh
    發(fā)表于 03-28 22:32

    toybrick_RK3568X開發(fā)板:瑞芯微 SDK 編譯 android 過程

    toybrick_RK3568X開發(fā)編譯android 命令如下: source build/envsetup.sh lunch
    發(fā)表于 11-17 23:40

    鴻蒙OpenHarmony【標準系統(tǒng) 編譯】(基于RK3568開發(fā)板)

    OpenHarmony支持hb和build.sh兩種編譯方式。此處介紹hb方式,build.sh腳本編譯方式請參考[使用build.sh腳本
    的頭像 發(fā)表于 05-08 17:37 ?3000次閱讀
    鴻蒙OpenHarmony【標準系統(tǒng) <b class='flag-5'>編譯</b>】(基于<b class='flag-5'>RK</b>3568<b class='flag-5'>開發(fā)</b>板)

    基于RK3576開發(fā)板的多路網(wǎng)絡(luò)攝像頭取流方案

    環(huán)境。接著,通過編譯腳本build.sh進行例程編譯,并運行示例程序。方案設(shè)計包含四大邏輯模塊:啟動、取流解碼、算法分析和顯示邏輯,相關(guān)代碼均位于指定目錄中。開發(fā)指南詳細介紹了Tool
    的頭像 發(fā)表于 05-13 11:14 ?1863次閱讀
    基于<b class='flag-5'>RK</b>3576<b class='flag-5'>開發(fā)</b>板的多路網(wǎng)絡(luò)攝像頭取流方案

    深入解析U-Boot命令處理核心文件:功能、調(diào)試開發(fā)價值

    在嵌入式系統(tǒng)開發(fā)中,U-Boot 作為主流的引導(dǎo)加載程序,其命令處理、交互邏輯和自動啟動流程是核心功能模塊。本文將圍繞command.c、cli.c和autoboot.c三個關(guān)鍵文件,從核心知識點
    的頭像 發(fā)表于 02-03 15:44 ?870次閱讀
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b>U-Boot命令處理<b class='flag-5'>核心</b>文件:功能、<b class='flag-5'>調(diào)試</b>與<b class='flag-5'>開發(fā)價值</b>