[技巧] 同硬碟不同OS動態切換 Rustup/Cargo 路徑

問題

Linux 上不管切換到 x86 還是 Arm 工作上都是用同一個 mount 到的路徑,所以 $HOME 其實資料都一樣。

但如果我在 x86 上安裝 Rustup 和 Cargo 到預設的路徑 ~/.rustup 和 ~/.cargo,假設我安裝了 exa,切換到 Arm 上後就會跳出下面這樣的錯誤訊息:


-bash: /xxx/.cargo/bin/exa: cannot execute binary file

原因

因為 Cargo 的 packages 當初是在 x86 上編譯的,當然就沒辦法在 Arm 平台上執行。

解決方式

第一個直覺想法就是,有沒有辦法在 x86 與 Arm 上都安裝同一個 package,只是安裝在不同路徑。查了一下網路就看到如何客製化 Rustup/Cargo 安裝在自訂的路徑:

  • Rustup: 執行 rustup-init 前設定 RUSTUP_HOME
  • Cargo: 執行 rustup-init 前設定 CARGO_HOME

利用這樣的環境變數,我們就可以寫一些 Bash scripts 來達到多個 OS 上的安裝和動態切換。

Bash Script: 安裝 Rustup 在不同的 OS 上

例如我們在 x86 上安裝就可以這樣寫:


#!/bin/bash
export RUSTUP_HOME="$HOME/x86_64/rustup"
export CARGO_HOME="$HOME/x86_64/cargo"

cd "$RUSTUP_HOME"

# Download rustup script
curl https://sh.rustup.rs -sSf >rustup.sh

# Install rustup
bash rustup.sh -y --no-modify-path

在 Arm 上安裝就換一下 RUSTUP_HOMECARGO_HOME 路徑就好:


#!/bin/bash
export RUSTUP_HOME="$HOME/arm64/rustup"
export CARGO_HOME="$HOME/arm64/cargo"

cd "$RUSTUP_HOME"

# Download rustup script
curl https://sh.rustup.rs -sSf >rustup.sh

# Install rustup
bash rustup.sh -y --no-modify-path

Bash Script: 動態切換 Cargo 路徑

假設 x86 和 Arm 都會用 ~/.bashrc 來初始化 terminal,我們就可以寫像是下面這樣的 bash script 來偵測目前是哪個 OS,再動態設定 RUSTUP_HOMECARGO_HOME:


#!/bin/bash
machine="$(uname -m)"

case "$machine" in
'aarch64')
    export RUSTUP_HOME="$HOME/arm64/rustup"
export CARGO_HOME="$HOME/arm64/cargo"
export PATH="$PATH:$CARGO_HOME/bin" ;; 'x86_64') export RUSTUP_HOME="$HOME/x86_64/rustup"
export CARGO_HOME="$HOME/x86_64/cargo"
export PATH="$PATH:$CARGO_HOME/bin" ;; *) ;; esac unset machine

這樣子不管是在 x86 或 Arm 上面開 Bash terminal,安裝過的 Cargo packages 都可以執行。

不過分開兩地管理的話身為管理者可能就要額外注意像是兩邊版本不同步,或是有一邊忘記安裝 packages 等的問題。但對於個人使用上就不太會有多大的問題。


留言

此網誌的熱門文章

[試算表] 追蹤台股 Google Spreadsheet (未實現損益/已實現損益)

[Side Project] 互動式教學神經網路反向傳播 Interactive Computational Graph

[插件] 在 Chrome 網頁做區分大小寫的搜尋