macOSでGBAの開発環境を整える

# これは何？
macOSでGame Boy Advance（GBA）のソフトを開発するために必要なツールのinstallやセットアップを行い、実際にサンプルをGBAのエミュレータで動かすまでの方法を示す。


# 必要なもの
- macOS
    - 今回はSequoia 15.0で試した
- Xcodeのコマンドラインツール
    - `$ xcode-select --install`
- mgba
    - GBAのエミュレータ
    - `$ brew install mgba`
- devkitPro
    - 主に任天堂のゲーム機向けの開発ツールチェーンを提供するプロジェクト
    - GBA、Nintendo DS、Nintendo Switch、Wiiなどのゲームを開発できる

# devkitProのセットアップ
devkitProはinstallすれば終了というわけでもないので順に解説する。

## install
Githubの最新のreleaseから[devkitpro-pacman-installer.pkg](https://github.com/devkitPro/pacman/releases/tag/v6.0.2)をダウンロードする。
![スクリーンショット 2024-09-24 23.23.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237700/0abe44d3-64b3-0df0-b1f0-df196accad50.png)
macOS Sequoiaの場合だと、installerを開こうとするとセキュリティの問題で止められるので、設定アプリ→プライバシーとセキュリティから「このまま開く」をクリックしてinstallする。

## 依存しているライブラリとツールのinstall
以下のコマンドでGBA開発用のライブラリとツールをinstallする
何をinstallするか聞かれるが全て必要なのでそのままEnterを押す。

```bash
$ sudo dkp-pacman -S gba-dev

:: There are 19 members in group gba-dev:
:: Repository dkp-libs
   1) armv4t-pkg-config  2) catnip  3) devkitarm-cmake  4) devkitarm-crtls  5) gba-cmake  6) gba-examples
   7) gba-pkg-config  8) libfat-gba  9) libgba  10) libtonc  11) maxmod-gba
:: Repository dkp-osx
   12) devkitARM  13) devkitARM-gdb  14) flock  15) gba-tools  16) general-tools  17) grit  18) mmutil
   19) pkg-config

Enter a selection (default=all):
```
(ここで`gba-dev`ではなく`nds-dev`や`switch-dev`にするとDSやSwitchの環境を整えられる)

更に聞かれるが`Y`でEnterする
```bash
resolving dependencies...
looking for conflicting packages...

Packages (21) devkitarm-rules-1.5.1-1  dkp-cmake-common-utils-1.5.2-1  armv4t-pkg-config-0.28-1  catnip-0.1.0-1
              devkitARM-r65-1  devkitARM-gdb-14.1-1  devkitarm-cmake-1.2.2-1  devkitarm-crtls-1.2.6-1
              flock-0.4.0-1  gba-cmake-1.0.1-1  gba-examples-20240626-1  gba-pkg-config-0.28-4
              gba-tools-1.2.0-2  general-tools-1.4.4-1  grit-0.9.2-1  libfat-gba-1.1.5-1  libgba-0.5.4-1
              libtonc-1.4.3-3  maxmod-gba-1.0.15-1  mmutil-1.10.1-1  pkg-config-0.29.2-3

Total Download Size:    75.59 MiB
Total Installed Size:  314.50 MiB
Net Upgrade Size:      308.65 MiB

:: Proceed with installation? [Y/n]
```
すると諸々installされる。

## 環境変数のセット
後ほどサンプルのMakefileで参照されるので環境変数をセットする。
devkitProは/opt/devkitproにinstallされる。
```bash
$ vim ~/.zshrc
```

```bash
### devkitPro(GBA)用
export DEVKITPRO=/opt/devkitpro
export DEVKITARM=$DEVKITPRO/devkitARM
export PATH=$PATH:$DEVKITARM/bin
```

```bash
$ source ~/.zshrc
```

これで環境構築done.

# サンプルを実行
devkitpro/example/にサンプルがあるので移動
```bash
$ cd $DEVKITPRO/examples/
```

examples/のgbaフォルダごと別のフォルダにコピーしてそこへ移動
```bash 
cd 任意のフォルダ/gba
```

gba/にはMakefileが存在し、各フォルダにサンプルが入っている状態。
```bash
 $ ls
Makefile	audio		img		template	xboo
README.md	graphics	mbv2		utility
```
そのままmakeすると、各フォルダのMakefileも走り、各フォルダに.elfと.gbaが生成される
```bash
$ make
```

例えばgba/template/template.gbaをクリックして実行すると以下のようになる。
![スクリーンショット 2024-09-24 20.06.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237700/6fecdeea-0fba-3000-f45e-31401013ab1c.png)

# なぜgbaフォルダをコピーするのか
コピーせず元のままでmakeすると`Permission denied`になる。そこで`$ sudo make`する必要があるが、今度は以下のように「DEVKITARMの環境変数が宣言されてない」とエラーになる。
```bash
Makefile:6: *** "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM".  Stop
```
これは`sudo`が現在のユーザではなく`root`として実行することになるので、設定した環境変数が引き継がれなくエラーになっている。
なのでコピーすることで`$ make`だけで実行できるようにする。

# おわりに
この記事をなぜ書いたかというと、SwiftでGBA開発ができることを知り、色々と試しているうちに「これSwiftじゃなくて普通にCで書いた方が楽じゃない？ネットに転がっている解説記事やサンプルもCで書かれたものだし。」と当たり前のことを思い始め、環境構築しようと思ったら今更しかもmacOSで環境構築してる人が少なくて少し苦戦したのでまとめてみました。
何か間違いなどあればご指摘ください。

# 参考
- https://devkitpro.org/wiki/Getting_Started
- https://gist.github.com/joshenders/4e43259eb641ce2342dea9416154c2c1
- https://devkitpro.org/viewtopic.php?t=8852