Homebrew 3.0.0 での Apple Silicon 版と Intel 版の使い分け。

Homebrew で 3.0.0 で Apple M1 に正式対応したようですが、あくまで brew 本体が M1 に対応しただけで、brew install でインストールされたパッケージ ( bottle) は部分的に M1 対応バイナリがあったりなかったりします。

M1 対応していない bottle は、結局 Intel 用の homebrew を別インストールして共存させる必要があるようです。

Step 1. brew のインストール

  • Rosetta をインストール
    • 他のアプリをインストール時に 1回は聞かれると思いますが、まだだったら下記を。
$ softwareupdate --install-rosetta --agree-to-license
  • M1 対応版をインストール (普通に公式ページに載っている方法)
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
Password:
==> This script will install:
/opt/homebrew/bin/brew
/opt/homebrew/share/doc/homebrew
/opt/homebrew/share/man/man1/brew.1
/opt/homebrew/share/zsh/site-functions/_brew
/opt/homebrew/etc/bash_completion.d/brew
/opt/homebrew
.....
  • Intel 版をインストール (頭に arch -x86_64 をつける)
$ arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" Password: ==> This script will install:
/usr/local/bin/brew
/usr/local/share/doc/homebrew
/usr/local/share/man/man1/brew.1
/usr/local/share/zsh/site-functions/_brew /usr/local/etc/bash_completion.d/brew /usr/local/Homebrew 
.....
  • 2種類の brew はご覧のように、brew 本体も install された bottle も別のディレクトリ群に格納されるため、混じることはありません。

Step 2. PATH を通す

  • やりたいこと
    • brew で install された bottle は、M1 版がある時は優先、なければ Intel 版を見に行くようにしたい
  • 直接下記のようにベタっと path を M1 x 2種, Intel x 2種下記並べてもよいのですが
export PATH=/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:/usr/local/sbin:$PATH
  • インストール時に書かれている一文 eval $(… shellenv) を 2回並べることで、見やすくはなります。PATH に追加された結果は先ほどと同様になります。
eval $(/usr/local/bin/brew shellenv)
eval $(/opt/homebrew/bin/brew shellenv)
  • 優先するはずの M1 が後に書かれているのはなんで? と思うかもしれませんが、これで合っています。なぜならこの shellenv は、常に既存の PATH の先頭に乗っかって追加しようとするからです。

Step3. brew を使う時

  • 何もつけずに brew install すると M1 版が起動する (PATH で優先しているから)
$ brew install ...
  • 頭に arch と絶対パスをつけると Intel 版が起動する
$ arch -x86_64 /usr/local/bin/brew install ...
  • Note: 面倒だからといって /usr/local/bin を省略するとおこられます
    (M1 版の brew が Intel アーキテクチャで起動されてしまったから)
$ arch -x86_64 brew install rbenv
Error: Cannot install under Rosetta 2 in ARM default prefix (/opt/homebrew)!
To rerun under ARM use:
    arch -arm64 brew install ...
To install under x86_64, install Homebrew into /usr/local.
  • Note2: Terminal の使い分けは必要ありませんでした。
    • Rosetta 指定したものを起動してからでないとだめ、という記事を見かけますが、多分 Homebrew 3.0.0 以前の beta の時はそうせざるを得なかったのではと思います。

Step 4. 本当にちゃんと別管理になってるの?

$ arch -x86_64 /usr/local/bin/brew list
autoconf	pkg-config	readline

$ brew list
anyenv				libffi
autoconf			libidn2
bdw-gc				libtasn1
boost				libtool
c-ares				libunistring
emacs				nettle
gettext				nghttp2
git				node
gmp				openssl@1.1
gnutls				p11-kit
grep				pcre
guile				pcre2
icu4c				pkg-config
jansson				readline
jemalloc			reattach-to-user-namespace
libev				source-highlight
libevent			unbound

大丈夫そうです。

ものすごい熱量で M1 対応が進んでいるようですし、brew 側も遅かれ早かれ 1種類だけで、両方を統合管理できるようになると思いますが、ひとまずこの方法でいきたいと思います。

おしまい。