QMK Firmwareのビルド環境を最新化する

# この記事の目的

WindowsでQMK Firmware(以下、QMK)のビルド環境がうまく構築できない、ファームウェアのビルドに失敗する、以前はファームウェアがビルドできたが最新化しようとしたら失敗する、うまくファームウェアがビルドできなければビルド環境を捨てて作り直せばいいと思っている、といった人向けに、2021/9/30現在におけるビルド環境構築時のポイントやビルド環境の最新化方法についてまとめた。
なお、QMKの更新状況によってはこの記事の内容は陳腐化するので注意。

# QMKのビルド環境の概要

自作キーボードにはAVRやARMなどのMCUが使用されることが多いが、これらのMCU向けのファームウェアをビルドするには[クロスコンパイラ](https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AD%E3%82%B9%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9)を準備する必要がある。Windowsでは、[MSYS(MSYS2)](https://www.msys2.org/)と[MSYSで利用できるパッケージ群](https://packages.msys2.org/package/)から必要なパッケージをインストールすることで、これらのクロスコンパイラやその他のツールを簡単に準備することができる。

WindowsでQMKのファームウェアをビルドする場合、このMSYSを利用したビルド環境を作るのが公式の推奨手順になっている。また、QMKのビルド環境には、MSYSのほかに[QMK CLI](https://github.com/qmk/qmk_cli)というコマンドラインツールが必要で、これはpythonで作成されている。QMK CLIは[Python Package Index(PyPI)](https://pypi.org/)で公開されているいくつかのパッケージを使用しているため、pythonの他にこれらのパッケージのインストールも必要である。なお、QMK CLI自身も[PyPIで公開されている](https://pypi.org/project/qmk/)パッケージである。

このように、QMKのビルド環境ではMSYSとpythonのパッケージを利用しているため、これらのパッケージのインストールや更新が正しく行われていないと、ファームウェアのビルドに失敗する原因となる。また、QMK FirmwareのソースコードはGitHubで公開されているため、ソースコードを取得するにはGitコマンドによる操作が必要になっている。

## QMK MSYS

[QMKの公式のビルド環境構築手順](https://docs.qmk.fm/#/newbs_getting_started)では、[QMK MSYS](https://msys.qmk.fm/)というものを導入するのが推奨されているが、これは標準のMSYSにクロスコンパイラ、ファームウェアの書き込みツール、QMK CLI、ターミナルアプリであるConEmuなどを追加してアイコンなどをQMK用にカスタマイズしたものである。標準のMSYSとQMK MSYSの一番の違いは、起動するとminttyの代わりにConEmuが使用されることと、ホームディレクトリのパスがWindowsのホームディレクトリになっていること(これは `/etc/nsswitch.conf` を少し修正すれば戻せる)、標準のMSYSの起動スクリプトやバイナリなどが存在しないことくらいで大した違いはなく、後は必要なパッケージがあらかじめインストールされているかどうかである。

従って、MSYSをQMKのためだけに導入する場合はもちろん、MSYSをQMK以外に使用する場合でもQMK MSYSをインストールするのが最も簡単である。もちろん、公式ドキュメントにMSYS単体からのビルド環境構築手順も書かれていて、手順も短いのでMSYS単体から構築しても良い。ただし、現在のところ1つ致命的な問題があるため後述の対策が必要である。

## GitHub/Git

自作キーボード界隈でビルド環境構築の次に難しいと思われているものがGitHubやGitの操作だろう。とりあえずmasterブランチには公式リポジトリと同期する以外の変更を加えなければ、決まりきったコマンドをいくつか実行するだけで最新のソースコードを取得することができるので、その方法を真似するだけで良い。

# QMKビルド環境の構築

QMK MSYSまたはMSYSのインストール手順(QMKのソースコードの取得も含む)は、[公式のインストール手順](https://docs.qmk.fm/#/newbs_getting_started)を参照。ただし、いくつか触れられていない分かりにくいことがあるので、ここではその点について補足する。

## 64bit版のWindowsがインストールされていない

QMKは64bit環境向けのインストールスクリプトしか用意されていないため、64bit版のWindowsをインストールしておく必要がある。64bitに対応していないようなCPUの場合はまず新しいPCを買うべし。

## Windowsのアカウント名に半角英数・半角ハイフン・半角アンダーバー以外の文字を含んでいる

これは必須ではなく推奨だが、Windowsのアカウント名に半角英数・半角ハイフン・半角アンダーバー以外の文字を含んでいる場合は、無用なトラブルを避けるため半角英文字で始まるアカウントを新規に作成してそのアカウントに切り替える。なお、アカウント名には半角英数・半角ハイフン・半角アンダーバー以外の文字を含めないこと。
アカウント名を変更したくない場合は、リポジトリのクローン先フォルダを変更し、半角英数・半角ハイフン・半角アンダーバー以外の文字(ドライブレターの直後のコロンとパスの区切り文字である\マークは除く)を含まないパスにする。

## QMK MSYS/MSYSのインストールパスに半角英数・半角ハイフン・半角アンダーバー以外の文字を含んでいる

QMK MSYS/MSYSのインストールパスに半角英数・半角ハイフン・半角アンダーバー以外の文字を含んでいる場合は、無用なトラブルを避けるため一度アンインストールして半角英数・半角ハイフン・半角アンダーバー以外の文字(ドライブレターの直後のコロンとパスの区切り文字である\マークは除く)を含まないパスにインストールし直す。また、各フォルダ名の先頭はハイフンで始まっていないこと。

## `qmk setup` コマンド実行中にQMK MSYS/MSYSが勝手に終了してしまう

MSYSの主要なパッケージ(パッケージ管理用のコマンドである `pacman` や、MSYSのターミナルアプリである `mintty` など)の更新があると、MSYSが勝手に終了してしまう(通常はY/Nで終了確認を求められるが、自動的にYを応えるオプションで実行されるため終了してしまう)。この場合はQMK MSYS/MSYSを起動し直してもう一度 `qmk setup` を実行する。

## セットアップが進まない

`qmk setup` コマンド実行中にドライバのインストールが行われるが、この時Windowsの権限昇格の許可を求められる。このダイアログが前面に表示されないため、許可を求められていることに気づかずずっと待っている可能性がある。セットアップが進んでないように感じたらタスクバーで許可を求められていないか確認する。

## リポジトリのクローン先フォルダパスを変更したい

公式インストール手順にも説明があるが、`qmk setup -H <path>` と引数にクローン先フォルダパスを指定することで変更できる。

## クローンするリポジトリを自分のアカウントのリポジトリ(forkしたリポジトリ)にしたい

公式インストール手順にも説明があるが、`qmk setup <github_username>/qmk_firmware` と引数にクローンするリポジトリ名を指定することで変更できる。

## MSYSでビルド環境を構築したがファームウェアのビルドができない

QMKに登録されたキーボードやキーマップが増えすぎてビルドできなくなっているため、https://github.com/qmk/qmk_firmware/issues/13416#issuecomment-874362327 のコメント中にあるリンクから `make.exe` をダウンロードし、MSYSの `/usr/bin` (デフォルトだと `C:\msys64\usr\bin`)に上書きコピーする。
ちなみに、QMK MSYSは同様の対策版が既にインストールされているためこの対応は不要。

なお、`make.exe` を更新するようなMSYSのパッケージ更新があった場合は、Visual Studioをインストールして

```shell-session
editbin.exe /stack:134217728 C:\msys64\usr\bin\make.exe
```

というコマンドを実行する(パスは環境に合わせて適宜修正)。これは `make.exe` のスタックサイズを大きくするコマンドで、上述のリンクの `make.exe` も同様にスタックサイズを大きくしたものである。

# QMKビルド環境の最新化

構築済みのQMKビルド環境を最新化する方法について、QMKソースコードの最新化、QMK MSYS/MSYSの最新化、QMK CLIの最新化の3つに分けて説明する。

## QMKソースコードの最新化

QMK MSYS/MSYSを起動して以下のようにコマンドを実行すると、QMKとQMKのライブラリ群のソースコードを最新化できる。

### QMK公式リポジトリをクローンしている場合(`qmk setup` を実行した場合)

```shell-session
cd <qmk_firmwareフォルダ>
git fetch
git merge
make git-submodule
```

`make git-submodule` コマンド実行時にQMK CLIに関するメッセージが表示されることがあるが、ここでは無視して良い。

### 自分のアカウントのQMKリポジトリをクローンしている場合(`qmk setup <github_username>/qmk_firmware` を実行した場合)

あらかじめ以下のコマンドを実行して公式リポジトリを参照できるように設定しておく。

```shell-session
cd <qmk_firmwareフォルダ>
git remote add upstream https://github.com/qmk/qmk_firmware
git fetch --all
```

この設定がされている前提で、以下のコマンドを実行する。

```shell-session
cd <qmk_firmwareフォルダ>
git fetch --all
git merge upstream/master
make git-submodule
```

`make git-submodule` コマンド実行時にQMK CLIに関するメッセージが表示されることがあるが、ここでは無視して良い。

## QMK MSYS/MSYSの最新化

以下のコマンドを実行することでQMK MSYS/MSYSを最新化できる。

```shell-session
pacman -Syu
```

MSYSのパッケージ管理ツールである `pacman` 自体に更新がある場合、一度終了するかどうか確認されるため、終了後に再度QMK MSYS/MSYSを起動してもう一度コマンドを実行する。

ここで何らかのエラーが出た場合は、インターネット接続の問題かMSYS側の更新によるトラブルだと考えられるため、表示されたエラーメッセージに従って対処するしかない。

## QMK CLIの最新化

QMK MSYS/MSYSを起動して以下のようにコマンドを実行することでQMK CLIを最新化できる。

```shell-session
python3 -m pip install -U qmk
```

QMK CLI以外のpythonパッケージを最新化する場合は以下のコマンドを実行する。

```shell-session
python3 -m pip install -U -r requirements.txt
```

## トラブルシューティング

ファームウェアのビルドができない場合、QMK CLIやpythonパッケージが問題になっているケースが多い。この場合、QMK CLIとpythonパッケージをアンインストールしてから再度インストールし直すと問題が解決する可能性が高い。

QMK MSYS/MSYSを起動して以下のようにコマンドを実行する。

```shell-session
cd <qmk_firmwareフォルダ>
python3 -m pip uninstall qmk
python3 -m pip uninstall -r requirements.txt
python3 -m pip install qmk
```