M1 Mac の Homebrew を 3.0 に移行する
はじめに
2020 年の 12 月から Apple M1 チップ搭載の Mac mini を使っています。Rosetta 2 のおかげで Intel CPU 向けに作られたアプリケーションもパフォーマンスが問題になることなく使えています。
いくつかのコマンドラインツールを使う関係で、パッケージマネージャーである Homebrew を使っているのですが、これを Apple M1 チップ搭載の Mac でどう使うのか?が Qiita や Zenn といった情報共有プラットフォーム上で話題になっていました。
そして 2021/02/05 になり、 Apple M1 チップに正式対応した Homebrew がリリースされました。
正式対応版ではありますが、それまでにインストールしたパッケージを自動的に Apple M1 向けのものにアップデートしてくれるわけではなく、Terminal.app や iTerm 2 などのターミナルアプリを Rosetta 2 で動かしている場合は引き続き Intel 向けのものが使われます。
Apple M1 向けの環境に移行する手順を考えてみました。
Homebrew をインストールする
Homebrew を Apple M1 チップが搭載された Mac かつ、Rosetta 2 を経由させないターミナルアプリ経由でインストールすると、
/opt/homebrew/bin/brew
にインストールされます。もしも Rosetta 2 で動かしているターミナルアプリで Intel プラットフォーム向けの環境を先にインストールしている場合は、単純に brew コマンドを使うと
/usr/local/bin/brew
側のものが使われてしまうので、フルパスを指定するなど、明示的に Apple M1 向けの brew コマンドを使う必要があります。私はフルパスを入力するのが面倒なので、一時的に brewm1 というエイリアスを作りました。 arch -arm64e を付けて、Rosetta 2 で動かしているターミナルアプリからでも ARM64 環境として実行させています。
# Homebrew command for Apple M1
alias brewm1='arch -arm64e /opt/homebrew/bin/brew'
※ Fish Shell の文法です
パッケージを移行する
まず、 Homebrew でインストールしているパッケージをリスト化し、それをテキストファイルとして出力します。
brew leaves > ~/my_brew_intel.txt
次に brewm1 を使ってこのリストのパッケージをインストールします。
xargs brewm1 install --cask < ~/my_casks_intel.txt
これで Intel プラットフォーム向けのパッケージのうち、 Apple M1 向けのパッケージが存在していればそちらがインストールされます。
また、 Homebrew Cask のものも移行できます (意味があるのかは置いといて) 。
brew list --cask -1 > ~/my_casks_intel.txt
xargs brew install --cask < ~/my_casks_intel.txt
Rosetta 2 を経由しないターミナルでは /opt/homebrew/bin を優先したい
私は Rosetta 2 経由で動かす iTerm 2 と、 Rosetta 2 を経由させない Terminal.app の 2 つを使っています。 Rosetta 2 を経由させた場合は /usr/local/bin を参照し、 Rosetta 2 を経由させない場合は /opt/homebrew/bin を優先したいと思いました。
set current_architecture (uname -m)
if test "$current_architecture" = "arm64"
set PATH /opt/homebrew/bin $PATH
end
そこで、 uname -m で取得できるアーキテクチャが arm64 の場合は PATH の頭に /opt/homebrew/bin を挿入することで解決しました。 Apple M1 側に完全移行すればこのような対応は不要だと思いますが、過渡期として、または明示的に Intel プラットフォームのものと使い分けたい場合には有効ではないでしょうか?
終わりに
自分のメモ書き的な内容ですが、同じようなことをやりたいと思った人の助けになれば幸いです。本格的な開発、クリエイティブ向けの Apple Silicon 搭載 Mac シリーズの誕生も楽しみですね。