Apple Silicon (ARM, M1) のmacOSにaarch64とx86_64のhomebrewを共存させる


ARM版Macで開発を始めている方も多いかと思います。
Rosetta2やDocker Desktop on macのおかげでウェブ開発において全く開発ができないということはないんじゃないかと思います。

一方で、Dockerを使わずにネイティブで開発するにはいくつかの問題もまだ残っています。
例えば、homebrewでpythonのいくつかのバージョンがインストールできないとか、Rustがインストールできないとか、そういう問題にぶつかることがあるでしょう。

そこで、本記事ではhomebrewのx86_64 (intel) 版と、aarch64 (ARM) 版を共存させ、どちらを使うか選べるようにします。

Homebrewのインストール

ARM版homebrewのインストール

こちらは普通にインストールします。ターミナルを開き、aarch64であることを確認してインストールしましょう。

uname -m # "arm64" が表示されることを確認する
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

Intel版homebrewのインストール

こちらは手動でインストールします。ARM版は /opt/homebrew/ にインストールされると思うので、Intel版は /opt/homebrew-x86_64/ にインストールすることにしました。

ターミナルをそのままで起動すると、aarch64アーキテクチャで動いてしまうため、x86_64で動くターミナルを作ります。

「ユーティリティ」フォルダにある「ターミナル」を「ターミナル(intel)」とでも名前をつけてコピーします。

新しくコピーした方のターミナルの情報を開き、「Rosettaを利用して開く」にチェックをつけます。

こちらのターミナルを起動すると、x86_64アーキテクチャで動作するターミナルを開くことができます。

ではこちらでもhomebrewをインストールしましょう。

uname -m # "x86_64" が表示されることを確認する
sudo mkdir /opt/homebrew-x86_64
sudo chown `whoami`:staff /opt/homebrew-x86_64
curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C /opt/homebrew-x86_64

起動スクリプトをいい感じにする

~/.zprofile で、稼働中のアーキテクチャによって使うhomebrewが変わるように次のように記述しました。

nodenvなどの初期化は、片方のアーキテクチャでインストールしている場合には片方のアーキテクチャでのみ実行されるようにしましょう。

arch=`uname -m`
if [ "$arch" = "x86_64" ]; then
    export PATH=$PATH:/opt/homebrew-x86_64/bin
else
    export PATH=$PATH:/opt/homebrew/bin
    # eval "$(nodenv init -)" などはどちらかインストールした方に書く
fi

それでも完全ではない...

bisonはaarch64ならインストールできるのに、x86_64ではインストールできないとか...
x86_64でしかインストールできないものがaarch64でしかインストールできないものに依存してたりすると詰む