M1 MAX MacbookのHomebrew管理
この記事がもう全てを解決してくれそう。
つまり現状のM1 Macユーザーは、あらゆるアプリがM1 Macに対応するまでのしばらくの間、二つのアーキテクチャ環境(今回はarm64eとx86_64)を使い分ける必要がある、ということです。ちなみにarm64eがApple Siliconの環境に対応しています。長いので今後はARMと呼びます。
この必要に応じてx86_64を使うとなった時にパッケージマネージャーであるHomebrewの扱いが問題になります。Homebrewは最近ARMへのインストールに正式に対応しましたが、Homebrewでインストールできるパッケージが全てARMに対応しているわけではありません。公式ではARM用のHomebrewとRosettaでエミュレートしてるアーキテクチャ環境のHomebrewでインストール場所が分かれるようになっています。あくまで一時的な対応の結果かもしれませんが、公式でもアーキテクチャで使い分けを推奨していると行っても過言ではありません。
その対処法として複雑にbrewのパスそのものをいじくり回す記事もちらほら見かけましたが、brew周りの>PATHを直接触るのは以下のようなバグの原因になります。Rosetta環境なのにARM環境用のHomebrewを参照しちゃう
brew コマンドだけはARMの方を参照しているが、brewでインストールしたパッケージ群はRosetta側の方を見てるせいでパッケージがnot foundになる
今回はほぼ既存のbrewのデフォルトの仕組みに乗っ取った手法をとることで、直接パスを変更する複雑さ等を回避します。具体的にはshellenvを活用することで今回はこの二つのHomebrew管理をログイン時に切り替えることで、できる限り単純に・快適に実現していきたいと思います。
シンプルイズベスト!
[引用] https://zenn.dev/junjunjunk/articles/4b230519d87de4
uname -mで現在ターミナルがarm64のCPUで作動しているのか、Rosetta経由でintelモード(x86_64)で動作しているのかがわかる
以下がm1 cpu(arm)
$ uname -m
arm64
以下がRosetta(x86_64)
$ uname -m
x86_64
rosettaモードを簡単にGUIで変更するには、Finder上でターミナルのinfoを見て、rosettaに変える。
Homebrewのセットアップの手順
アーキテクチャごとにインストールして使うときにそれぞれ切り替えて運用するようにする。
メリットは、パッケージの参照がごちゃごちゃにならないようにできること。
XCodeとRosettaのインストール
とりあえずHomebrewに必要なのでXCodeをインストールして、起動して諸々をインストールする。
Rosettaも同様。
それぞれのアーキテクチャでHomebrewをインストールする。
それぞれのアーキテクチャ環境でHomebrewがインストールされている
(それぞれのアーキテクチャ環境でbrewのインストールコマンドを叩くだけでいいです)
[引用] https://zenn.dev/junjunjunk/articles/4b230519d87de4
以下のbrew公式より、コマンドをコピーしてきて、
armとrosettaのそれぞれで以下のコマンドを打ち込む
rosettaインストール後にarchというアーキテクチャを変更するコマンドが使えるようになるらしい。
以下をインストールする際に/bin/bash -c以下は変更されているかもしれないので、homebrew公式を参照すること。
# 2022/0912現在 brew公式にて
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
x86_64でインストール方法
arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
ARM64でインストール方法
arch -arm64e /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
brewのインストール場所
armとxx86でそれぞれbrewのインストール先が変わっている
混合してしまうトラブルを避けるために、このような仕様に現時点でなっている。
arm64e -> /opt/homebrew/bin/brew
x86_64 -> /usr/local/bin/brew
まず、Homebrewではインストール時に使用してるアーキテクチャ環境でデフォルトのインストール場所が以下のように異なります。また、それぞれのbrewで同名のパッケージがインストールされても、もちろん異なるディレクトリに入ります。
[引用] https://zenn.dev/junjunjunk/articles/4b230519d87de4
pathを通す
arm64でhomebrewインストール後
- Run these two commands in your terminal to add Homebrew to your PATH:
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> /Users/<username>/.zprofile
eval "$(/opt/homebrew/bin/brew shellenv)"
- Run brew help to get started
- Further documentation:
https://docs.brew.sh
x86_64でhomebrewインストール後
- Run these two commands in your terminal to add Homebrew to your PATH:
(echo; echo 'eval "$(/usr/local/bin/brew shellenv)"') >> /Users/omakazu/.zprofile
eval "$(/usr/local/bin/brew shellenv)"
- Run brew help to get started
- Further documentation:
https://docs.brew.sh
~/.zprofile
にeval ""でそれぞれのbrew周りのpathを通すためのbrewのshell envを呼び出すコマンドを書いておくと勝手にpathを追加してくれる。
.zprofileはzshにログインシェルの場合に1度だけ読み込まれる・実行される設定ファイルなのでここに書いてpathを通しておく。
それぞれのアーキテクチャを認識してログイン時にpathを切り替えてくれるように以下のようなコードを~/.zprofile
に書き込んでおく。
ARCH=$(uname -m)
if [[ $ARCH == arm64 ]]; then
echo "Current Architecture: $ARCH"
eval $(/opt/homebrew/bin/brew shellenv)
elif [[ $ARCH == x86_64 ]]; then
echo "Current Architecture: $ARCH"
eval $(/usr/local/bin/brew shellenv)
fi
brewコマンドへのパスだけを弄っても、brewでインストールしたパッケージを参照するときのパスがバグることが想定されたりとパスをダイレクトで操作するとバグの原因になりがちなので、できる限り元の公式の仕様通りshellenvを活用した形式を勧めます。
[引用] https://zenn.dev/junjunjunk/articles/4b230519d87de4
切り替え動作
アーキテクチャの切り替えのときには~/.zprofile
を参照してくれない。
ログインシェルが動いた時しか.zprofileを実行してくれないので、能動的に自分で変えたい時は、
~/.zshrc
にaliasを書き込んでおく。
~/.zshrc
に書いておけば、PC起動時に毎回読み込んでくれる。
alias arm64="exec arch -arch arm64e /bin/zsh --login"
alias x8664="exec arch -arch x86_64 /bin/zsh --login"
execで起動しているコマンドのarchでアーキテクチャを切り替えて、--loginで~/.zprofile
を再読み込みしてくれる。
source ~/.zshrc
で一度起動しておく。
これで簡単に切り替えれるようになる。
使い方。
$ arm64
Current Architecture: arm64
$ uname -m
arm64
$ which brew
/opt/homebrew/bin/brew
$ x8664
Current Architecture: x86_64
$ uname -m
x86_64
$ which brew
/usr/local/bin/brew