問題点
MacにはRubyが標準でインストールされているのですが、最新バージョンをインストールしたい…。
そこでパッケージマネージャのHomebrewをインストールして、さらにrbenvをインストールしてからRubyを入れようとしたらエラーが出てしまいました。
どうやら原因はM1チップにあるようなので解決方法を書いていきます。
前提
1. 「M1チップのMac」と「IntelチップのMac」は環境が違う
筆者は従来、Intelチップが搭載されたMacを使用していました。しかし、少し前に高性能のM1チップが内蔵されたMacが新しく発売されたので買い替えて使用してきました。
今回、以前と同じような手順で言語をインストールしようとしたらエラーが出てしまい、以下のことがわかりました。
- 「M1チップのMac」では、rbenvでruby 3.2.2がインストールできない。(2023年4月8日時点)
- 「IntelチップのMac」では上記をインストールできる。
これらは、プログラムを動かす環境の違いによって生じるものです。
2.環境がRosseta上なのか、ARMアーキテクチャ上なのかを把握する
アップルシリコンは、ARMアーキテクチャと呼ばれる命令セットを持つチップのことを指します。ソフトウェアによっては、ARMアーキテクチャ上では動かないものが存在します。今回のRubyの最新バージョンがそれに該当しました。それを解決するために、Rossetaと呼ばれる、アーキテクチャを変換する技術が用意されています。このRosettaを使用することでARMアーキテクチャ上では動かないソフトウェアを動かすことができます。
M1チップのMacで最新バージョンのRubyをインストールするためにはRosetta上でインストールを行う必要があるので、今現在どの環境にいるのかを確認しておきます。確認するコマンドは後述します。
解決方法
1.現在どちらの環境でプログラムを動かそうとしているのかを確認する
ターミナルを開いて今現在Rosseta上にいるのか、それともARMアーキテクチャ上にいるのかをコマンドを叩いて確認しましょう。
使用するコマンドは以下のとおりです。
% uname -m
-
arm64
と出力されればARMアーキテクチャ上 -
x86_64
と出力されればRosseta上
の環境にいるということになります。筆者の場合はarm64
と出力されたのでARMアーキテクチャ上にいたということになります。そのため、最新バージョンのRubyをインストールすることができませんでした。
それでは、これを解決するために環境をRosseta上に移していきましょう。
2.コマンドで簡単にRosseta⇔ARMアーキテクチャを切り替えられるようにする
今後簡単に切り替えられるようにするために、.zshrc
ファイルを編集してコマンド操作できるようにしておきます。.zshrc
ファイルは、ターミナルを開くときに最初に読み込まれるファイルです。ホームディレクトリで以下のコマンドを叩いて.zshrc
ファイルを開きましょう。
% open ~/.zshrc
標準ではテキストエディタで開かれると思います。実際に編集していきましょう。筆者は書き方がわからなかったので、_lambda314
さんという方の以下の記事を参考にさせていただきました。
https://zenn.dev/_lambda314/articles/63b851221a7016
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
上記のコードをファイルに追加すると、Homebrewをアーキテクチャ毎に切り替えて使用できるようになるみたいです。切り替えは、x64
のコマンドでRosseta上、a64
のコマンドでARMアーキテクチャ上に環境変更できます。
実際に自分もターミナルでx64
のコマンドを叩いてから、
% uname -m
で確認すると、無事x86_64
と出力されてRosseta上に移ることができました。
3.Rosseta上で最新バージョンののRubyをインストールする
Rosseta上に移れたところで、実際にRubyをインストールしていきましょう。
以下のコマンドで現時点(2023年4月8日)で最新のruby 3.2.2をインストールします。
% rbenv install 3.2.2
インストールが終わったら、次に以下のコマンドでインストールされたRubyのバージョンを確認します。
% rbenv versions
次に、以下のコマンドで3.2.2に切り替えます。
% rbenv global 3.2.2
最後に、以下のコマンドで現在のRubyが3.2.2であるかを確認しましょう。
% ruby -v
無事に確認できたら最新バージョンのRubyのインストール完了です。