Trimuiの開発環境の構築

2021/08/07
Windows版のツールチェインの名称とパス及びライブラリのインストール先を修正しました。
導入済みの方はtoolchainのインストールとライブラリの再セットアップをお願いします。

In English is here

https://github.com/bluexe203/trimui-toolchain_for_windows

# Trimuiとは
http://trimui.com/
クレジットカードサイズの携帯ゲーム機で、Allwinner F1C200sというSocが使われています。
このSocはゲームギアミクロ等にも使われているようです。
CPUはARM926EJ-Sでかなり古い世代のものが使われています（NintendoDSのCPUと同等の世代？）
海外ではdiscordで主に情報交換がされており、homebrewのソフトウェアもリリースされています。日本でもフォーラムがあり日本人のソフトウェア製作者の方も情報発信をされています。
海外の有志の方々のおかげでLinux用のtoolchainは用意されていますが、
Windows用のtoolchainがなかったため、自力で構築することにしてみました。

# Linux(おすすめ)

https://git.crowdedwood.com/trimui-toolchain/

buildrootというtoolchain作成用の環境を使用しています。

```
sudo apt install docker docker-compose
sudo apt install git
sudo apt install make

git clone https://git.crowdedwood.com/trimui-toolchain
make shell
```

# Windows

## 開発環境の作成の準備

※全行程で少なくとも数時間はかかります。

必要なもの

- Ubuntu20.04LTS

- Linaro Toolchain

- msys2

- SDL

