Trimuiの開発環境の構築


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

In English is here

Trimuiとは

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

Linux(おすすめ)

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用Toolchain

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の公式のアプリはこのバージョンを使用しているようです。

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のインストール

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

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

を展開します。(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のコンテナの中身の確認

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

#!/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のあるフォルダ