ARM MacにRosetta 2でx86-64 Rust環境を用意する
M1 MacなどのARM MacでRosetta 2を利用してx86-64のRust環境を用意する方法を紹介します.
やること
- Rosetta 2の導入
- Rosetta 2のterminalの起動
- x86-64用のHomebrewのinstall
- x86-64用のRustupのinstall
- 環境変数の設定
既にaarch64のHomebrewをinstallしている方もx86-64のHomebrewをinstallすることに注意してください.
使用環境
Apple M2 Mac mini (2023)
macOS 14.3.1 (Sonoma)
Rosetta 2のinstall
まずは以下のcommandでRosetta 2をinstallします.
softwareupdate --install-rosetta
次にCommand Line Tools for Xcodeをinstallします.
xcode-select --install
これはHomebrewのinstallに必要です.
Rosetta 2のterminalの起動
次に以下のcommandでRosetta 2のterminalを開きます.
arch -x86_64 zsh
x86-64 Homebrewのinstall
x86-64のHomebrewをinstallします.
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
x86-64 Rustupのinstall
rustup-initをinstallします.
brew install rustup-init
Rustをinstallするための環境変数を設定します.
$HOMEはhome directoryです.
export "CARGO_HOME=$HOME/x86_64/.cargo"
export "RUSTUP_HOME=$HOME/x86_64/.rustup"
環境変数を設定せずにdefaultでrustup-initを実行すると$HOME/.cargo/$HOME/.rustupにinstallされます.
この場合,すでにaarch64のRust環境があると衝突しますので$HOME/x86_64/にinstallするように設定しています.
どこにinstallするかは衝突しなければよいだけなので他にお好みのinstall場所があれば適宜変更してください.その場合,以下の設定も適宜変更してください.
rustup-initを実行します.
以下のように表示が出ます.
% rustup-init
Welcome to Rust!
This will download and install the official compiler for the Rust
programming language, and its package manager, Cargo.
Rustup metadata and toolchains will be installed into the Rustup
home directory, located at:
/Users/USER/x86_64/.rustup
This can be modified with the RUSTUP_HOME environment variable.
The Cargo home directory is located at:
/Users/USER/x86_64/.cargo
This can be modified with the CARGO_HOME environment variable.
The cargo, rustc, rustup and other commands will be added to
Cargo's bin directory, located at:
/Users/USER/x86_64/.cargo/bin
This path will then be added to your PATH environment variable by
modifying the profile files located at:
/Users/USER/.profile
/Users/USER/.bash_profile
/Users/USER/.zshenv
You can uninstall at any time with rustup self uninstall and
these changes will be reverted.
Current installation options:
default host triple: x86_64-apple-darwin
default toolchain: stable (default)
profile: default
modify PATH variable: yes
1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>
表示内容から,いくつか設定が正しいか確認することがあります.
まず最初の2つのPATHがRUSTUP_HOME/RUSTUP_HOMEの設定です.
先ほど行ったようにx86-64用のdirectoryに設定されているか確認してください.
次にdefault host tripleがx86_64-apple-darwinになっているか確認してください.
aarch64-apple-darwinになっている場合があり,これはaarch64用のrustup-initを呼び出していることが原因の可能性が高いです.
Homebrewでinstallしたrustup-initにPATHが通っていないことが原因だと考えられますので,
現在のinstallを中止し,以下のcommandを実行したのちrustup-initを再度実行してください.
eval "$(/usr/local/bin/brew shellenv)"
あるいは絶対PATHでrustup-initを実行しても良いです.
/usr/local/bin/rustup-init
設定が正しいことが確認できたらinstallに進みます.
1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>
dafaultのままinstallすると.profile/.bash_profile/.zshenvを書き換えてしまうので,その動作を抑制するために2を選択し,Custom installationを行います.
2と入力してEnterを押します.
>2
以下のように表示されます.
I'm going to ask you the value of each of these installation options.
You may simply press the Enter key to leave unchanged.
いくつか設定変更について聞かれますが,変更するのは4つ目なので3回Enterを押して3つ目までの設定は変更せずに進めます.
Default host triple? [x86_64-apple-darwin]
Default toolchain? (stable/beta/nightly/none) [stable]
Profile (which tools and data to install)? (minimal/default/complete) [default]
4つ目の設定でmodify PATH variableをnに変更します.
nを入力してEnterを押します.
Modify PATH variable? (Y/n)
n
以下のような表示が出ます.
Current installation options:
default host triple: x86_64-apple-darwin
default toolchain: stable
profile: default
modify PATH variable: no
1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
modify PATH variable: noとなっていれば問題ありません.
1を入力してEnterを押し,installを実行します.
色々表示されますが,最後の方に以下のような表示が出ればinstall完了です.
Rust is installed now. Great!
環境変数の設定
続いて,環境変数等の設定を行います.
aarch64 terminalとRosetta terminalで呼び出すHomebrewとRustの環境変数を切り替えるよう設定します.
$HOME/.zshrcに以下のような設定を追加します.
if [ $(uname -m) = "arm64" ]; then
eval "$(/opt/homebrew/bin/brew shellenv)"
. "$HOME/.cargo/env"
elif [ $(uname -m) = "x86_64" ]; then
eval "$(/usr/local/bin/brew shellenv)"
. "$HOME/x86_64/.cargo/env"
export RUSTUP_HOME="$HOME/x86_64/.rustup"
export PS1="(x86_64) $PS1"
fi
以下何をやっているのか説明します.興味ない人は読み飛ばしてください.
-
$(uname -m)で現在のarchitectureを取得しています.ifでaarch64とx86-64を判別して処理を変更しています. -
eval "$($HOMEBREW_REPOSITORY/bin/brew shellenv)"でHomebrewの環境変数を設定しています.-
HOMEBREW_REPOSITORYはdefaultで/opt/homebrew(aarch64)と/usr/local(x86-64)です.
-
-
. "$CARGO_HOME/env"でCargoの環境変数を設定しています.-
CARGO_HOMEは$HOME/.cargo(aarch64)と$HOME/x86_64/.cargo(x86-64)です.
-
- x86-64のRust環境を使う場合は
RUSTUP_HOMEを$HOME/x86_64/.rustupに設定しています.- 設定しないとaarch64の
$HOME/.rustupを参照してしまいます.
- 設定しないとaarch64の
-
export PS1="(x86_64) $PS1"はRosetta terminalを起動しているときに,terminalの左側に(x86_64)と表示されるようにしています.必須ではありません.
以上で終了です.お疲れ様でした.
これでRosetta terminalを実行してから,cargoなどを実行することでx86-64のRust環境を利用することができます.
おまけ:Rosetta terminalの起動用のalias設定
おまけですが,$HOME/.zshrcに以下の設定を追加するとzx64でRosetta terminalを呼び出すことができます.
zarmはRosetta terminalから通常のterminalに戻るために使います.
# ARM terminal
alias zarm="arch -arm64 zsh"
# Rosetta terminal
alias zx64="arch -x86_64 zsh"
Discussion