2018年3月4日 星期日

[Embedded] Buildroot -- 建置 qemuarm 的流程

本篇根據 buildroot user manual,實驗建置 qemuarm 的流程,記錄操作過程。

0. 測試環境建置
  • VirtualBox ver 5.2.2 
  • ubuntu-16.04.3-desktop-amd64.iso
  • Packages already installed in ubuntu (不見得需要,只是之前測試yocto時已經安裝至系統) 
$ sudo dpkg --add-architecture i386
$ sudo apt-get update
$ sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
$ sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib \
build-essential chrpath socat cpio python python3 python3-pip python3-pexpect \
xz-utils debianutils iputils-ping libsdl1.2-dev xterm
$ sudo apt-get install libncurses-dev

1. 至 https://buildroot.org/downloads/ 下載 buildroot
$ wget https://buildroot.org/downloads/buildroot-2017.11.tar.gz
$ tar xvf buildroot-2017.11.tar.gz
$ cd buildroot-2017.11
$ ls configs 
接著選一個適合的 configuration,因為預期測試過程會使用 qemu,因此我選擇 qemu_arm_vexpress_defconfig

2. 編譯程式
$ make qemu_arm_vexpress_defconfig
$ time make
$ make graph-build 
在我使用的VM系統內,編譯時間如下,
real 94m54.615s
user 52m8.757s
sys 7m26.322s 
看來使用 build root 來進行建置過程比 yocto 快多了。編譯成功後, output/images 目錄下會產生下列檔案。
 
注意:qemu_arm_vexpress_defconfig 預設會使用 uclibc 編譯,使用 BusyBox 當作 init system。

3. 使用 qemu 執行 image
$ cd buildroot-2017.11
$ cd output/images
$ QEMU_AUDIO_DRV=alsa  qemu-system-arm -kernel zImage \
-M vexpress-a9 -m 512 -drive file=rootfs.ext2,if=sd,format=raw \
-dtb ./vexpress-v2p-ca9.dtb \
--append "root=/dev/mmcblk0 console=ttyAMA0,115200" -nographic 
接著可以用 root 帳號登入,登入後的畫面如下:(要離開的話,按 CTRL+ a, 再按 x)


4. 編譯其他 Package (以 ffmpeg 為例)
$ cd buildroot/buildroot-2017.11
$ make menuconfig 
進入下列目錄 Target packages -> Audio and video applications,勾選 ffmpeg,此處預設會編譯全部的 encoder/decoder/muxer/demuxer,為了簡單,我根據此篇的設定,手動設定需要的選項,設定後的結果如下

存檔後,可先單獨編譯此 Package看看是否正確
$ make ffmpeg 
將 ffmpeg library 一併放入 image
$ make 
接著用 qemu 執行,就可以看到 /usr/lib/ 下面已經多出 ffmpeg 的 library 
此處列出 .config 修改前後的差異處
# BR2_PACKAGE_FAAD2 is not set
BR2_PACKAGE_FFMPEG_ARCH_SUPPORTS=y
BR2_PACKAGE_FFMPEG=y
# BR2_PACKAGE_FFMPEG_GPL is not set
# BR2_PACKAGE_FFMPEG_NONFREE is not set
# BR2_PACKAGE_FFMPEG_FFMPEG is not set
# BR2_PACKAGE_FFMPEG_FFPLAY is not set
# BR2_PACKAGE_FFMPEG_FFSERVER is not set
# BR2_PACKAGE_FFMPEG_FFPROBE is not set
# BR2_PACKAGE_FFMPEG_AVRESAMPLE is not set
# BR2_PACKAGE_FFMPEG_SWSCALE is not set
BR2_PACKAGE_FFMPEG_ENCODERS=""
BR2_PACKAGE_FFMPEG_DECODERS="mp3"
BR2_PACKAGE_FFMPEG_MUXERS=""
BR2_PACKAGE_FFMPEG_DEMUXERS="mp3"
BR2_PACKAGE_FFMPEG_PARSERS="mpegaudio"
BR2_PACKAGE_FFMPEG_BSFS=""
BR2_PACKAGE_FFMPEG_PROTOCOLS="file"
BR2_PACKAGE_FFMPEG_FILTERS=""
# BR2_PACKAGE_FFMPEG_INDEVS is not set
# BR2_PACKAGE_FFMPEG_OUTDEVS is not set
BR2_PACKAGE_FFMPEG_EXTRACONF="--disable-debug --enable-neon"


5. 新增 package
若要在 buildroot 系統下,新增一個新的 package 並進行開發,應該參考下列幾個章節
  • 8.12.6 Using Buildroot during development
  • chapter 17 Adding new packages to Buildroot
  • chapter 20 Debugging Buildroot
作法簡介如下: 
5.1 新增一個 Package
$ mkdir -p /home/albert/code/mytest/
$ cd /home/albert/code/mytest/
$ vi Config.in  : 內容請參考 user manual chapter 17.2
$ vi mytest.mk : 內容請參考 user manual chapter 17.5 
5.2 設定 source code 路徑 
因為這個 package 會用來開發,因此要設定 pkg_OVERRIDE_SRCDIR 直接使用開發中的 source code
mytest.mk 的設定如下:
MYTEST_OVERRIDE_SRCDIR = /home/albert/code/mytest/
設定之後,buildroot 在編譯時,會自動將 MYTEST_OVERRIDE_SRCDIR 的內容複製到 output/build/MYTEST-custom/ 目錄 
5.3 編譯新的 packaget 
接著用 pkg-rebuild all ,便會同步程式碼,重新編譯程式,如下:
$ make mytest-rebuild all
5.4 各項新增的部分,可參考 https://github.com/alb423/buildroot_test 


6. 其他常用技巧
只下載 source code 到 dl 目錄,先不要進行編譯
$ make source 
產出編譯訊息報表 (編譯時間,image size)
$ sudo apt install python-matplotlib
$ make graph-build
$ make graph-size 
單獨重新編譯某個 Package
$ make  pkg-rebuild 
支援 gdb
$ make menuconfig  
然後打開這幾個選項即可
  • BR2_PACKAGE_HOST_GDB
  • BR2_PACKAGE_GDB
  • BR2_PACKAGE_GDB_SERVER 
要加速後續編譯速度,可以加入 ccache
$ make menuconfig,
然後設定 "ccache" ,此部分可參考 8.12.3 Using ccache in Buildroot