SDKでアプリ開発

今回はYoctoを使ってSDKを作成します。このSDKはgccでLinuxアプリを開発するための環境です。実際にはYoctoを使えばアプリまで作成できるのですが、イメージとしては大型重機です。SDKの環境はミニユンボ(?)ぐらいのイメージで、アプリ開発に特化した環境を簡単に別のパソコンに作ることができます。

これを利用してRZ/G2Lで動作するアプリを作ってみましょう(と、言ってもHello Worldですが)。

SDKのビルド

SDKをビルドするというのがイメージしにくいですが、最終的にはアプリ開発に必要なツールやファイルを集めて、SDKのパッケージを作るという感じです。パッケージは一つのシェルスクリプトにまとめられ、これを別のパソコンで実行すれば、アプリ開発の環境ができます。

SDKのビルド方法についてもPDFマニュアル(r01us0553ej0106-rz-g(Release Note).pdf)に書かれていますので、その通りにやっていきます。

Yoctoのbitbakeを使いますので、初期化スクリプト(oe-init-build-env)を実行してから、bitbakeでビルドを行います。

$ cd ~/rzg_vlp_v3.0.3
$ TEMPLATECONF=$PWD/meta-renesas/meta-rzg2l/docs/template/conf/ source poky/oe-init-build-env build
### Shell environment set up for builds. ###
You can now run 'bitbake '
:(中略)
    core-image-qt
$ MACHINE=smarc-rzg2l bitbake core-image-minimal -c populate_sdk
:(中略)
NOTE: Tasks Summary: Attempted 3325 tasks of which 2160 didn't need to be rerun and all succeeded.

Summary: There were 5 WARNING messages shown.

このビルドもパソコンの仮想マシンではそこそこ時間がかかります。

ビルドが終了すると、最終的に以下のスクリプトファイルが生成されます。

~/rzg_vlp_v3.0.3/build/tmp/deploy/sdk/poky-glibc-x86_64-core-image-minimal-aarch64-smarc-rzg2l-toolchain-3.1.21.sh

SDKのインストール

上で作ったスクリプトファイルを実行すれば、gccでのLinuxアプリのクロス環境が構築されます。今回はYoctoと同じパソコンで実行していますが、別のパソコンで環境を構築したい場合は、このスクリプトファイルをコピーして実行すればOKです。

余談ですが、このスクリプトファイルだけでコンパイラやヘッダファイルを含めたツールチェインまでインストールできるってすごいですね。少し調べてみたところ、ネットワークにつながっていなくてもインストールできますので、スクリプトファイル単独で動いているようです。どうやら必要なツールチェインのバイナリイメージを圧縮してくっつけているのですね。

それではSDKをインストールしてみましょう。管理者権限でインストールしますのでsudoが必要です。

$ sudo sh ~/rzg_vlp_v3.0.3/build/tmp/deploy/sdk/poky-glibc-x86_64-core-image-minimal-aarch64-smarc-rzg2l-toolchain-3.1.21.sh
Poky (Yocto Project Reference Distro) SDK installer version 3.1.21
==================================================================
Enter target directory for SDK (default: /opt/poky/3.1.21):
You are about to install the SDK to "/opt/poky/3.1.21". Proceed [Y/n]? y
Extracting SDK...................................................................done
Setting it up...done
SDK has been successfully set up and is ready to be used.
Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.
 $ . /opt/poky/3.1.21/environment-setup-aarch64-poky-linux
 $ . /opt/poky/3.1.21/environment-setup-armv7vet2hf-neon-vfpv4-pokymllib32-linux-gnueabi

スクリプトの実行終了とともに、使い方の例がついでに表示されています。

「environment-setup-aarch64-poky-linux」これは64ビットArm用の環境設定で、「environment-setup-armv7vet2hf-neon-vfpv4-pokymllib32-linux-gnueabi」こちらは32ビットArm用の環境設定です。ファイル名長い・・・。

32ビットの環境はのちほどやりますので、今回は64ビットArmの環境でやってみます。書いてある通りドットコマンド(sourceコマンドでもOK)を使ってスクリプトを実行し、gccコンパイラが動作することを確認します。

$ . /opt/poky/3.1.21/environment-setup-aarch64-poky-linux
$ aarch64-poky-linux-gcc –version
arch64-poky-linux-gcc (GCC) 8.3.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Hello Worldをコンパイル

コンパイラが動くことを確認できましたので、とりあえず「Hello World」でも動かしてみましょう。ファイル名はhello.cとして、ソースコードはこんな感じでしょうか。

#include <stdio.h>
int main(void)
{
    printf(“Hello World\n”);
    return 0;
}

ではコンパイルしてみましょう。

$ aarch64-poky-linux-gcc -c hello.c
hello.c:1:10: fatal error: stdio.h: No such file or directory
 #include <stdio.h>
          ^~~~~~~~~
compilation terminated.

「stdio.h」が見つからないらしいです。これは標準ヘッダですので、インクルードパスの設定は不要のはずですが。おそらく環境変数に問題があるのでしょう。envコマンドで環境変数をざっと見てみますと、CCという定義がありました。

$ pritnenv CC
aarch64-poky-linux-gcc  -mtune=cortex-a55 -fstack-protector-strong  -D_FORTIFY_SOURCE=2 -Wformat -Wformat-security -Werror=format-security --sysroot=/opt/poky/3.1.21/sysroots/aarch64-poky-linux

なるほど、--sysrootオプションでコンパイラシステムのルートを指定してるんですね。ということは$CCでコンパイルできるはずなのでやってみましょう。CFLAGSという環境変数も定義されていますのでついでに付加します。

$ $CC $CFLAGS -o hello hello.c
$ ls
hello  hello.c

ちゃんとhelloができていますね。これは64ビットArmで実行できるバイナリなので、もちろんパソコンのLinuxでは実行できません。SDカードにコピーしてRZ/G2Lボードにhelloバイナリを持っていきます。

前回使用したSDカードを接続すると/media/*/rootfsにマウントされますので、その下のディレクトリ「home/root」にコピーします。

$ sudo cp hello /media/*/rootfs/home/root
$ sudo ls /media/*/rootfs/home/root
hello  v4l2-init.sh

ここにコピーすることで、RZ/G2Lで起動したときに/home/rootディレクトリからhelloを実行することができます。

Hello Worldを実行

SDカードを取り外して、RZ/G2Lのボードに接続します。そして電源を入れて、ターミナルソフトを起動させます。

Linuxのブートが完了すれば、rootでログインします。

 :(省略)
Poky (Yocto Project Reference Distro) 3.1.21 smarc-rzg2l ttySC0

BSP: RZG2L/RZG2L-SMARC-EVK/3.0.3
LSI: RZG2L
Version: 3.0.3
smarc-rzg2l login: root
#

ちゃんとhelloがあるか確認します。

root@smarc-rzg2l:~# ls
hello  v4l2-init.sh

helloを実行します。

root@smarc-rzg2l:~# ./hello
Hello World

ちゃんとHello Worldと表示されました。

Workbench

本格的なアプリ開発をするためにはmakeなどを使う必要があると思いますが、こんな感じでSDKを使ってLinuxアプリを簡単に作ることができることが分かりました。