🍺

M1 MacへのHomebrewの導入

2021/01/17に公開
2

モチベーション

M1 Macは従来のMacデバイスで用いられていたx86-64の命令セットをもつIntel製プロセッサの搭載をやめ,Appleが独自に設計・開発したApple SiliconとよばれるARMアーキテクチャの命令セットを持つチップを搭載したPCです.通常,Apple Silicon搭載PCではARMアーキテクチャ対応のソフトウェアのみが動作しますが,Appleはこれを"Rosetta 2"と呼ばれるアーキテクチャ変換技術を用いることで,命令セットが異なるx86-64のソフトウェアの動作を可能にしました.

macOSでは,HomebrewやMacPortsなどのパッケージマネージャを用いることで容易に開発環境を構築することができます.今回はARMアーキテクチャのネイティブ環境およびx86-64のRosetta 2環境それぞれでmacOSにおけるパッケージマネージャであるHomebrewを導入することを目的とします.またターミナル上でHomebrewをアーキテクチャ毎に切り替え可能な設定を行います.

ネイティブ環境におけるHomebrewのインストール

まずターミナルを開き下記コマンドを実行し,実行結果がarm64であることを確認します.

$ uname -m

Homebrewを使用するためにはXcodeに含まれるxcode-selectが必要になります.Xcodeを導入していない場合,ターミナル上で下記コマンドを実行します.

$ xcode-select --install

その後,ARMアーキテクチャ環境(arm64)で以下のコマンドを実行しHomebrewをインストールします.

$ cd /opt
$ sudo mkdir homebrew
$ sudo chown $USER:admin homebrew
$ curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew

Rosetta 2環境におけるHomebrewのインストール

M1 Macでは初期の状態ではRosetta 2がインストールされていません.Rosetta 2がインストールされていない場合は以下のコマンドを実行します.

$ softwareupdate --install-rosetta --agree-to-license

Rosetta 2がインストールされている状態で以下のコマンドを実行しHomebrewをインストールします.

$ arch -arch x86_64 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

Homebrewのアーキテクチャ切り替え設定

macOSのシェルでは標準でzshが採用されています.今回は.zshrcファイルを編集することでHomebrewをアーキテクチャ毎に切り替えて使用できるように設定します.~/.zshrcに対して以下の内容を書き込みます.

~/.zshrc
if (( $+commands[arch] )); then
  alias a64="exec arch -arch arm64e '$SHELL'"
  alias x64="exec arch -arch x86_64 '$SHELL'"
fi

function runs_on_ARM64() { [[ `uname -m` = "arm64" ]]; }
function runs_on_X86_64() { [[ `uname -m` = "x86_64" ]]; }

BREW_PATH_OPT="/opt/homebrew/bin"
BREW_PATH_LOCAL="/usr/local/bin"
function brew_exists_at_opt() { [[ -d ${BREW_PATH_OPT} ]]; }
function brew_exists_at_local() { [[ -d ${BREW_PATH_LOCAL} ]]; }

setopt no_global_rcs
typeset -U path PATH
path=($path /usr/sbin /sbin)

if runs_on_ARM64; then
  path=($BREW_PATH_OPT(N-/) $BREW_PATH_LOCAL(N-/) $path)
else
  path=($BREW_PATH_LOCAL(N-/) $path)
fi

上記により,x64のコマンド実行でRosetta 2環境,a64のコマンド実行でネイティブ環境でHomebrewを実行できます.(標準ではARMアーキテクチャでの実行とします.)

Discussion

DaichiDaichi

非常に助かりました!

一点ですが、最後から2番目の行の

path=(&BREW_PATH_LOCAL(N-/) $path)

これは&ではなく$の間違いかなと思いましたのでご報告させていただきました!

_lambda314_lambda314

本件,ご指摘の通り間違いでしたので修正いたしました!
ご指摘ありがとうございました!