開発環境 on M1 Mac with Homebrew

# はじめに

※この文章はベータ版です。随時アップデートしていく予定です。

[M1　Macの開発環境](https://qiita.com/shibukawa/items/797b7cbb7e530842e6f7) が MacPorts を採用した場合の情報＋αなので、
Homebrewをパッケージマネージャとして採用した場合の情報＋αを
書いています。
(なるべく被らないようにしています。)

自分の環境に入れているモノを中心にM1への対応状況をリストしています。

Homebrewで提供されているモノはそれを、Homebrewで提供されていないモノ
は、インストール方法を紹介しています。

リストへの編集リクエスト、ウェルカムです。

# Homebrew on M1 Mac

Rosetta2を使えばIntel Mac用のパッケージ(x86_64)をそのまま利用
できますが、その場合、管理するパッケージ全て、Resetta2でIntel Mac用の
Homebrewパッケージ(x86_64)のバイナリを変換して動作させることになり
ます、Rosetta2が優秀でもオールラウンドな変換を行えるとは考えにくく、
Rosetta2頼みの環境構築は得策とはいえないので、M1(AppleSilicon)Mac用
のパッケージ(arm64)を利用します。

M1 Macネイティブで、Homebrewのカバーするソフトウェア(Homebrew
パッケージ)群の多くが動作するようになってきていて、ほぼ全てのソフトウェア
群が動作するステージに入っています。

Homebrewパッケージ(フォーミュラ)のM1対応状況に関しては [このページ](https://github.com/Homebrew/brew/issues/7857) にまとめ
(英語)が作成され、随時更新されていました( [つづき](https://github.com/Homebrew/brew/issues/10152) があります)。

Homebrewのインストールについては[こちら](https://qiita.com/asip2k25/items/c019c766a53f4b28df6d#homebrewのインストール-on-m1-mac)

# 対応状況

## IDE / エディタ

| 状況  | アプリ      | バージョン | arch | インストール | メモ(記録日) |
|:----:|:----------:|:--------:|:-----:|:---------:|:----------:|
| ✔︎    | Vim        | 9.0.0350_1 | arm64 | Homebrew  |  |

## 開発ツール / パッケージマネージャ

| 状況  | アプリ      | バージョン | arch | インストール    | メモ(記録日) |
|:----:|:----------:|:--------:|:-----:|:------------:|:----------:|
| ✔︎    | Homebrew   | 3.1.8     | arm64 | -           |            |
| ✔︎    | llvm       | 15.0.1  | arm64 | Homebrew    |            |
| ✔︎    | [gcc](https://qiita.com/asip2k25/items/7088667e2177ab061dd2#gcc)        | 12.2.0  | arm64 | Homebrew    |  |
| ✔︎    | jemalloc   | 5.3.0     | arm64 | Homebrew    |            |
| ✔︎    | CMake      | 3.21.3    | arm64 | Homebrew    |            |
| ✔︎    | Ninja      | 1.11.1    | arm64 | Homebrew    |            |
| ✔︎    | Git        | 2.37.3    | arm64 | Homebrew    |            |
| ✔︎    | Yarn       | 1.22.19   | arm64 | Homebrew    | ボトル未提供 |
| ✔︎    | direnv     | 2.32.1    | arm64 | Homebrew    | ボトル未提供 |
| ✔︎    | mecab      | 0.996     | arm64 | Homebrew    |            |

## プログラミング言語

| 状況  | アプリ      | バージョン | arch | インストール | メモ(記録日) |
|:----:|:----------:|:--------:|:-----:|:---------:|:----------:|
| ✔︎    | Ruby       | 2.7.2    | arm64 | Homebrew  |            |
| ✔︎    | Ruby       | 3.1.1    | -     | rbenv<br> (ruby-build 20201225) | 2020/12/25 |
| ✔︎    | Ruby       | 3.0.0    | arm64 | Homebrew  | 2020/12/28 |
| ✔︎    | Ruby       | 3.1.2_1  | arm64 | Homebrew  |  |
| ✔︎    | rbenv      | 1.2.0    | arm64 | Homebrew  |            |
| ✔︎    | ruby-build | 20220910.1 | arm64 | Homebrew  |            |
| ✔︎    | Node.js    | 15.11.0   | arm64 | Homebrew  | 2021/03/04 |
| ✔︎    | Node.js    | 18.9.0   | arm64 | Homebrew  |  |
| ✖️   | [Deno.js](https://qiita.com/asip2k25/items/7088667e2177ab061dd2#denojs)  | 1.6.1 | arm64 | Homebrew  | 実験的サポート、Rust待ち、Rust1.50-nightlyで動作   |
| ✔︎   | [Deno.js](https://qiita.com/asip2k25/items/7088667e2177ab061dd2#denojs)  | 1.7.2 | arm64 | Homebrew  | 2021/01/23 |
| ✔︎   | [Deno.js](https://qiita.com/asip2k25/items/7088667e2177ab061dd2#denojs)  | 1.8.1 | arm64 | Homebrew  | 2021/03/13 |
| ✔︎   | [Deno.js](https://qiita.com/asip2k25/items/7088667e2177ab061dd2#denojs)  | 1.9.2 | arm64 | Homebrew  |  |
| ✔︎   | [Deno.js](https://qiita.com/asip2k25/items/7088667e2177ab061dd2#denojs)  | 1.26.1 | arm64 | Homebrew  |  |
| ✔︎   | [Deno.js](https://qiita.com/asip2k25/items/7088667e2177ab061dd2#denojs)  | 1.26.1 | arm64 | cargo |  |
| ✔︎   | [Deno.js](https://qiita.com/asip2k25/items/7088667e2177ab061dd2#denojs)  | 1.26.1 | arm64 | rustup + cargo |  |
| ✖️   | [Rust](https://qiita.com/asip2k25/items/7088667e2177ab061dd2#rust)       | 1.48.0   | arm64 | Homebrew  |            |
| ✔︎   | [Rust](https://qiita.com/asip2k25/items/7088667e2177ab061dd2#rust)       | 1.49.0-bata   | arm64 | Homebrew  | 2020/12/27 |
| ✔︎    | [Rust](https://qiita.com/asip2k25/items/7088667e2177ab061dd2#rust)       | 1.49.0   | arm64 | Homebrew  | 2021/01/10 |
| ✔︎    | [Rust](https://qiita.com/asip2k25/items/7088667e2177ab061dd2#rust)       | 1.50.0   | arm64 | Homebrew  | 2021/03/04 |
| ✔︎    | [Rust](https://qiita.com/asip2k25/items/7088667e2177ab061dd2#rust)       | 1.64.0   | arm64 | Homebrew  |  |
| ✔︎    | rustup (-init) | 1.64.0  | arm64 | Homebrew |            |
| ✔︎    | Rust       | 1.50.0 | arm64 | rustup |            |
| ✔︎    | Rust       | 1.64.0 | arm64 | rustup |            |
| ✔︎    | Python     | 3.9.13_4| arm64 | Homebrew  |            |
| ✔︎    | Python     | 3.10.6_2| arm64 | Homebrew  |            |
| ✔︎    | OpenJDK    | 16 preview | arm64 | Homebrew  | 2021/01/16 |
| ✔︎    | Go         | 1.19.2 | arm64 | Homebrew |            |
| ✔︎    | Perl       | 5.34.1   | arm64 | Homebrew  |            |
| ✔︎    | Dart       | 2.18.2   | arm64 | Homebrew  |            |
| ✔︎    | PHP        | 8.0.6    | arm64 | Homebrew  |            |

## DB / サーバー

| 状況  | アプリ      | バージョン | arch | インストール | メモ(記録日) |
|:----:|:----------:|:--------:|:-----:|:---------:|:----------:|
| ✔︎    | PostgreSQL | 14.5_2   | arm64 | Homebrew  |            |
| ✔︎    | MySQL      | 8.0.30   | arm64 | Homebrew  |            |
| ✔︎   | MariaDB    | 10.5.9   | arm64 | Homebrew  |            |
| ✔︎    | Nginx      | 1.23.1   | arm64 | Homebrew  |            |
| ✔︎    | h2o       | 2.2.6_1  | arm64 | Homebrew  |            |
| ✔︎    | Apache2(httpd) | 2.4.54 | arm64 | Homebrew |           |
| ✔︎    | unbound    | 1.16.1 | arm64 | Homebrew |           |

## ライブラリ

| 状況  | アプリ       | バージョン | arch | インストール | メモ(記録日) |
|:----:|:-----------:|:---------:|:-----:|:---------:|:----------:|
| ✔︎    | OpenSSL     | 1.1.1q    | arm64 | Homebrew |           |
| ✔︎    | readline    | 8.1       | arm64 | Homebrew |           |
| ✔︎    | libxml2     | 2.10.2    | arm64 | Homebrew |           |
| ✔︎    | libxslt     | 1.1.37    | arm64 | Homebrew |           |
| ✔︎    | libiconv    | 1.16      | arm64 | Homebrew |           |
| ✔︎    | libffi      | 3.3       | arm64 | Homebrew |           |
| ✔︎    | ImageMagick | 7.1.0-48 | arm64 | Homebrew |           |
| ✔︎    | libvips(vips) | 8.13.1   | arm64 | Homebrew |           |
| ✔︎    | libsass     | 3.6.4     | arm64 | Homebrew | 公式非推奨  |
| ✔︎    | dart-sass(sass)   | 1.55.0 | arm64 | Homebrew | ボトル未提供 |
| ✔︎    | [Qt](https://qiita.com/asip2k25/items/7088667e2177ab061dd2#qt) (qt) | 5.15.5_1 | arm64 | Homebrew | 2020/12/27 |
| ✔︎    | [Qt](https://qiita.com/asip2k25/items/7088667e2177ab061dd2#qt) (qt@5) | 6.0.3 | arm64 | Homebrew | 2020/03/05 |
| ✔︎    | [Qt](https://qiita.com/asip2k25/items/7088667e2177ab061dd2#qt) (qt) | 6.3.2 | arm64 | Homebrew |  |
| ✔︎    | groonga     | 12.0.7    | arm64 | Homebrew |           |

## デスクトップアプリケーション

| 状況  | アプリ      | バージョン | arch | インストール | メモ(記録日) |
|:----:|:----------:|:--------:|:-----:|:---------:|:----------:|
| ✔︎    | Cakebrew | 1.3    | Universal | Homebrew |[公式サイト](https://www.cakebrew.com) |
| ✔︎    | [Docker](https://qiita.com/asip2k25/items/7088667e2177ab061dd2#docker)     | 4.4.2 | arm64 | [公式サイト](https://www.docker.com/products/docker-desktop)  | non-free |
| ✔︎    | Rayon | 1.9 | Universal | AppStore | [github](https://github.com/Lakr233/Rayon/) |
| ✔︎    | Sourcetree | 4.1.6    | Universal | [公式サイト](https://www.sourcetreeapp.com) |      |
| ✔︎    | Fork | 2.7    | Unversal | [公式サイト](https://fork.dev) | non-free |
| ✔︎    | VS Code | 1.56.1    | Universal | [公式サイト](https://code.visualstudio.com) |      |
| ✔︎    | Sequel Ace | 3.3.1    | arm64 | AppStore  |            |
| ✔︎    | Insomnia | 2022.1.0 | x86_64 | [公式サイト](https://insomnia.rest/download/) |            |
| ✔︎    | CotEditor  | 4.1.3    | x86_64 | AppStore  |            |
| ✔︎    | mi         | 3.6      | Universal | [公式サイト](http://www.mimikaki.net)  |            |
| ✔︎    | Hidden Bar | 1.8      | x86_64 | AppStore  | [公式サイト](https://github.com/dwarvesf/hidden) |
| ✔︎    | Maccy | 0.22.2 | Universal | [公式サイト](https://maccy.app) |            |
| ✔︎    | Tabby | 1.0 | Universal | [公式サイト](https://tabbyapp.com/) |           |
| ✔︎    | Dropbox | 121.4.4267 | Universal | [Desktop Client Build](https://www.dropboxforum.com/t5/Desktop-client-builds/ct-p/101003000) | |
| ✔︎    | Evernote | 10.31.6 | Universal | AppStore |            |
| ✔︎    | Slack      | 4.23.0   | Universal | AppStore  |            |
| ✔︎    | Skype| 8.81.0.268 | x86_64 | [公式サイト](https://www.skype.com/ja/get-skype/download-skype-for-desktop/) |  |
| ✔︎    | zoom.us | 5.10.0 | Universal | [公式サイト](https://zoom.us) |  

## ボトル未提供

リストのメモに「ボトル未提供」と書かれている場合、Homebrewでのインストール時に
オプションを付けて、ソースからビルドすることになります。

```
% brew install --build-from-source パッケージ名
```

# GCC

現在、M1未対応ではあるものの、下記のブランチにて対応作業(GCC12?向け)が進行中です。
https://github.com/iains/gcc-darwin-arm64  

M1の正式サポートを含む GCC は2021年の中頃かそれ以降のリリースが
予定されています。

公式には、GCC12? 以前に、段階的にM1対応を行なっていくようなプランは、
ないようです。

macOS 11 では、gcc or g++ コマンドを叩くと、Clangを呼び出すので、
大抵の場合、問題はありません。

但し、GCCを前提として、ビルドにClangとの互換性のないGCCの(GCCには
あるもののclangにはない)機能を利用しているHomebrewパッケージの場合、
clangではビルド中にこけて、ビルドが失敗してしまいます。

来年半ばかそれ以降にリリースされる GCC12? を待つわけにはいかないので、
GCC前提のHomebrewパッケージの多くは、フォーミュラレベルでClangに
対応するか、アップストリームにClangでのビルドスクリプトが追加される
ことになるはずです。
(GCC前提のHomebrewパッケージの多くは、開発言語としてClangのサポートする
C系の言語で作成されているはずです。)

GCCに含まれるC系以外のプログラミング言語で作成されているソフトウェアについては、
GCC前提となっている場合、開発言語をサポートする、GCC12? より早期にM1対応の実現
する、他のコンパイラ＆ツールチェインの利用を検討するか、GCC12? のリリースを待つ
しかないのが現状です。

[2020/12/25]
状況が変わったので、追記します。

上記のブランチから GCC10 へのバックポート作業が下記ブランチにて進行中です。
https://github.com/fxcoudert/gcc/tree/gcc-10-arm
https://github.com/iains/gcc-darwin-arm64/issues/31

このブランチから作成されたパッチが適用された GCC10.2 の M1 (暫定)対応版が
利用可能になっています。

gcc & g++ は clang で利用されているので、コンパイルする際には、gcc -> gcc-10、
g++ -> g++-10、とする必要があります。

[2021/05/02]
M1への正式対応が予定されていた GCC11、GCC11.1.0 はリリースされていますが、
M1対応は含まれていません。
https://github.com/Homebrew/homebrew-core/pull/74843#issuecomment-827745294
https://gcc.gnu.org/gcc-11/changes.html

GCC11.1.0 のフォーミュラ作成は進行中です。
https://github.com/Homebrew/homebrew-core/pull/74843

# Rust

バックエンドとして利用しているllvmはM1対応済みなので、M1対応は
今年末か来年頭にリリース予定の1.49から開始される予定です。

M1への最適化(コンパイラを含む)は 1.50 以降、順次、行われていくことに
なるはずです。

1.49.0 がリリースされれば、Homebrewパッケージが更新され、利用可能に
なるはずです。
( https://github.com/Homebrew/homebrew-core/pull/67535 )

[2020/12/27]
Rust用フォーミュラのM1対応が、昨日、完了し、1.49.0-betaが利用可能と
なっています。1.49.0のリリース待ちです。
( https://github.com/Homebrew/homebrew-core/pull/67535 )
( https://github.com/Homebrew/brew/issues/7857#issuecomment-751295329)

[2020/12/31]
1.49.0 がリリースされました。近日中に利用可能となるはずです。
https://blog.rust-lang.org/2020/12/31/Rust-1.49.0.html

[2021/01/04]
Rust1.49.0のフォーミュラ、作成中です。
https://github.com/Homebrew/homebrew-core/pull/68089

[2021/01/05]

1.49.0 に含まれている Cargo.lock ファイルが古いままで更新されていないために、
Homebrew 開発チームが運用している CI でエラーが発生していて、解消するために
アップストリームでの Cargo.lock ファイルの更新が必要となっている状況です。

ローカルの開発環境でのビルド＆テストには成功している模様。

Cargo.lockファイルが古いバージョンのままであることに起因する
CIでのエラーに関しては、ひとまずスキップされる模様。

[2021/01/10]
1.49.0 が利用可能になっています。

CIでRust依存のソフト群のビルドも一緒に行われていて、
その中でビルドに失敗するモノがあり、エラーとなっていた模様。

いくつかについては フォーミュラ or CI が修正され、それでも
エラーとなるモノについては、リグレッションではないと判断
され、それらは個別に対応されることになったようです。

[2021/03/04]
1.50.0が利用可能になっています。

# Deno.js

1.6.0から M1の実験的サポートが追加されているものの、開発言語であるRustが
M1対応作業中となっているため、Rustの対応待ちとなっています。

1.6.0は Rust1.50-nightly で動作確認済みの模様。

Rust1.49 がリリースされれば、Homebrewパッケージが更新され、利用可能に
なるはずです。

[2020/12/28]
Deno 1.6.3のフォーミュラ、作成中です。
https://github.com/Homebrew/homebrew-core/pull/66920

[2020/01/14]
Deno が v8 のビルドに利用している v8公式のGoogle製ビルドツール gn
がend of life となった Python2.x で書かれているため、
Homebrew でのフォーミュラ作成が停まっている模様。
https://github.com/Homebrew/homebrew-core/pull/68461
(Homebrew は、end of life となったモノを提供しない方針で、
Python2.x は現在、提供されていません。)

Denoでも、gnのこの問題に対する issue が上がったことがあります、
v8 開発サイドで対応すべき問題であり、Deno 開発サイドで対処する
問題ではない、という結論で、issue がクローズされていました。

(先日(2021/02/16)、GoogleがPSFのビジョナリー・スポンサーになり、
CPythonの開発支援 及び 基本的な周辺ツール・サービスの改善に乗り出す、
ことを発表しました、v8公式のGoogle製ビルドツール gn の3.xへの移行が
あるかもしれません。

[GoogleがPython Software Foundationへの支援を強化「ビジョナリースポンサー」に](https://www.publickey1.jp/blog/21/googlepython_software_foundationcpython.html) )

[2020/01/17]
v8公式のGoogle製ビルドツール gn の件については、Appleがレガシー対応のために
macOS 11 に含めている Python 2.xを利用する形になっています。

Rust1.49.0(1.50.0-beta) に含まれている Cargo.lock ファイルが古いままで更新
されていないために、Denoのビルドが途中でエラーになっています、解消する
ためにアップストリームでの Cargo.lock ファイルの更新が必要となっている状況の
ようです。
https://github.com/denoland/deno/issues/8992

[2020/01/17]
Homebrew で Deno が利用可能になるまでに、まだしばらく、時間がかかりそうな状況です。

`Homebrew + Rust` or`Homebrew + Rust + Rustup` で Deno をインストールする
方法を紹介します。

## Rust

```
% brew install rust
% cargo install deno --locked
% vi ~/.zshrc
export CARGO_HOME="$HOME/.cargo"    # 追加
export PATH="$CARGO_HOME/bin:$PATH" # 追加
export PATH="$HOME/.deno/bin:$PATH" # 追加
% vi ~/.zshrc
```

## Rust + Rustup

```
% brew install rust
% brew install rustup-init
% rustup-init
% vi ~/.zshrc
export CARGO_HOME="$HOME/.cargo"    # 追加
export PATH="$CARGO_HOME/bin:$PATH" # 追加
% source ~/.zshrc
% rustup install beta # なくても、OK
% rustup default beta # なくても、OK
% cargo install deno --locked
% vi ~/.zshrc
export PATH="$HOME/.deno/bin:$PATH" # 追加
% source ~/.zshrc
``` 

[2020/01/20]
Deno1.7.0がリリースされました、Cargo.lock ファイルの問題が
修正されています。

Denoのフォーミュラ、1.7.0に更新中です。
https://github.com/Homebrew/homebrew-core/pull/66920

CIでのテストが通れば、Homebrewパッケージが更新され、利用可能に
なります。

[2021/01/23]
Deno 1.7.0、利用可能になりました。

[2021/03/04]
Deno1.8.0は、まだ利用可能になっていませんが、
`deno upgrade`することで利用できます。

Deno 1.8 Release Notes
https://deno.land/posts/v1.8

[2021/03/05]
Deno 1.8.0、利用可能になっています。

# Qt

https://github.com/Homebrew/homebrew-core/pull/67170

Qt5のQtWebEngineがM1 Mac上で動作させるためにパッチされていないChromiumを
使っているので、Qt5のビルドに失敗するようです。

Qt6ではQtWebEngineのfixが既に行われています。

Qt6からQt5へのこののfixのバックポートがデカすぎてARMでのコンパイルに失敗する
問題への対応が進行中です。
https://github.com/Homebrew/homebrew-core/pull/67170

Qt6のフォーミュラの作成も進行中です。
https://github.com/Homebrew/homebrew-core/pull/67536
-> https://github.com/Homebrew/homebrew-core/pull/68134
(上記の2つのプルリクエストはメインブランチにマージされることなく
クローズされています。)

[2020/12/27]
QtWebEngineを含まないQt5.15.2 が利用可能になっています。
Qt5.xにはCMakeの問題があるので、シムリンクは行われません。

[2021/03/03]
-> https://github.com/Homebrew/homebrew-core/pull/70826

Qt 6.0.1、利用可能になっています。

[2021/05/15]
Qt 6.1.0、既に利用可能になっています。


# Docker

DockerのM1対応版は、現在、Developer Preview のステージなので、
現在、仕事のプロジェクトで利用するのはあまりオススメできません。

仕事のプロジェクトで採用されているか勉強用途での利用で、問題が
発生した時に自分で対応できるのなら、インストールして利用して
問題ないと思います。

Developer Preview は Docker Developer Preview Program に
参加すると招待されるSlackチャンネル経由でダウンロードできます。

[AppleのM1チップ対応「Docker Desktop」プレビュー版が登場、WSL2のGPU対応も](https://www.publickey1.jp/blog/20/applem1docker_desktopwsl2gpu.html)

Developer Preview の入手方法については、[M1 Macの開発環境](https://qiita.com/shibukawa/items/797b7cbb7e530842e6f7#docker) にも記載
されています。

M1対応DockerDesktop の Tech Preview の 7版(Preview7) が Docker Blog の記事
にあるリンクからダウンロードできるようになっています。

Docker Developer Preview Program に参加するほどではないけど、M1対応Docker を
触ってみたい方はどうぞ。

[Download and Try the Tech Preview of Docker Desktop for M1](https://www.docker.com/blog/download-and-try-the-tech-preview-of-docker-desktop-for-m1/)

M1 対応 Docker Desktop は、x86 用コンテナイメージのビルドと実行にも対応しているようです。
https://www.publickey1.jp/blog/20/apple_m1docker_desktopcpux86docker.html

[2021/03/04]

Apple M1 Tech Preview
https://docs.docker.com/docker-for-mac/apple-m1/

from
New Docker Desktop Preview for Apple M1 Released
https://www.docker.com/blog/new-docker-desktop-preview-for-apple-m1-released/

[2021/03/22]
Docker、Apple Siliconに対応した「Docker Desktop RC 1」をリリース
https://applech2.com/archives/20210320-docker-desktop-for-apple-silicon-rc-1.html

[2021/04/16]
Apple M1チップに対応した「Docker Desktop」が一般リリース
https://forest.watch.impress.co.jp/docs/news/1319217.html