みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

raspberrypi2 yoctoの開発環境の作成

bitbakeでOSイメージを作成してばっかりで、 このOS上で開発する環境を作成していなかった。 このままではyoctoはbitbakeしてOSをSDに書いて終了するものだと思われかねないので、今回はクロスコンパイル環境を作成する。

開発環境の作成方法

yoctoでは開発環境(=toolchain)を作成する方法はいくつか提供されている。

  1. bitbake meta-toolchain
  2. bitbake -c populate_sdk
  3. bitbake meta-toolchain-qt

など。

bitbake meta-toolchain

おそらく最もスタンダードな方法。 toolchainと、レシピで用意されたsysrootのインストーラが作成される。 この方法では、bitbakeしたrootfsとtoolchainのsysrootが乖離してしまうため、 別途sysrootを用意する必要がある。 core-image-sato-sdkのようにrootfs側にSDKが組み込まれているイメージと一緒使うことが多いかもしれない。

bitbake -c populate_sdk

上記の方法と異なり、作成されたsysrootとrootfsに乖離が出ない。 通常のtoolchainを作成するのであれば、この方法が推奨される。

bitbake meta-toolchain-qt

qtの開発環境はnative側でqmakeがインストールされている必要があるなど、 通常のtoolchainだけでは足りないいくつかのコンポーネントがある。 こういうケースではpopulate_sdkが利用できないためこの特殊なレシピを利用することになる。

イメージで追加したパッケージ等は個人的にはpackagegroup-qt-toolchain-target.bbappendで追加して利用することが多い。

今回はmeta-qt5に含まれる bitbake meta-toolchain-qt5 を利用する。

開発環境の利用手順

開発環境の作成手順は上記の通り複数用意されているが、利用する手順はすべて以下のようになる。

  1. bitbakeでインストーラスクリプトを作成
  2. インストーラスクリプトを実行し開発環境をインストール
  3. source environment-setup-cortexa7t2hf-vfp-vfpv4-neon-poky-linux-gnueabiで環境変数を設定
  4. arm-poky-linux-gnueabi-g++などでコンパイル

ベース環境

前回の環境をベースに作業する。 今回初めから作業する場合はこちらのほうが参考にしやすいかもしれない。

meta-qt5-meta-qt5-rpi-eglfsの更新

リポジトリを更新する。 今回、新たに取得した場合は必要ない。

$ cd ~/rpi2/poky/meta-qt5-rpi-eglfs
$ git pull

conf/local.confの編集

local.confを以下のように編集する。

MACHINE ?= "raspberrypi2"
BB_NUMBER_THREADS = "8"
PARALLEL_MAKE = "-j 8"
VIDEO_CAMERA = "1"
GPU_MEM = "128"
LICENSE_FLAGS_WHITELIST += "commercial"

FETCHCMD_wget = "/usr/bin/env wget -t 2 -T 3000 -nv --passive-ftp --no-check-certificate"
DISTRO_FEATURES_remove = " x11 wayland"

DISTRO_FEATURES_remove で「x11」と「wayland」を削除する。 x11の前のスペースは必須なので気をつけること。

開発環境の作成

インストーラの作成

bitbakeを実行しtoolchainのインストーラを作成する。

$ cd ~/rpi2
$ source poky/oe-init-build-env build_qt5
$ bitbake meta-toolchain-qt5

インストール

$ tmp/deploy/sdk/poky-glibc-x86_64-meta-toolchain-qt5-cortexa7t2hf-vfp-vfpv4-neon-toolchain-1.7.sh
Enter target directory for SDK (default: /opt/poky/1.7):

ここでは /opt/poky/1.7 にインストールする。

開発環境の利用

試しにプログラムを作成し実行してみる。 一部変更しているが基本的にはここの5.1.1. Creating and Running a Project Based on GNU Autotoolsを参考にした。

helloworld

以下の要領でソースを作成する。

$ source /opt/poky/1.7/environment-setup-cortexa7t2hf-vfp-vfpv4-neon-poky-linux-gnueabi
$ mkdir ~/hello
$ cd ~/hello
$ touch hello.cpp

hello.cppを以下の内容で作成する。

#include <iostream>

int main(void)
{
    std::cout << "hello world" << std::endl;
    return 0;
}

Autotoolsの使用

$ touch Makefile.am
$ touch configure.ac

Makefile.amを以下の内容で作成する。

bin_PROGRAMS=hello
hello_SOURCES=hello.cpp

configure.acを以下の内容で作成する。

AC_INIT(hello.cpp)
AM_INIT_AUTOMAKE(hello,0.1)
AC_PROG_CC
AC_PROG_CXX
AC_PROG_INSTALL
AC_OUTPUT(Makefile)

以下のコマンドを実行する

$ touch NEWS README AUTHORS ChangeLog
$ autoreconf -i
$ ./configure ${CONFIGURE_FLAGS}
$ make

fileコマンドで以下のように表示されればRPi2用のバイナリが作成できている。

file hello
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=03ab7c2a505771976d0972ddd200deaf53091309, not stripped

実行

ビルドしたhelloをscpでRPi2に送信して実行してみる。

$ scp ./hello root@192.168.1.100:/tmp

192.168.1.100はRPiのIPアドレス。これは環境によって適宜置き換える。

RPi2側で以下を実行。

$ /tmp/hello
hello world

hello worldが表示される。