#1-2 開発環境を作ろう (macOS向け)【SPIKE-RTでロボコンに出よう!!】

# 目次

| 章 | タイトル | 内容 |
|:-:|:-:|:-:|
| 1 | [はじめに](#1-はじめに) | この記事について |
| 2 | [開発環境構築](#2-開発環境構築) | 環境構築について説明 |
| 3 | [最後に](#3-最後に) | この後やる事について説明 |

# 1. はじめに

この記事は [【SPIKE-RTでロボコンに出よう!!】シリーズ](https://qiita.com/koushiro/items/482162807339f4d18516) の [#1 開発環境を作ろう](https://qiita.com/koushiro/items/02dd13a797afbd568beb) に対する補足記事となります。

https://qiita.com/koushiro/items/02dd13a797afbd568beb

#1 では、開発環境構築をテーマに、主にWindows PC (本質的にはUbuntuも対象) にSPIKE-RTの開発環境を作成する方法を紹介しました。
しかし、macOSでの環境構築方法は一切紹介していませんでしたので、本記事で説明したいと思います。
（というのも、#1 執筆当時はmacを使っていなかったので…)

環境構築以外の説明 (#1の「SPIKE-RTとは?」など) は省いていきますので、そちらはご自身で #1 の記事をご覧ください。

# 2. 開発環境構築

## Step 1. ビルド環境の構築

ビルド環境を構築します。
ビルドとは要するにコンパイルすることです。

SPIKE-RTのビルド環境は、「コンテナ」というパッケージングされたものが提供されており、これを「Docker」というシステムに適用して使います。

### ソースコードのダウンロード

Dockerの話の前に、SPIKE-RTのソースコードをクローン(ダウンロード)していきます。
ソースコードは、以下のGitHub上のリポジトリにあります。

https://github.com/spike-rt/spike-rt

以下のコマンドによりソースコードをクローンしましょう。

```zsh:ターミナル.app (zsh)
% git clone https://github.com/spike-rt/spike-rt.git
```

もしSPIKEハブの **ポートFを開放した状態**  (モーターやセンサーに使える状態) でセットアップしたい場合は、#1の後に公開した「ショートカット版開発環境構築」にて紹介している、私がフォークしたGitHubリポジトリからクローンしてください。

https://qiita.com/koushiro/items/3a46a11f71a49159b2d3

↓私がフォークしたGitHubリポジトリはこちらから

https://github.com/Koushiro-Achioku/spike-rt

```zsh:ターミナル.app (zsh)
% git clone https://github.com/Koushiro-Achioku/spike-rt.git
```

クローン後、`ls` コマンドを実行し、spike-rtというフォルダが確認されればクローン完了です。

### rubyコードの修正

:::note warn
公式のリポジトリからクローンした場合は以下の作業を行ってください。
私のリポジトリからクローンした場合は対応済みのため必要ありません。
:::

SPIKE-RTのアップデートに伴い、rubyのバージョンが3系に上がったようです。
これにより、ソースコードの修正が必要な箇所があります。

編集するのは `spike-rt/asp3/cfg/pass1.rb` の 181行目 です。

```ruby:pass1.rb
# 元のコード
symvalCsv = CSV.open(symvalTableFileName, { skip_blanks: true, skip_lines: /^#/ })

# 修正後のコード
symvalCsv = CSV.open(symvalTableFileName, skip_blanks: true, skip_lines: /^#/ )
```

詳しくは **「もっと!後輩たちのEV3rt講座」** の方で詳しく解説しておりますので、そちらを参照してください。

https://qiita.com/koushiro/items/4ee879e5420260cea6c8#%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E4%BF%AE%E6%AD%A3

## Step 2. Dockerの導入

次に行うコンテナ・イメージのプルの前に、macにDockerを導入しておく必要があります。
Dockerの導入にはHomeBrewを使用しますが、ここではHomeBrewのインストール方法は省略いたします。
以下を参考にインストールしてください。

https://brew.sh/ja/

https://qiita.com/Meycha/items/2a07fcd7920d3c6af4fa

では、本題のDockerインストールを行います。

```zsh:ターミナル.app (zsh)
% brew install --cask docker
```

上のコマンドで、Dockerがインストールされるはずです。
導入完了後、以下のコマンドによりDockerが正しく入っているか確認しておくことをおすすめします。

```zsh:ターミナル.app (zsh)
% docker -v
```

`Docker version 27.4.0, build bde2b89` のように出力されれば導入完了です。
(Launchpad (アプリ一覧) にDockerが追加されているはずですが、そちらを開き、設定を行う必要があるかもしれません)

### コンテナ・イメージのプル

次に、Github上にあるDockerのコンテナ・イメージをプル(つまりダウンロード)してきます。
ターミナルを開いて、以下を実行してください。

```zsh:ターミナル.app (zsh)
% docker pull ghcr.io/spike-rt/spike-rt:v0.2.0-rich
```

プルが完了すると以下のように表示されます。

```
Status: Downloaded newer image for ghcr.io/spike-rt/spike-rt:v0.2.0-rich
ghcr.io/spike-rt/spike-rt:v0.2.0-rich
```

### コンテナのアタッチと起動

プルしてきたコンテナをDockerにアタッチして起動します。

```zsh:ターミナル.app (zsh)
% docker run --rm -it -v $(pwd):$(pwd) -w $(pwd) ghcr.io/spike-rt/spike-rt:v0.2.0-rich /bin/bash
```

ここで、行の先頭に `sudo` というコマンドがありますが、こちらは **「管理者権限で実行する」** という意味です。
この際、パスワードの入力が求められますので、macのログインに使用するパスワードを入力してください。

## Step 3. 転送方法の構築

続いて、Hubブロックをmacに接続して、ビルドした実行ファイルをHubブロックに転送する方法を構築します。

### libusbのインストール

SPIKEに実行ファイルを転送するのに使用するライブラリを、Homebrew経由でインストールします。

```zsh:ターミナル.app (zsh)
% brew install libusb
```

### PyUSBの導入

HUBブロックに実行ファイルを転送するために、Pythonのスクリプトを使用します。
又、そのスクリプト内で、DFU ModeのUSBデバイスに実行ファイルを転送するためのライブラリ `pyusb` をインストールします。

まずは、Pythonを導入する必要がありますが、今回は仮想環境下にインストールしたいと思います。
Pythonの仮想環境を、Homebrew経由でインストールします。
ターミナルを開いて、以下のコマンドを実行していきましょう。

```zsh:ターミナル.app (zsh)
% brew install python@3.10
```

次に、 `spike-rt/tools/python` のディレクトリに、Pythonの仮想環境を作成します。
最後に、仮想環境下に、Pythonのパッケージ管理ツールである `pip` を用いて、`pyusb` をインストールします。
同じくターミナルにて以下のコマンドを実行していきましょう。

```zsh:ターミナル.app (zsh)
% cd (spike-rtがあるフォルダ)
% python3 -m venv ./spike-rt/tools/python
% ./spike-rt/tools/python/bin/pip install pyusb
```

### ソースコード修正

こちらもソースコードの修正が必要な箇所があるため、修正します。
修正を行うのは `/Users/koushiro/Workspace/spike-rt/external/libpybricks/micropython/tools/pydfu.py` の `80行目`です。
以下のように書き換えてください。

```python:pydfu.py
# 修正前
getargspec = getattr(inspect, "getfullargspec", inspect.getargspec)

# 修正後
getargspec = getattr(inspect, "getfullargspec", inspect.getargs)
```

以上で、実行ファイルの転送方法の構築は完了です。

## Step 4. ビルドのテスト

それでは、構築した開発環境が正しく動作するか、ビルドのテストを行いたいと思います。
ターミナルを開いて、以下の操作を行ってください。

初めに、GithubからプルしてきたSPIKE-RTのフォルダに移動します。

```zsh:ターミナル.app (zsh)
% cd (spike-rtがあるフォルダ)/spike-rt
```

ここで、Dockerがアタッチされていない方は、アタッチしておきましょう。

```zsh:アタッチコマンド(再掲)
docker run --rm -it -v $(pwd):$(pwd) -w $(pwd) ghcr.io/spike-rt/spike-rt:v0.2.0-rich /bin/bash
```

続いて、以下のコマンドを実行して、`scripts` フォルダ内の `build-test.sh` というシェルスクリプトを実行します。

```zsh:ターミナル.app (zsh)
% ./scripts/build-test.sh
```

ここで必要なファイルの生成、およびコンパイルが行われるため、ターミナルには文字がザーっと流れます。
正しくビルドできたかどうかを見分けるには、実行完了時にターミナルに以下👇の文字列が表示されているかを確認すれば良いです。

```zsh:ターミナル.app (zsh)
arm-none-eabi-objcopy -O binary -S asp asp.bin
+ cd ..
```

これにて、開発環境構築は完了です!!

# 3. 最後に

Windows(WSL) 版では、前章のビルドテストまでで#1が終わっているので、ここから [#2 エディタを使おう(VisualStudio Code)](https://qiita.com/koushiro/items/dbfc45be2e05a44bc273) に合流して貰えればと思います。
今回、実行ファイルをHubブロックに転送するテストは行っていませんので、出来ればそのテストを行う [#3 テンプレートファイルとシェルスクリプトの作成](https://qiita.com/koushiro/private/3cf4cff56e0bd90cac7a) まで一気に行い、確認していただくのが良いかと思います。

本編: [#1 開発環境を作ろう](https://qiita.com/koushiro/items/02dd13a797afbd568beb)
次回: [#2 エディタを使おう(VisualStudio Code)](https://qiita.com/koushiro/items/dbfc45be2e05a44bc273)