bitbakeでOSイメージを作成してばっかりで、 このOS上で開発する環境を作成していなかった。 このままではyoctoはbitbakeしてOSをSDに書いて終了するものだと思われかねないので、今回はクロスコンパイル環境を作成する。
開発環境の作成方法
yoctoでは開発環境(=toolchain)を作成する方法はいくつか提供されている。
- bitbake meta-toolchain
- bitbake
-c populate_sdk - 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 を利用する。
開発環境の利用手順
開発環境の作成手順は上記の通り複数用意されているが、利用する手順はすべて以下のようになる。
- bitbakeでインストーラスクリプトを作成
- インストーラスクリプトを実行し開発環境をインストール
- source environment-setup-cortexa7t2hf-vfp-vfpv4-neon-poky-linux-gnueabiで環境変数を設定
- 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が表示される。