※以下のビルド済みのToolchainを使用する場合は[Windowsでの作業](#windowsでの作業)から始めて下さい。
[以下の手順で作成したビルド済みWindows用Toolchain](https://github.com/bluexe203/trimui-toolchain_for_windows/releases/download/v1.0/trimui-toolchain.tar.xz)

# Ubuntu20.04LTS上での作業

### 要点
- Linaro Toolchainの使い方について
    - abeフォルダとは別にworkspaceフォルダを作成しworkspaceからスクリプトを呼び出す必要がある。
    - 今回はARM926EJ-S専用ですが、別のCPU用にビルドする場合はCPUの指定を変えれば良いです。
- Windows向けのビルド
    - Linuxの用のarmコンパイラを作成してから、それを一部利用しWindowsのarmコンパイラを作成する。

### パッケージのインストール

VMWarePlayerを使用します。WSL2とかでもおそらく可能です。

ターミナルを起動します。

```
sudo apt update
#必須では無いが入れておくと便利
sudo apt install open-vm-tools
sudo apt install open-vm-tools-desktop
sudo apt install cifs-utils

#開発環境ビルド用
sudo apt install build-essential
sudo apt install mingw-w64
sudo apt install python
sudo apt install flex bison autogen automake autoconf libtool texinfo gawk libncurses5-dev libpython2.7-dev gcc-multilib g++-multilib dejagnu lsb zlib1g-dev
```

### git-new-workdirのインストール

Linaro Toolchainのビルドに使用するABEというスクリプトの内部で必要になります。

```
sudo apt install git

sudo chmod 777 /usr/local/share
mkdir -p /usr/local/share/git-core/contrib/workdir
cd /usr/local/share/git-core/contrib/workdir
wget https://raw.githubusercontent.com/git/git/master/contrib/workdir/git-new-workdir
chmod +x git-new-workdir
ln -s /usr/local/share/git-core/contrib/workdir/git-new-workdir /usr/local/bin/git-new-workdir
```

### Linaro Toolchainの取得

Trimuiの公式のアプリはこのバージョンを使用しているようです。

https://releases.linaro.org/components/toolchain/binaries/6.4-2017.11/arm-linux-gnueabi/

```
gcc-linaro-6.4.1-2017.11-linux-manifest.txt
gcc-linaro-6.4.1-2017.11-win32-manifest.txt
これらのファイルをダウンロードします。
2つのファイルの
gcc_stage1_flags
gcc_stage2_flags
を以下のように書き換えます。(--with-tune=cortex-a9 --with-arch=armv7-aを削除して--with-cpu=arm926ej-sを追加する)
```
書き換え後の状態

```
gcc_stage1_flags="--with-mpc=${local_builds}/destdir/${host} --with-mpfr=${local_builds}/destdir/${host} --with-gmp=${local_builds}/destdir/${host} --disable-__cxa_atexit --with-gnu-ld --disable-libssp --disable-multilib--disable-libquadmath --enable-tls --disable-libmudflap --enable-threads --without-isl --without-cloog --with-float=soft --disable-decimal-float --with-abi=aapcs-linux --with-cpu=arm926ej-s --with-float=soft --with-mode=arm --disable-libgomp --disable-libssp --disable-libquadmath --disable-threads --without-headers --with-newlib --disable-libmudflap --disable-bootstrap --disable-decimal-float --disable-libgomp --disable-libatomic --disable-libsanitizer --disable-plugins --disable-libitm --enable-languages=c --with-sysroot=${local_builds}/sysroot-arm-linux-gnueabi --disable-shared --with-glibc-version=2.18"
gcc_stage2_flags="--with-mpc=${local_builds}/destdir/${host} --with-mpfr=${local_builds}/destdir/${host} --with-gmp=${local_builds}/destdir/${host} --disable-__cxa_atexit --with-gnu-ld --disable-libssp --disable-multilib--disable-libquadmath --enable-tls --disable-libmudflap --enable-threads --without-isl --without-cloog --with-float=soft --disable-decimal-float --with-abi=aapcs-linux --with-cpu=arm926ej-s --with-float=soft --with-mode=arm --enable-languages=c,c++ --enable-shared --disable-libgomp --with-build-sysroot=${sysroots} --with-sysroot=${local_builds}/destdir/${host}/arm-linux-gnueabi/libc"
```

### ABE（ビルドスクリプト）の取得

```
git clone https://git.linaro.org/toolchain/abe.git
cd abe/
git checkout 333add3ae07b35815672a8a1d03eb443e5ea87fe
```

### ディレクトリの準備
abeと同じ階層にworkspaceを作成する(以降はこのworkspaceフォルダで作業を行います)

```
mkdir workspace
cd workspace/
```
### Linux用のビルド

LinuxでWindows用のビルド環境を作成するには

1. Linux用のtoolchain(GCC+ライブラリ)を作成(build=x86_64-linux
   target=arm-linux-gnueabi)
2. Linux用のtoolchainにパスを通す
3. Windows用のtoolchainを作成(build=x86_64-linux
   host=i686-w64-mingw32 target=arm-linux-gnueabi)

の手順を踏む必要があります。（カナディアンクロスビルド）

Windows用のビルドに使用するglibcに1.で作成したコンパイラが必要なためこのような手順になります。

```
#configure
../abe/configure --with-git-reference-dir=/home/tcwg-buildslave/snapshots-ref
#ビルド実行（かなり時間がかかります）
../abe/abe.sh --manifest gcc-linaro-6.4.1-2017.11-linux-manifest.txt --release 2017.11 --tarball --build all
```
### Windows用のビルド
パスの追加

```
export PATH=$PATH:/home/user/workspace/builds/destdir/x86_64-unknown-linux-gnu/bin
```

host.confの編集(workspaceにあります)

```
host=i686-w64-mingw32
を追加
```

mingw32のバグの修正

そのままビルドするとビルド途中で以下のエラーが発生します。

```
'::hypot' has not been declared
以下のように修正する
sudo gedit /usr/lib/gcc/i686-w64-mingw32/9.3-win32/include/cmath
1121: using ::hypot; → using ::_hypot;
```
configureはせずにbuildのみ行います。

```
#ビルド実行（かなり時間がかかります）
../abe/abe.sh --manifest gcc-linaro-6.4.1-2017.11-win32-manifest.txt --release 2017.11 --tarball --build all
```

workspace/snapshotsに以下のファイルが出来れば完了です。

```
gcc-linaro-6.4.1-2017.11-i686-mingw32_arm-buildroot-linux-gnueabi.tar.xz
```

このファイルをWindows上にコピーすれば、Linuxでの作業は終了です。

# Windowsでの作業

### msys2のインストール

https://www.msys2.org/

インストーラの指示にしたがってインストールを行います。

```
C:\msys64 にインストールします。
```

msys2.iniの設定

```
HOME=home/trimui
PATH=/opt/trimui-toolchain/bin
```

パッケージのインストール

msys2.exeを起動します。

```
pacman -S make
pacman -S libtool
```

toolchainのインストール

[ビルド済みWindows用Toolchain　:　trimui-toolchain.tar.xz](https://github.com/bluexe203/trimui-toolchain_for_windows/releases/download/v1.0/trimui-toolchain.tar.xz)

を展開します。（c:\trimui-toolchain.tar.xzに予めコピーした場合）

```
cd /opt
#ファイルパスは適宜変えて下さい
tar xvf /c/trimui-toolchain.tar.xz

/opt/trimui-toolchain
が作成されます。
```
コンパイラの確認

```
arm-buildroot-linux-gnueabi-gcc -v
```

コンパイラの情報が表示されればOKです。

### ライブラリのインストール
gitからセットアップ用のスクリプトを取得して実行します。

```
pacman -S git
pacman -S pkg-config
git clone https://github.com/bluexe203/trimui-toolchain_for_windows.git
cd trimui-toolchain_for_windows
bash Msys2_LibrarySetup.sh
```
以下のライブラリがインストールされます

|||
| -------------- | ---------------- |
| zlib-1.2.8     | sdl-1.2.15       |
| bzip2-1.0.6    | sdl_gfx-2.0.23   |
| libjpeg-9b     | sdl_image-1.2.12 |
| libpng-1.2.56  | sdl_mixer-1.2.12 |
| freetype-2.6.3 | sdl_net-1.2.8    |
| boost1.76.0    | sdl_sound-1.0.3  |
| alsa-lib-1.1.1 | sdl_ttf-2.0.11   |

これで基本的な環境の設定は終了です。
追加でライブラリ等が必要な場合は適宜インストールを行う必要があります。

# Tips

主にデバッグや環境の確認用の手順です。環境構築には直接関係ない内容になります。

### Linuxのコンテナの中身の確認

コンテナを起動しない方法

https://qiita.com/haniokasai/items/ad23509cd27b1a4c064a

```
#!/bin/sh
CONTAINERNAME=trimui-toolchain
DOCKERHOST=unix:///var/run/docker.sock
LOWERDIR=`docker -H ${DOCKERHOST} inspect --format='{{ .GraphDriver.Data.LowerDir }}' ${CONTAINERNAME}`
UPPERDIR=`docker -H ${DOCKERHOST} inspect --format='{{ .GraphDriver.Data.UpperDir}}' ${CONTAINERNAME}`
WORKDIR=`docker -H ${DOCKERHOST} inspect --format='{{ .GraphDriver.Data.WorkDir}}' ${CONTAINERNAME}`
#事前にsudo mkdir /mnt/test を実行しておく
MOUNTPOINT=/mnt/test

sudo mount -t overlay -o lowerdir=${LOWERDIR},upperdir=${UPPERDIR},workdir=${WORKDIR} overlay ${MOUNTPOINT}
```

コンテナを起動した場合

```
docker起動後
sudo nautilus
/var/lib/docker/overlay2/更新日付が最新のサブディレクトリmergedのあるフォルダ
```