👻

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
  • 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がインストールされていない、または設定が不完全な場合は、以下の手順を実行する。

  1. インストール
    Homebrew公式サイト に記載されているインストールコマンドをターミナルで実行する。このコマンドは現在のアーキテクチャを自動で判別し、arm64環境では /opt/homebrew にインストールを行う。

    /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
    
  2. PATHの設定
    インストール完了後、ターミナルに以下のようなメッセージが表示される。これは、/opt/homebrew/binPATH環境変数に追加するための指示である。

    ==> 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 ~/.zshrc
    

    brew shellenv コマンドは、Homebrewを使用するために必要な環境変数(PATH を含む)を設定するためのシェルスクリプトを生成する。eval はそのスクリプトを実行するコマンドである。これにより、/opt/homebrew/binPATH の先頭に追加され、常にネイティブ版が優先されるようになる。

3. Rosetta 2版Homebrewの共存と使い分け(任意)

特定の古いツールなど、arm64に未対応のパッケージをインストールする必要がある場合に限り、x86_64版のHomebrewを意図的にインストールする。

  1. 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)"
    
  2. エイリアスによる使い分け
    両方のバージョンを明確に使い分けるため、シェル設定ファイル(例: ~/.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