Buildroot 開發--- 參考rk3568


2. Buildroot 開發

Buildroot 是 Linux 平台上一個構建嵌入式 Linux 系統的框架。整個 Buildroot 是由 Makefile(*.mk) 腳本和 Kconfig(Config.in) 配置文件構成的。你可以和編譯 Linux 內核一樣,通過 buildroot 配置,menuconfig 修改,編譯出一個完整的可以直接燒寫到機器上運行的 Linux 系統軟件(包含 boot、kernel、rootfs 以及 rootfs 中的各種庫和應用程序)。若您要了解更多 Buildroot 開發相關內容,可以參考 Buildroot 官方的 《開發手冊》

下面以 ROC-RK3568-PC 的 Buildroot 開發為例進行闡述。

2.1. 交叉編譯 Qt-5.12.2

若您想在 Firefly 官方發布的 Buildroot 系統上進行 Qt 開發,需詳細閱讀本章節。

2.1.1. 交叉編譯工具鏈

Firefly 提取了 Buildroot 的交叉編譯工具鏈,您可以直接使用該工具鏈開發 Buildroot 上的 Qt 應用程序,而無需下載編譯 SDK 代碼。

工具鏈支持 EGLFS、LinuxFB、Wayland 等插件。

使用環境:

主機:x86-64 / Ubuntu 18.04
設備:Firefly RK3568 RK3566 RK3399 RK3288 PX30 .. / Buildroot

2.1.1.1. 下載

對於 32 位芯片,如 RK3288,下載 firefly-qt-5.12.2-arm.tar.gz;對於其它 64 位芯片,如 RK3568,下載 firefly-qt-5.12.2-aarch64.tar.gz

下載鏈接(提取碼:6dg7)

下文將以 firefly-qt-5.12.2-aarch64.tar.gz 為例進行說明。

2.1.1.2. 目錄結構

解壓下載好的壓縮包:

tar -zxvf firefly-qt-5.12.2-aarch64.tar.gz

目錄結構:

firefly-qt-5.12.2-aarch64/
├── aarch64.tar.gz # 用於 Qt 程序運行的庫文件、插件等
├── demo
│   └── mainwindow # demo 程序 ├── firefly-qt-5.12.2-aarch64 # 交叉編譯工具鏈 └── ReadMe # 使用說明 

2.1.2. 配置交叉編譯環境

將工具鏈拷貝到主機的指定目錄:

cd firefly-qt-5.12.2-aarch64/
# 該目錄 `/opt/` 不可修改 cp -rdf firefly-qt-5.12.2-aarch64 /opt/ 

若拷貝失敗,先修改下目錄權限,再執行上述操作:

sudo chmod 777 /opt/

2.1.2.1. 交叉編譯

以 demo 程序為例,運行如下命令:

cd demo/mainwindow/
/opt/firefly-qt-5.12.2-aarch64/host/bin/qmake
make

編譯完成后,會生成可執行程序 demo/mainwindow/mainwindow

2.1.3. 配置運行環境

使用 U 盤將 aarch64.tar 拷貝到設備上:

cp /media/usb0/aarch64.tar /userdata/

解壓:

cd /userdata/
tar -xvf aarch64.tar

將文件拷貝到對應目錄:

