TinkerBoardでJUCEプロジェクトをビルドして実行するまでの話

![Screenshot from 2017-11-18 16-05-57.png](https://qiita-image-store.s3.amazonaws.com/0/93566/a99307b2-57f5-9c3d-13d6-3f167e2bd682.png)

本記事は [JUCE Advent Calendar 2017](https://qiita.com/advent-calendar/2017/juce)  の12月7日向けに投稿した記事です。

JUCEライブラリをRaspberryPi(Raspbian)でビルドする方法については私の[ブログ](http://www.oufac.com/blog/2017/10/04/juce-build-on-raspberry-pi-stretch/)に投稿しておりますが、同様にTinkerBoard(TinkerOS)でもビルドすることができたので、その手順について紹介します。

## TinkerBoardとは？

![Screenshot from 2017-11-18 14-32-38.png](https://qiita-image-store.s3.amazonaws.com/0/93566/a6111320-a3e9-bcf5-d5ff-eb2f5fb0d7dc.png)


公式サイト: https://www.asus.com/jp/Single-Board-Computer/Tinker-Board/
ASUSからリリースされた、Rasberry Piと同サイズのシングルボードコンピューターです。
RasberryPi3よりも強力なCPU,GPUを搭載していることから、より快適なIoTデバイスの実装が期待されています。
なお、基本スペックが高いぶんCPUの発熱量も凄いため、ヒートシンクが同梱されています。
その反面、コミュニティも歴史が浅く、Raspberry Piと比較するとOSや各種ドライバの安定性は発展途上という印象もあります。



##  開発環境

◆ハードウェア
TinkerBoard

◆OS
TinkerOS ver2.0.3(beta)
最新版のOSはこちらのフォーラムからDLすることができます。
https://tinkerboarding.co.uk/forum/thread-69.html

## ０．OSインストール

こちらの記事が参考になります。
[[メモ] ASUS Tinker Board: 初期設定 (TinkerOS 2.0.1 betaベース) 2017年8月版]
(https://qiita.com/mt08/items/9094cc624953360c120b)

## １．準備

まず、JUCEをダウンロードしましょう。[公式ダウンロードサイト](https://juce.com/get-juce)
Windows/macOS/Linuxから選択することができますが、Linux向けを選択すれば良いです。
※Linux用のProjucerが同梱されていますがx86をターゲットにしているため、CPUアーキテクチャが異なるRaspberry Pi (ARM)上では動作しません。TinkerBoard用のProjucerは以下の手順にてビルドすることができます。

また、GitHubリポジトリからDLする場合は、ターミナルで次のコマンドを打ちましょう。

```bash

$ sudo git clone https://github.com/WeAreROLI/JUCE.git

```


## ２．依存パッケージのインストール

```bash

$ sudo apt-get install clang freeglut3-dev g++ libasound2-dev libcurl4-openssl-dev libfreetype6-dev libjack-jackd2-dev libx11-dev libxcomposite-dev libxcursor-dev libxinerama-dev libxrandr-dev mesa-common-dev webkit2gtk-4.0

```

JUCEライブラリのビルドに必要な依存パッケージをインストールします。ついでにLLVM-Clangコンパイラをインストールします。
GCCでもコンパイルできることを確認しています。

## ３．Wayland-EGLの環境を構築する
RaspberryPi(Raspbian)では、2.の依存パッケージのインストールでビルド環境構築は完了ですが。
TinkerBoard(TinkerOS)でビルドしようとすると、makeから以下の警告が返ってきます。

```bash

Package wayland-egl was not found in the pkg-config search path.
Perhaps you should add the directory containing `wayland-egl.pc'
to the PKG_CONFIG_PATH environment variable
Package 'wayland-egl', required by 'gdk-3.0', not found
Package wayland-egl was not found in the pkg-config search path.
Perhaps you should add the directory containing `wayland-egl.pc'
to the PKG_CONFIG_PATH environment variable
Package 'wayland-egl', required by 'gdk-3.0', not found
Makefile:418: recipe for target 'check-pkg-config' failed
make: *** [check-pkg-config] Error 1

```

どうやら、GTK3がWayland-EGLに依存しているため、ビルド依存関係を解決する必要があります。
それを解決するために、apt-get build-depを実行します。

```bash

$ sudo apt-get build-dep wayland weston

```

## ４．作業ディレクトリへの移動

```bash

$ cd JUCE/extras/Projucer/Builds/LinuxMakefile

```

LinuxMakefileが置かれたディレクトリに移動します。
※ディレクトリは各自の環境に合わせて入力してください。
※サンプルプロジェクトの一部に”LinuxMakefile”用プロジェクトが同梱されています。


## ５．コンパイル

### ５－１．GCCでコンパイルする場合

```bash

 $ sudo make CXX=g++

```

LinuxMakefileからビルドを実行します。
ビルドモードは”Debug”がデフォルトです。
各種オプションについては以下の通りです。

・CXX=g++
… LinuxMakefileオプションです。C++コンパイラにg++を使用します



### ５－２．LLVM-Clangでコンパイルする場合

```bash

$ sudo make CXX=clang++ "TARGET_ARCH=-march=armv7-a"

```

LinuxMakefileからビルドを実行します。
ビルドモードは”Debug”がデフォルトです。
各種オプションについては以下の通りです。

・CXX=clang++
… LinuxMakefileオプションです。C++コンパイラにclang++を使用します

・“TARGET_ARCH=-march=armv7-a”
… LinuxMakefileオプションです。ターゲットアーキテクチャを明示的に指定します


## ６．起動用のランチャーを作成する

ビルドしたプログラムを実行するには、ターミナルから以下のコマンドを実行することで実行することができます。

```bash

$ ./Projucer             ※./（プログラム名）

```

ただし、TinkerOSでは、ビルドしたプログラムは"共有ライブラリ(Shared Library)"として扱われるようですので、ファイラーからダブルクリックで実行することはできないようです。
![Screenshot from 2017-11-18 15-46-02.png](https://qiita-image-store.s3.amazonaws.com/0/93566/d6bd9046-5ee3-a7fc-5e6d-e48057af9ddb.png)


一方Raspbianの場合、ビルドしたプログラムは"実行ファイル"として扱われ、ファイラーからダブルクリックで実行することが出来るという違いがあります。
そこで、[こちらの記事: Linuxでアイコンを作成する方法](https://qiita.com/NoriakiOshita/items/303b57a5f82e779a4ec9)を参考に、ダブルクリックで実行することが出来るランチャーをデスクトップに追加しましょう。

まず、デスクトップにEmpty Fileを追加します。
Empty Fileをエディタで開き、次の文字を書いて保存します。

```
[Desktop Entry]
Type=Application
```

![Screenshot from 2017-11-18 15-49-18.png](https://qiita-image-store.s3.amazonaws.com/0/93566/6ea3a927-cf1e-3ed3-e5c0-1d73e5abde9f.png)


すると、そのファイルの属性がデスクトップエントリーファイルに変更されます。
このファイルを[右クリック]→[Properties]→[Desktop Entry]を開きます。

![Screenshot from 2017-11-18 15-49-38.png](https://qiita-image-store.s3.amazonaws.com/0/93566/c0f3dae6-ff2f-0217-c92e-7928337a991e.png)


[Desktop Entry]メニュー、"Command"項目の[Browse]ボタンを押すと、ファイラーが立ち上がるので、ビルドしたプログラムを探して選択、[Open]して関連付けます。

![Screenshot from 2017-11-18 15-50-26.png](https://qiita-image-store.s3.amazonaws.com/0/93566/57847f2e-3a6c-e407-dc0d-42a8090676c6.png)


プログラムと関連付けたら、当デスクトップエントリーファイルをダブルクリックすると、ビルドしたプログラムが実行されます。

![Screenshot from 2017-11-18 15-50-56.png](https://qiita-image-store.s3.amazonaws.com/0/93566/02af5cd2-6c45-e0b1-b497-879bfa62e19b.png)




## ７．補足：Releaseビルド時のコマンド

```bash

// GCCでコンパイルする場合
$ sudo make CXX=g++ CONFIG=Release

// LLVM-Clangでコンパイルする場合
$ sudo make CXX=clang++ "TARGET_ARCH=-march=armv7-a" CONFIG=Release

```

・CONFIG=Release
… LinuxMakefileオプションです。”Release”モードでビルドします。