Arduino CLIをMakefileで使うためのmsys+Visual Studio Codeの環境構築

# Arduino CLIをMakefileで使うためのmsys+Visual Studio Codeの環境構築

この記事は、「[Arduino UNO R4で始めるTOPPERS RTOS開発](https://qiita.com/h7ga40/items/5653d0c6ac01c4af76b8)」で使ったArduinoのコマンドラインツール`Arduino CLI`を`Makefile`から使うため、Windowsにmsysをインストールして`Visual Studio Code`で使えるようにする手順を説明する記事です。

## ソフトのインストール

`Arduino CLI`と`Visual Studio Code`に付いては、[こちらの記事](https://qiita.com/h7ga40/items/5653d0c6ac01c4af76b8)でインストールされているものとします。

`msys2`は次のリンクからダウンロードしてインストールします。

<https://www.msys2.org/>

インストーラなので簡単ですが、インストール先のフォルダには注意が必要です。ASCII文字だけで構成されたフォルダのパスで短めのパスである必要があります。この記事では標準の`C:\msys64`で説明していきます。

msys2はWindowsでUnixコマンドを扱えるようにする環境一式を扱うソフトウェアです。多数のコマンドはパッケージとして個別にインストールやアンインストール、アップデートが出来ます。

初期状態では、含まれるパッケージのそれぞれが最新状態とは限らないので、全体的なアップデートを行います。

インストールしたmsys2を実行します。種類がいくつかありますが「MSYS2 MSYS」を選択します。

![msys2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242320/6e6508e1-16bd-2db5-4b79-98d4e5bae7a3.png)

```bash
user@mycomputer MSYS ~
$ pacman -Syuu
 msys is up to date
:: Starting core system upgrade...
 there is nothing to do
:: Starting full system upgrade...
 there is nothing to do
```

次にmakeパッケージをインストールします。

```bash
user@mycomputer MSYS ~
$ pacman -S make
依存関係を解決しています...
衝突するパッケージがないか確認しています...

パッケージ (1) make-4.4.1-1

合計ダウンロード容量:        0.49 MiB
合計インストール容量:        1.61 MiB
最終的なアップグレード容量:  0.03 MiB

:: インストールを行いますか？ [Y/n] y
:: パッケージを取得します...
 make-4.4.1-1-x86_64                               505.9 KiB   264 KiB/s 00:02 [#####################] 100%
(1/1) キーリングのキーを確認                                                   [#####################] 100%
(1/1) パッケージの整合性をチェック                                             [#####################] 100% 
(1/1) パッケージファイルのロード                                               [#####################] 100% 
(1/1) ファイルの衝突をチェック                                                 [#####################] 100% 
(1/1) 空き容量を確認                                                           [#####################] 100% 
:: パッケージの変更を処理しています...
(1/1) 更新 make                                                                [#####################] 100%
:: トランザクション後のフックを実行...
(1/1) Updating the info directory file...
```

### ワークスペースの作成

`Visual Studio Code`で`msys`を使うための設定を行いたいのですが、そのためにまずワークスペースフォルダを作成します。お好みの場所でよいのですが`msys2`を使うためパスが深くならない場所に作成します。

このフォルダには`make`から`arduino-cli`が使えるかを簡単に確認するために、スケッチ例をGitHubからダウンロードして展開します。

<https://github.com/digiampietro/arduino-makefile>

緑色の`Code`ボタンを押して表示される`Download ZIP`を選択して、コード一式をダウンロードし、ワークスペースに展開します。

![Download ZIP](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242320/eb27c62a-5a11-6638-1119-3bea7100b135.png)

次に、Arduino CLIをインストールします。といっても`arduino-cli.exe`単体で動作するもので、ワークスペースフォルダに`tools`というフォルダを作ってその中に展開します。

<https://arduino.github.io/arduino-cli/0.35/installation/>

準備が終わると下記のようにフォルダとファイルが配置されます。

```plantuml
@startuml DirectryTree
salt

{
  {T
   + workspace
   ++ blink-arduino
   +++ Makefile
   +++ blink-arduino.ino
   +++ manifest.txt
   ++ blink-wemos-ota
   +++ Makefile
   +++ blink-wemos-ota.ino
   +++ manifest.txt
   +++ ota.h
   +++ wifiinfo.h.sample
   ++ tools
   +++ arduino-cli.exe
   +++ LICENSE.txt
   ++ .gitignore
   ++ README.md
  }
}
@enduml
```

`Visual Studio Code`でこのフォルダを開きます。

### Visual Studio Codeにmsysのbashをターミナルとして登録する

`Visual Studio Code`でコマンドを実行するのに使うターミナルという領域があります。
ターミナルには初期状態で次のものが登録されています。

- PowerShell
- Git Bash
- Command Prompt

登録されているターミナルの種類は、プロファイルと呼ばれていて、ユーザごとに登録される設定となっています。
ここに、`msys2`の`bash`のプロファイルを登録します。登録すると他のワークスペースでも選択できるようになります。

![ターミナル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242320/7215fc20-c4f3-3e45-6583-7ce146b78751.png)

ターミナルを開くにはメニューから「ターミナル」→「新しいターミナル」を選択するか、`Ctrl + Shift + @`を押します。

![新しいターミナル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242320/9e30bcfc-d865-5f33-886d-21b3507d3dbd.png)

ターミナル右上の`+`ボタンの横の`∨`を押して`ターミナル設定の構成`を選びます。

![ターミナル設定の構成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242320/2f637424-aac3-6f8b-2903-d1343532f0c7.png)

フィルタに`profiles`を追加して、`Terminal > Integrated > Profiles: Windows`の`.settings.jsonで編集`をクリックします。同じような名前がいくつかあるので間違えないよう確認してください。

![Terminal > Integrated > Profiles: Windows](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242320/ae3294fc-980f-241d-66fe-f8229bc7c8af.png)

ユーザー設定の`.settings.json`ファイルが開かれますので、下記の`Msys Bash`部分を追加してください。名前は`Msys Bash`でなくても良いのですが、この記事ではこの名前で説明します。

```json
"terminal.integrated.profiles.windows": {
    "PowerShell": {
        "source": "PowerShell",
        "icon": "terminal-powershell"
    },
    "Command Prompt": {
        "path": [
            "${env:windir}\\Sysnative\\cmd.exe",
            "${env:windir}\\System32\\cmd.exe"
        ],
        "args": [],
        "icon": "terminal-cmd"
    },
    "Git Bash": {
        "source": "Git Bash"
    },
    "Msys Bash": {
        "path": "C:\\msys64\\usr\\bin\\bash.exe",
        "args": [
            "--login",
            "-i"
        ]
    }
}
```

`path`にmsys2のインストールしたパスを入力します。

フォントの都合で`￥`は`\`で表示されています。これはjson文字列のエスケープ文字なので、エスケープを打ち消すため`\\`になっています。
`args`のコマンドオプションも設定します。簡単に効果を説明すると、`--login`は環境変数の`PATH`にmsysのコマンドパスが設定されます。msysのmakeを使うのに必要です。`-i`はインターラクトモードで起動する指定です。スクリプトファイルを実行するのではなく、ユーザーが対話的にコマンドを入力するモードにしたいので、このオプションを付けておきます。

### ワークスペースの設定

`Visual Studio Code`で`F1`を押して`基本設定：ワークスペース設定を開く`を選択します。

![F1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242320/f624649f-b190-77ba-ac5a-94a568be7451.png)

`Terminal > Integrated > Default Profile: windows`を探します。フィルタに`terminal default windows`を入力すると項目が絞り込まれます。

![Terminal > Integrated > Default Profile: windows](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242320/64a1ede9-9971-dbd0-db36-d727a507a4f3.png)

`.vscode\settings.json`が作成されエディタで開かれます。
ワークスペースのデフォルトプロファイルに先ほど登録した`Msys Bash`を設定します。

また、msys2のための環境構築を設定します。`CHERE_INVOKING`と`MSYS2_PATH_TYPE`、`MSYSTEM`です。`CHERE_INVOKING`は呼び出されたディレクトリをカレントディレクトリとして使う指定です。`MSYS2_PATH_TYPE`はWindows環境変数PATHを引き継ぎます。`MSYSTEM`はWindows向けのgcc環境MinGWを使用する場合は`MINGW64`などを選択しますが、今回は使わないため`MSYS2`と設定します。
さらに、`arduino-cli`が見つかるようにパス`PATH`を設定します。先ほど設定したとおり、ワークスペースフォルダに`tools`とうフォルダを作ってその中に、`arduino-cli`を配置したので、`Visual Studio Code`の変数でワークスペースフォルダを示す`${workspaceFolder}`を使って、指定しています。
ついでに`arduino-cli`で使用する環境変数`FQBN`を設定しておきます。ターゲットとしてArduino Uno R4を指定する値が入ります。

```json
{
    "terminal.integrated.defaultProfile.windows": "Msys Bash",
    "terminal.integrated.env.windows": {
        "PATH": "${workspaceFolder}\\tools",
        "CHERE_INVOKING": "1",
        "MSYS2_PATH_TYPE": "inherit",
        "MSYSTEM": "MSYS2",
        "FQBN": "arduino:renesas_uno:minima"
    }
}
```

### ターミナルがMsys Bashになりmakeが使えるか確認

`Visual Studio Code`でショートカットキー`Ctrl + Shift + @`の入力や、メニューから`ターミナル`→`新しいターミナル`を選択してターミナルを開きます。

下記のように`bash`が表示されれば成功です。

```bash
user@mycomputer MSYS2 /path/to/workspace
$ 
```

次にmakeにパスが通っているか確認します。

`make –version↲`でバージョンが表示されれば成功です。

```bash
user@mycomputer MSYS2 /path/to/workspace
$ make --version
GNU Make 4.4.1
このプログラムは x86_64-pc-msys 用にビルドされました
Copyright (C) 1988-2023 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 以降 <https://gnu.org/licenses/gpl.html>
これはフリーソフトウェアです: 自由に変更および配布できます.
法律の許す限り、　無保証　です.
```

`.vscode\settings.json`に設定した環境変数が使えるようになっているかも確認してみます。

```bash
user@mycomputer MSYS2 /path/to/workspace
$ echo $FQBN
arduino:renesas_uno:minima
```

そして、`arduino-cli`が使えるかも試してみます。

```bash
user@mycomputer MSYS2 /path/to/workspace
$ arduino-cli version
arduino-cli.exe  Version: 0.34.2 Commit: 963c1a76 Date: 2023-09-11T10:05:41Z
```

ではいよいよ`blink-arduino`を`make`してみたいと思います。

```bash
user@mycomputer MSYS2 /path/to/workspace
$ cd blink-arduino
user@mycomputer MSYS2 /path/to/workspace/blink-arduino
$ make
FQBN       is [arduino:renesas_uno:minima]
IOT_NAME   is []
OTA_PORT   is []
OTA_PASS   is []
V          is [1]
VFLAG      is [-v]
MAKE_DIR   is [/path/to/workspace/blink-arduino]
BUILD_DIR  is [build/arduino.renesas_uno.minima]
SRC        is [blink-arduino.ino]
HDRS       is []
BIN        is [build/arduino.renesas_uno.minima/blink-arduino.ino.bin]
SERIAL_DEV is [com3]
arduino-cli compile -b arduino:renesas_uno:minima -v --build-path build/arduino.renesas_uno.minima
FQBN: arduino:renesas_uno:minima
Using board 'minima' from platform in folder: C:\Users\user\AppData\Local\Arduino15\packages\arduino\hardware\renesas_uno\1.0.5
Using core 'arduino' from platform in folder: C:\Users\user\AppData\Local\Arduino15\packages\arduino\hardware\renesas_uno\1.0.5

Detecting libraries used...

(中略)

"C:\\Users\\user\\AppData\\Local\\Arduino15\\packages\\arduino\\tools\\arm-none-eabi-gcc\\7-2017q4/bin/arm-none-eabi-size" -A "D:\\path\\to\\workspace\\blink-arduino\\build\\arduino.renesas_uno.minima/blink-arduino.ino.elf"
最大262144バイトのフラッシュメモリのうち、スケッチが53712バイト（20%）を使っています。
最大32768バイトのRAMのうち、グローバル変数が4552バイト（13%）を使っていて、ローカル変数で28216バイト使うことができます。

Used platform       Version Path
arduino:renesas_uno 1.0.5   C:\Users\user\AppData\Local\Arduino15\packages\arduino\hardware\renesas_uno\1.0.5
which: no arduino-manifest.pl in (/usr/local/bin:/usr/bin:/bin:/path/to/workspace/tools:/c/Python39:/c/Users/user/AppData/Local/Arduino15/packages/arduino/tools/arm-none-eabi-gcc/7-2017q4/bin:/c/Users/user/AppData/Local/Arduino15/packages/arduino/tools/openocd/0.11.0-arduino2/bin:/c/Users/user/AppData/Local/Arduino15/packages/arduino/tools/openocd/0.11.0-arduino2/share/openocd:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl)
---> If you want to generate manifest.txt, listing used libraries and their versions,
---> please install arduino-manifest, see https://github.com/digiampietro/arduino-manifest
user@mycomputer MSYS2 /path/to/workspace/blink-arduino
$ 
```

これでArduinoのスケッチを`Visual Studio Code`でmakeでビルドする環境が出来ました。TOPPERSなどビルドに`make`を使ったソフトも多いので、Arduinoスケッチから`make`を利用するアプリの作成に繋がるステップになればよいなと考えています。