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
我們可以在配置界面添加或裁剪一些工具,按需求定制系統功能。以添加 qt53d
為例:
輸入 /
進入搜索界面,輸入要查找的內容 qt53d
,按回車進行搜索:
選擇 1
跳轉到對應頁面,按空格選中配置:
配置完成后,移動到 Save
按回車保存到 .config
;移動到 Exit
按回車退出。
保存配置文件:
make savedefconfig
將修改保存到配置文件 configs/rockchip_rk3568_defconfig
。
2.3.2. Busybox 配置
打開配置界面,進行配置:
make busybox-menuconfig
配置完成后,移動到 Exit
按回車退出,在彈窗頁面選擇 Yes
保存到 .config
。
保存配置文件:
make busybox-update-config
將修改保存到配置文件 board/rockchip/common/base/busybox.config
。
2.4. 編譯
配置好 Buildroot 后,直接運行 make
進行編譯。
2.4.1. 編譯說明
運行 make
進行編譯時,會執行以下過程:
-
下載源碼;
-
配置、編譯、安裝交叉編譯工具鏈;
-
配置、編譯、安裝選擇的軟件包;
-
按選擇的格式生成根文件系統;
關於 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 menuconfig
,make 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
公眾號:開發之美