chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

2.調試時如何通過build.sh定位問題;

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

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

wKgZO2kamkCAYd1YAADG-3jVIdk814.png

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

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

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

setup_environments()函數是編譯的地基,它通過導出全局環(huán)境變量,統(tǒng)一SDK各模塊的路徑與配置,避免因路徑混亂導致的編譯失敗。核心變量及作用如下:

環(huá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關鍵配置)

$RK_OUTDIR/.config

RK_BUILD_HOOK_DIR

構建鉤子腳本目錄(實現模塊解耦)

build-hooks

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

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

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

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

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

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

?預編譯階段(PRE-BUILD:如menuconfig(修改內核配置)、kernel-config(定制內核);

?編譯階段(BUILD:如kernel(編譯內核)、buildroot-make(編譯根文件系統(tǒng));

?后編譯階段(POST-BUILD:如pack(打包固件)、post-rootfs(根文件系統(tǒng)后處理)。

2)特殊命令處理

從代碼和--help輸出(文檔2)中,可提煉高頻特殊命令:

?清理命令cleanall(清理所有編譯產物)、clean-kernel(僅清理內核,需對應mk-kernel.sh);

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

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

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

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

3.鉤子機制:實現模塊化解耦

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

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

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

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

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

?build:核心編譯(如內核、根文件系統(tǒng)構建);

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

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

4.日志與錯誤處理:調試的導航燈

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

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

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

wKgZO2kamkCAIrDmAAAelB3RiPs387.png

日志函數

顏色代碼

作用場景

示例

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

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

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

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

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

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

5.工具鏈與內核版本:適配多平臺的關鍵

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

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

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

二、調試時關注build.sh:快速定位問題的鑰匙

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

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

build.sh的日志是問題字典,調試時第一步要找到日志目錄(啟動時會打印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-rootfs,post-rootfs.log會記錄根文件系統(tǒng)的修改(如新增/刪除的文件)。

2.錯誤時看調用棧:定位出錯的腳本與行號

build.sh打印fatal "ERROR: Running ... failed!"時,下方會輸出調用棧,例如:

fatal "ERROR: call stack:"

fatal " build.sh: run_build_hooks(250)"

fatal " build.sh: main(300)"

fatal " mk-kernel.sh: build(20)"

這表明:main函數調用run_build_hooks,后者執(zhí)行mk-kernel.shbuild函數時,在第20行出錯。直接打開mk-kernel.sh20行,即可快速定位問題(如make命令參數錯誤)。

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

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

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

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

4.檢查工具鏈與依賴:避免缺工具導致的失敗

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

?架構是否匹配:如編譯AArch64內核,工具鏈是否為aarch64-linux-gnu-;

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

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

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

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

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

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

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

?自動加載配置(load_configRK_CONFIG讀取關鍵參數);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

wKgZO2kamkCABR86AAGrAWm5V3A982.png

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

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

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

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

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

?調試時依賴它,能通過日志和調用??焖俣ㄎ粏栴},避免無頭蒼蠅式排查。

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


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

    關注

    88

    文章

    11806

    瀏覽量

    219494
  • 調試
    +關注

    關注

    7

    文章

    653

    瀏覽量

    35862
  • 瑞芯微
    +關注

    關注

    27

    文章

    838

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

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

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

    OpenHarmony支持hb和build.sh兩種編譯方式。此處介紹hb方式,build.sh腳本編譯方式請參考[使用build.sh腳本
    的頭像 發(fā)表于 05-14 17:53 ?2745次閱讀
    鴻蒙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 ?1627次閱讀
    鴻蒙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 ?2644次閱讀
    鴻蒙ArkUI-X框架<b class='flag-5'>開發(fā)</b>:【<b class='flag-5'>編譯</b>】

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

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

    rk3588 SDk 編譯報錯 執(zhí)行./build.sh buildroot

    -hooks/30-rootfs.sh - build_buildroot failed! ERROR: exit code 1 from line 16: \"RK_SCRIPTS_DIR/mk-buildroot.
    發(fā)表于 03-12 09:55

    使用build.sh腳本編譯時出現錯誤該怎么辦

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

    ._build.sh 失敗怎么解決?

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

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

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

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

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

    【飛凌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 ?3173次閱讀
    鴻蒙OpenHarmony【標準系統(tǒng) <b class='flag-5'>編譯</b>】(基于<b class='flag-5'>RK</b>3568<b class='flag-5'>開發(fā)</b>板)

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

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

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

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