M1 MacへのHomebrewの導入
モチベーション
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
に対して以下の内容を書き込みます.
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
非常に助かりました!
一点ですが、最後から2番目の行の
これは
&
ではなく$
の間違いかなと思いましたのでご報告させていただきました!本件,ご指摘の通り間違いでしたので修正いたしました!
ご指摘ありがとうございました!