cd aarch64/
cp -rdf usr/lib/* /usr/lib/
cp -rdf usr/qml/* /usr/qml/
cp usr/bin/gdbserver /usr/bin/

2.1.3.1. 運行程序

將編譯好的可執行程序 mainwindow 拷貝到設備上。

默認板子運行了 Wayland 桌面環境,按如下方式運行:

# 設置環境變量
export XDG_RUNTIME_DIR=/tmp/.xdg # 運行 ./mainwindow -platform wayland 

使用 eglfs 插件運行:

# 退出 Wayland 桌面環境
/etc/init.d/S50launcher stop
# 運行 ./mainwindow -platform eglfs 

2.2. 目錄結構

Buildroot SDK 位於 Firefly_Linux_SDK 目錄,其目錄結構如下:

buildroot/
├── arch                # CPU 架構的構建、配置文件
├── board               # 具體單板相關的文件 ├── boot # Bootloaders 的構建、配置文件 ├── build ├── CHANGES # Buildroot 修改日志 ├── Config.in ├── Config.in.legacy ├── configs # 具體單板的 Buildroot 配置文件 ├── COPYING ├── DEVELOPERS ├── dl # 下載的程序、源碼壓縮包、補丁等 ├── docs # 文檔 ├── fs # 各種文件系統的構建、配置文件 ├── linux # Linux 的構建、配置文件 ├── Makefile ├── Makefile.legacy ├── output # 編譯輸出目錄 ├── package # 所有軟件包的構建、配置文件 ├── README # Buildroot 簡單說明 ├── support # 為 Bulidroot 提供功能支持的腳本、配置文件 ├── system # 制作根文件系統的構建、配置文件 ├── toolchain # 交叉編譯工具鏈的構建、配置文件 └── utils # 實用工具 

2.3. 配置

選擇默認配置文件:

# 進入 Firefly_Linux_SDK 根目錄
cd path/to/Firefly_Linux_SDK/ # 選擇配置文件 # `configs/rockchip_rk3568_defconfig` source envsetup.sh rockchip_rk3568 

執行完成后會生成編譯輸出目錄,output/rockchip_rk3568,后續也可以在該目錄下執行 make 相關操作。

2.3.1. 軟件包配置

打開配置界面:

make menuconfig

_images/Buildroot_menuconfig.png

我們可以在配置界面添加或裁剪一些工具,按需求定制系統功能。以添加 qt53d 為例:

輸入 / 進入搜索界面,輸入要查找的內容 qt53d,按回車進行搜索:

_images/Buildroot_serach_qt53d.png

_images/Buildroot_qt53d.png

選擇 1 跳轉到對應頁面,按空格選中配置:

_images/Buildroot_select_qt53d.png

配置完成后,移動到 Save 按回車保存到 .config;移動到 Exit 按回車退出。

_images/Buildroot_Save-Exit.png

保存配置文件:

make savedefconfig

將修改保存到配置文件 configs/rockchip_rk3568_defconfig

2.3.2. Busybox 配置

打開配置界面,進行配置:

make busybox-menuconfig

_images/Buildroot_busybox-menuconfig.png

配置完成后,移動到 Exit 按回車退出,在彈窗頁面選擇 Yes 保存到 .config

_images/Buildroot_busybox-save.png

保存配置文件:

make busybox-update-config

將修改保存到配置文件 board/rockchip/common/base/busybox.config

2.4. 編譯

配置好 Buildroot 后,直接運行 make 進行編譯。

2.4.1. 編譯說明

運行 make 進行編譯時,會執行以下過程:

  1. 下載源碼;

  2. 配置、編譯、安裝交叉編譯工具鏈;

  3. 配置、編譯、安裝選擇的軟件包;

  4. 按選擇的格式生成根文件系統;

關於 make 的更多用法,可通過 make help 獲得。

2.4.2. 編譯軟件包

我們可以執行 make <package> 單獨編譯某個軟件包。軟件包的編譯主要包括下載,解壓,打補丁,配置,編譯,安裝等過程,具體可以查看 package/pkg-generic.mk

  • 下載

    Buildroot 會根據配置 package/<package>/<package>.mk,自動從網絡獲取對應的軟件包,包括一些第三方庫,插件,實用工具等,放在 dl/ 目錄。

  • 解壓

    軟件包會解壓在 output/rockchip_rk3568/build/<package>-<version> 目錄下。

  • 打補丁

    補丁集中放在 package/<packgae>/ 目錄,Buildroot 會在解壓軟件包后為其打上相應的補丁。如果要修改源碼,可以通過打補丁的方式進行修改。

  • 配置

  • 編譯

  • 安裝

    編譯完成后,會將需要的編譯生成文件拷貝到 output/rockchip_rk3568/target/ 目錄。

對於某個軟件包,我們可以通過 make <package>-<target> 調用軟件包構建中的某一步驟,如下:

Package-specific:
  <pkg>                  - Build and install <pkg> and all its dependencies
  <pkg>-source           - Only download the source files for <pkg> <pkg>-extract - Extract <pkg> sources <pkg>-patch - Apply patches to <pkg> <pkg>-depends - Build <pkg>'s dependencies  <pkg>-configure - Build <pkg> up to the configure step  <pkg>-build - Build <pkg> up to the build step  <pkg>-graph-depends - Generate a graph of <pkg>'s dependencies <pkg>-dirclean - Remove <pkg> build directory <pkg>-reconfigure - Restart the build from the configure step <pkg>-rebuild - Restart the build from the build step 

2.5. 編譯輸出目錄

編譯完成后,在編譯輸出目錄 output/rockchip_rk3568 會生成子目錄,說明如下:

  • build/ 包含所有的源文件,包括 Buildroot 所需主機工具和選擇的軟件包,這個目錄包含所有軟件包源碼。

  • host/ 主機端編譯需要的工具,包括交叉編譯工具。

  • images/ 包含壓縮好的根文件系統鏡像文件。

  • staging/ 這個目錄類似根文件系統的目錄結構,包含編譯生成的所有頭文件和庫,以及其他開發文件,不過它們沒有裁剪,比較龐大,不適用於目標文件系統。

  • target/ 包含完整的根文件系統,對比 staging/,它沒有開發文件,不包含頭文件,二進制文件也經過 strip 處理。

2.6. 交叉編譯工具

Buildroot 編譯完成后,會在 output/rockchip_rk3568/host/ 目錄下,生成交叉編譯工具,我們可以用來編譯目標程序。

  • 交叉編譯工具目錄

output/rockchip_rk3568/host/bin/

  • 編譯示例 hello.c

#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { printf("Hello World!\n"); return 0; } 
  • 編譯

.../host/bin/arm-buildroot-linux-gnueabihf-gcc hello.c -o hello
  • 運行

將可執行程序 hello 拷貝到設備,運行 ./hello,則會看到打印信息 Hello World!

2.7. 重建

對於重建的具體說明,可以查看文檔 buildroot/docs/manual/rebuilding-packages.txt

2.7.1. 重建軟件包

在開發過程中,若修改了某個軟件包的源碼,Buildroot 是不會重新編譯該軟件包的。可以按如下方式操作:

  • 方式一

make <package>-rebuild
  • 方式二

# 刪除軟件包的編譯輸出目錄
rm -rf output/rockchip_rk3568/build/<package>-<version>
# 編譯 make <package> 

2.7.2. 完全重建

當通過 make menuconfigmake xconfig 或其他配置工具之一更改系統配置時,Buildroot 不會嘗試檢測應重建系統的哪些部分。在某些情況下,Buildroot 應該重建整個系統,在某些情況下,僅應重建軟件包的特定子集。但是以完全可靠的方式檢測到這一點非常困難,因此 Buildroot 開發人員已決定不嘗試這樣做。

2.7.2.1. 何時需要完全重建

  • 更改目標體系結構配置時,需要完全重建;

  • 更改工具鏈配置時,需要完全重建;

  • 將其他軟件包添加到配置中時,不一定需要完全重建;

  • 從配置中刪除軟件包時,Buildroot 不會執行任何特殊操作。它不會從目標根文件系統或工具鏈中刪除此軟件包安裝的文件。需要完全重建才能刪除這些文件;

  • 更改軟件包的子選項時,不會自動重建軟件包;

  • 對根文件系統框架進行更改時,需要完全重建;

一般而言,當你遇到構建錯誤並且不確定所做的配置更改可能帶來的后果時,請進行完全重建。具體說明可以查看文檔 rebuilding-packages.txt

2.7.2.2. 如何完全重建

  • 方式一

直接刪除編譯輸出目錄,之后重新進行配置、編譯。

rm -rf output/
  • 方式二

執行如下命令,會刪除編譯輸出並重新編譯。

make clean all

2.8. 新增本地源碼包

開發過程中,Buildroot 自帶的軟件包有時可能無法滿足我們的需求,為此我們需要添加自定義的軟件包。Buildroot 支持多種格式的軟件包,包括 generic-package、cmake-package、autotools-package 等,我們以 generic-package 舉例說明。

  • 創建工程目錄

cd path/to/Firefly_Linux_SDK/
mkdir buildroot/package/rockchip/firefly_demo/
  • 新建 Config.in

在 firefly_demo/ 下添加 Config.in:

config BR2_PACKAGE_FIREFLY_DEMO
        bool "Simple Firefly Demo" 
  • 新建 firefly_demo.mk

在 firefly_demo/ 下添加 firefly_demo.mk:

##################################################
########### # ### firefly_demo # ################################################## ########### ifeq ($(BR2_PACKAGE_FIREFLY_DEMO), y) FIREFLY_DEMO_VERSION:=1.0.0 FIREFLY_DEMO_SITE=$(TOPDIR)/../external/firefly_demo/src FIREFLY_DEMO_SITE_METHOD=local define FIREFLY_DEMO_BUILD_CMDS $(TARGET_MAKE_ENV) $(MAKE) CC=$(TARGET_CC) CXX=$(TARGET_CXX) -C $(@D) endef define FIREFLY_DEMO_CLEAN_CMDS $(TARGET_MAKE_ENV) $(MAKE) -C $(@D) clean endef define FIREFLY_DEMO_INSTALL_TARGET_CMDS $(TARGET_MAKE_ENV) $(MAKE) -C $(@D) install endef define FIREFLY_DEMO_UNINSTALL_TARGET_CMDS $(TARGET_MAKE_ENV) $(MAKE) -C $(@D) uninstall endef $(eval $(generic-package)) endif 
  • 創建源碼目錄

上文的 Makefile 文件里已經指定了源碼目錄 external/firefly_demo/src

cd path/to/Firefly_Linux_SDK/
mkdir external/firefly_demo/src
  • 編寫源碼 firefly_demo.c

在 firefly_demo/src/ 下添加 firefly_demo.c:

#include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { printf("Hello World!\n"); return 0; } 
  • 編寫 Makefile

在 firefly_demo/src/ 下添加 Makefile:

DEPS = OBJ = firefly_demo.o CFLAGS = %.o: %.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) firefly_demo: $(OBJ) $(CXX) -o $@ $^ $(CFLAGS) .PHONY: clean clean: rm -f *.o *~ firefly_demo .PHONY: install install: cp -f firefly_demo $(TARGET_DIR)/usr/bin/ .PHONY: uninstall uninstall: rm -f $(TARGET_DIR)/usr/bin/firefly_demo 
  • 修改上一級 Config.in

在 buildroot/package/rockchip/Config.in 末尾添加一行:

source "package/rockchip/firefly_demo/Config.in" 
  • 配置軟件包

打開配置菜單 make menuconfig,找到 firefly_demo 並選中配置。

  • 編譯

# 編譯 firefly_demo
make firefly_demo
# 打包進根文件系統 make # 若修改源碼,重新編譯軟件包 make firefly_demo-rebuild 

2.9. rootfs-overlay

rootfs-overly 是一個相當不錯的功能,它能夠在目標文件系統編譯完成后將指定文件覆蓋到某個目錄。通過這種方式,我們可以方便地添加或修改一些文件到根文件系統。

假設我們要在根文件系統的 /etc/ 目錄下添加文件 overlay-test,可以按如下步驟操作:

  • 設置 rootfs-overlay 根目錄

打開配置菜單 make menuconfig,通過設置 BR2_ROOTFS_OVERLAY 選項,添加用於覆蓋的根目錄。對於 RK3568,默認已添加了目錄 board/rockchip/rk356x/fs-overlay/

  • 添加文件到覆蓋目錄

cd buildroot/board/rockchip/rk356x/fs-overlay/
mkdir etc/
touch etc/overlay-test
  • 編譯

make
  • 下載根文件系統

將編譯好的根文件系統 output/rockchip_rk3568/images/rootfs.ext2 下載到設備。啟動設備,可以看到已添加文件 /etc/overlay-test

也可以通過查看 target/ 目錄,驗證是否添加成功:

ls buildroot/output/rockchip_rk3568/target/etc/overlay-test


本公司成本價甩賣工控主板,歡迎大家選購:
PCIE總線轉八串口卡,PCIE總線轉IO卡,瑞芯微3568板卡,寒武紀CE3226攝像頭板卡,龍芯3A4000工控板卡,龍芯3A5000工控板卡,海光3250工控板卡,飛騰FT-2000/4板卡

聯系方式:
電話、微信:15918785568 羅生
Email:13279654@qq.com
公眾號:開發之美

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM