M1 MacのHomebrew環境構築:arm64ネイティブとRosetta 2利用の使い分けとトラブルシューティング
はじめに
M1チップ搭載のMacBook Pro (macOS Ventura 13.x) で開発環境を構築する過程において、Homebrewでパッケージをインストールした際、アーキテクチャに起因する問題に遭遇した。具体的には、which brew コマンドが /opt/homebrew/bin/brew ではなく /usr/local/bin/brew を指しており、意図せずIntel (x86_64) 版のパッケージがインストールされる、あるいはビルドに失敗する事象が発生した。
本稿は、この問題の原因を分析し、arm64ネイティブ環境とRosetta 2を利用したx86_64互換環境のHomebrewを適切に共存・管理するための手順をまとめた技術的備忘録である。
原因
M1チップをはじめとするApple Silicon搭載MacのCPUアーキテクチャは arm64 である。一方、従来のIntel製CPUを搭載したMacは x86_64 アーキテクチャを採用している。このアーキテクチャの違いが、問題の根本的な原因である。
-
Homebrewのインストールパス: Homebrewは、実行されるCPUアーキテクチャを検知し、インストール先ディレクトリを自動的に切り替える。
-
arm64 (ネイティブ):
/opt/homebrew -
x86_64 (Rosetta 2経由):
/usr/local
-
arm64 (ネイティブ):
-
Rosetta 2: Appleが提供する互換レイヤーであり、
x86_64アーキテクチャ用にコンパイルされたアプリケーションやコマンドラインツールをarm64アーキテクチャ上で実行可能にする。Rosetta 2 を利用してターミナルからHomebrewのインストールスクリプトを実行した場合、x86_64版として/usr/local以下にインストールされる。 -
PATH環境変数: シェルがコマンドを探す際に参照するディレクトリのリストが
PATH環境変数に定義されている。このPATHの中で/usr/local/binが/opt/homebrew/binより先に記述されている場合、シェルは/usr/local/bin/brewを優先して実行する。これにより、M1 Mac上でも意図せずx86_64版のHomebrewが使用されることになる。
解決策
arm64ネイティブ版のHomebrewを優先的に使用し、必要に応じてx86_64版と使い分けるための設定手順を以下に示す。
1. 現状の確認
まず、現在の環境でどちらのアーキテクチャが動作しているか、また、どのbrewコマンドが実行されているかを確認する。
-
アーキテクチャの確認
uname -mコマンドで現在のシェルの動作アーキテクチャを確認する。M1 Macのネイティブ環境であればarm64と表示される。uname -m #=> arm64 -
インストールされているbrewのパスを確認
which -a brewコマンドで、PATH上に存在する全てのbrewコマンドのパスを表示する。which -a brew #=> /usr/local/bin/brew #=> /opt/homebrew/bin/brewこの結果は、2つのバージョンのHomebrewがインストールされている可能性を示唆している。
2. arm64ネイティブ版Homebrewのインストールと設定
arm64ネイティブ版のHomebrewがインストールされていない、または設定が不完全な場合は、以下の手順を実行する。
-
インストール
Homebrew公式サイト に記載されているインストールコマンドをターミナルで実行する。このコマンドは現在のアーキテクチャを自動で判別し、arm64環境では/opt/homebrewにインストールを行う。/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" -
PATHの設定
インストール完了後、ターミナルに以下のようなメッセージが表示される。これは、/opt/homebrew/binをPATH環境変数に追加するための指示である。==> Next steps: - Run these two commands in your terminal to add Homebrew to your PATH: (echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/your_user/.zprofile eval "$(/opt/homebrew/bin/brew shellenv)"macOSのデフォルトシェルはzshであるため、指示に従い
.zprofileまたは.zshrcに設定を追記する。個人的な設定は.zshrcにまとめるのが一般的である。echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zshrcその後、設定を即時反映させる。
source ~/.zshrcbrew shellenvコマンドは、Homebrewを使用するために必要な環境変数(PATHを含む)を設定するためのシェルスクリプトを生成する。evalはそのスクリプトを実行するコマンドである。これにより、/opt/homebrew/binがPATHの先頭に追加され、常にネイティブ版が優先されるようになる。
3. Rosetta 2版Homebrewの共存と使い分け(任意)
特定の古いツールなど、arm64に未対応のパッケージをインストールする必要がある場合に限り、x86_64版のHomebrewを意図的にインストールする。
-
x86_64版のインストール
arch -x86_64プレフィックスを付けてインストールスクリプトを実行する。これにより、シェルがx86_64アーキテクチャとして動作し、Homebrewは/usr/localにインストールされる。arch -x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" -
エイリアスによる使い分け
両方のバージョンを明確に使い分けるため、シェル設定ファイル(例:~/.zshrc)にエイリアスを定義する。# ~/.zshrc # arm64 (native) brew # PATH設定により、'brew'コマンドは/opt/homebrew/bin/brewを指す eval "$(/opt/homebrew/bin/brew shellenv)" # x86_64 (Rosetta 2) brew alias if [ -x "/usr/local/bin/brew" ]; then alias brew-x86="arch -x86_64 /usr/local/bin/brew" fi上記設定後、
source ~/.zshrcを実行すると、以下のように使い分けが可能になる。-
ネイティブ版:
brew install FORMULA -
x86_64版:
brew-x86 install FORMULA
-
ネイティブ版:
4. 最終確認
設定完了後、which brew コマンドで優先されるパスが /opt/homebrew/bin/brew になっていることを確認する。
which brew
#=> /opt/homebrew/bin/brew
また、それぞれのbrewが管理するパッケージを確認するには、パスを直接指定する。
# arm64ネイティブ版のパッケージ一覧
/opt/homebrew/bin/brew list
# x86_64版のパッケージ一覧
arch -x86_64 /usr/local/bin/brew list
まとめ
M1 MacにおけるHomebrew環境では、アーキテクチャの違いによりインストールパスが分離される。
- 原則として、
/opt/homebrewにインストールされるarm64ネイティブ版を使用する。 - シェル設定ファイル (
~/.zshrcなど) にeval "$(/opt/homebrew/bin/brew shellenv)"を記述することで、PATHが適切に設定され、ネイティブ版が常に優先される。 -
x86_64版のパッケージが必要な場合は、意図的に/usr/localへインストールし、archコマンドやエイリアスを用いて明確に使い分けることが、環境の混乱を避ける上で有効な手段である。
Discussion