ターゲット機
とりあえずターゲット機をANBERNIC RG351MPもしくはRG351Pにする。RG35XX Hを使いたかったが、SSH(というかWiFi接続?)が安定しないので。
ターゲット機にOSをインストール
RG351P、RG351MPの場合はArkOSをインストールする。RG351MP用のArkOSはBalena Etcherでは焼けないのでApplePi-Bakerを使う。
ターゲット機はWiFiに繋いでENABLE NETWORK SERVICESしておく。これでSSH接続、SMB、Web UIが使える。Web UIはまぁ使わないと思うけど。
ArkOSの場合、SSHは ssh ark@IPアドレス、password=arkでログインする。
MacでFinderから移動->サーバへ接続(smb://ターゲット機のIPアドレス)でターゲット機のromフォルダをマウントしておく。ゲスト接続でOK。
Dockerで開発環境を作る
MacにはDockerをインストールしておく。
下記の内容でDockerfileを作成。
# ベースイメージ
FROM arm64v8/debian:bullseye
# 開発ツールをインストール
RUN apt update && apt install -y \
build-essential \
git \
cmake \
gdb \
vim \
&& apt clean
# 作業ディレクトリを設定
WORKDIR /workspace
# デフォルトのシェル
CMD ["bash"]
上記のファイルを保存したディレクトリで以下を実行:
docker build -t arm64_dev:bullseye .
作成したイメージでコンテナを起動
docker run -it --name arm64_dev_container --platform linux/arm64 arm64_dev:bullseye
もしくは既存のコンテナを再起動して利用でもよい。
docker start -ai arm64_dev
Dockerで実行ファイルを作成する
Docker コンテナを起動。
docker run -it --name arm64_dev --platform linux/arm64 arm64v8/debian:bullseye bash
もしくは
docker start -ai arm64_dev
これで、arm64v8/debian:bullseye のシェル(Linux環境)が開く。
コンテナ内で開発ツールをインストール
apt update && apt install -y build-essential git cmake gdb nano
#include <SDL2/SDL.h>
#include <iostream>
int main(int argc, char* argv[]) {
if (SDL_Init(SDL_INIT_VIDEO) != 0) {
std::cerr << "SDL_Init Error: " << SDL_GetError() << std::endl;
return 1;
}
// ウィンドウを作成
SDL_Window* win = SDL_CreateWindow("Hello SDL2",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
640, 480,
SDL_WINDOW_SHOWN);
if (win == nullptr) {
std::cerr << "SDL_CreateWindow Error: " << SDL_GetError() << std::endl;
SDL_Quit();
return 1;
}
// レンダラーを作成
SDL_Renderer* renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if (renderer == nullptr) {
SDL_DestroyWindow(win);
std::cerr << "SDL_CreateRenderer Error: " << SDL_GetError() << std::endl;
SDL_Quit();
return 1;
}
// 背景色を設定してクリア
SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255); // 緑色
SDL_RenderClear(renderer);
// 描画内容を表示
SDL_RenderPresent(renderer);
// ウィンドウを3秒間表示
SDL_Delay(3000);
// リソースの解放
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(win);
SDL_Quit();
return 0;
}
コンパイル。
g++ main.cpp -o sdl2_hello `sdl2-config --cflags --libs`
Dockerからターゲット機にコピー。これはDockerに繋がってないMac上のターミナルで行う。
ダイレクトにターゲット機のroms/portsの中に入れた方が楽(romsがどこにマウントされてるかは調べること)。
docker cp arm64_dev:/root/test1/sdl2_hello /Volumes/roms/ports
.shファイルを用意する。
#!/bin/bash
# スクリプト自身のディレクトリを取得
SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
# SDL2 実行ファイルのパス
EXECUTABLE="$SCRIPT_DIR/sdl2_hello"
# 実行
if [ -f "$EXECUTABLE" ]; then
echo "SDL2 アプリケーションを実行します: $EXECUTABLE"
"$EXECUTABLE"
else
echo "エラー: 実行ファイルが見つかりません: $EXECUTABLE"
exit 1
fi
実行属性をつけてターゲットにコピー。
chmod +x sdl_hello.sh
cp sdl_hello.sh /Volumes/roms/ports
ターゲット機で実行
EMULATIONSTATIONを再起動。
PORTSから実行する。