WSLとmoldで始めるRustの環境構築

# はじめに
こんにちは、GxPの森下です！
この記事は[グロースエクスパートナーズ Advent Calendar 2024](https://qiita.com/advent-calendar/2024/gxp)の7日目の記事です。

弊社では日常的に勉強会が開催されており、一部の勉強会はサイドプロジェクトとしても推進されています。私自身もいくつかの勉強会に参加しており、勉強会がきっかけで競技プログラミングを始めることになりました。その際、新しい言語に挑戦しようと思い、Rustを選択しました。今回は、その過程で行った環境構築とその際の注意事項について紹介します。

:::note
**WSLを使用する理由**
Rustはコンパイルが遅い言語として知られており、それを解決するためにmoldを使用することにしました。ただ、Windows上だと動作しないため、WSLを選択しました。
:::

:::note
**説明に出てくるコマンドについて**
powershellと記載しているものは、WSL外で実行しており、bashと記載しているものはWSL内で実行しています。
:::

# 環境
- Windows 11
- WSL v1.2.5.0
- VSCode

# WSLの準備
Ubuntuのインストール / 起動
```powershell:powershell
wsl --install
```
<details><summary>その他のWSLの操作</summary>

```powershell:powershell
# WSLのバージョン確認
wsl -v

# インストール出来るディストリビューションの確認
wsl --list --online

# ディストリビューションを指定してインストール
wsl --install -d Ubuntu-24.04

#インストール済みのディストリビューションの確認
wsl --list --verbose

# 特定のディストリビューションのアンインストール
wsl --unregister Ubuntu-24.04

# Ubuntuの起動
wsl -d Ubuntu
```
</details>

インストールされたUbuntuの情報の確認
```bash:bash
lsb_release -a
# または
cat /etc/os-release
```

:::note warn
Ubuntuのバージョンが22以上でないと、CMakeのバージョンがmoldのコンパイル条件を満たさないため、`apt install`ではなく、`wget`などでバージョンを指定してインストールする必要があるので、moldを使用する場合はUbuntuのバージョンに注意してください。
:::

<details><summary>バージョンを指定してCMakeをインストールする場合</summary>

```bash:bash
wget https://github.com/Kitware/CMake/releases/download/v3.30.3/cmake-3.30.3-linux-x86_64.sh
chmod +x cmake-3.30.3-linux-x86_64.sh
sudo ./cmake-3.30.3-linux-x86_64.sh
```
</details>


パッケージの最新化と各種インストール
```bash:bash
sudo apt update && sudo apt upgrade -y && sudo apt install -y curl git cmake
```
:::note
curlはRustのインストールに必要なため、またgitとcmakeはmoldのインストールに必要なため、それぞれインストールしています。
:::

<details><summary>sudoコマンドが使えない場合</summary>
対象のユーザーをsudoグループに追加する必要があるので、以下を実行してください。

```bash:bash
# ユーザー名の確認
whoami

# sudoグループの内容を確認
cat /etc/group | grep sudo

# rootユーザーに切り替え
su - root

# sudoグループにユーザーを追加
usermod -aG sudo <ユーザー名>
```
</details>


# Rustのインストール
https://www.rust-lang.org/ja/tools/install

以下を実行し、実行後「1」を入力
```bash:bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```

環境変数の設定
```bash:bash
source $HOME/.cargo/env
```
各種バージョンの確認 (バージョンが確認出来たらインストール完了)
```bash:bash
rustc -V && cargo -V && rustup -V
```

# moldのインストール
moldはRustのビルドを早くしてくれるツールです。詳細は以下をご確認ください。

https://github.com/rui314/mold

以下を順番に実行
```bash:bash
git clone --branch stable https://github.com/rui314/mold.git
cd mold
./install-build-deps.sh
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=c++ -B build
cmake --build build -j$(nproc)
sudo cmake --build build --target install
```
<details><summary>./install-build-deps.shがエラーになる場合</summary>

`./install-build-deps.sh`の実行時に`E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)` が出た場合、権限が不足しているのでsudoを付けて実行してみてください。

```bash:bash
sudo ./install-build-deps.sh
```

</details>

:::note warn
`cmake --build build -j$(nproc)`は時間 (20-30分程度) がかかるので注意してください。
:::

バージョンの確認 (バージョンが確認出来たらインストール完了)
```bash:bash
mold -v
```

実行する際は、`cargo`の前に`mold -run`を付ける
```bash:bash
mold -run cargo run
```

# VSCodeの準備
## WSLへの接続
以下の拡張機能をインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588774/6e7a3ff6-c1a1-f9e5-3e42-251fa85958bf.png)

接続
Ctrl + Shift + Pを押下し、以下を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588774/480043ba-0fc0-bfc0-b735-d421895e7c2d.png)

ディストリビューションをどれにするか聞かれるので、Ubuntuを選択

## rust-analyzer
rust-analyzerはRust用のコード補完・解析ツールです。
以下の拡張機能をインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588774/8ce708bf-aae8-7e85-558c-d3ff25d27577.png)

以下に`settings.json`の例を示します。
```json:settings.json
{
    "[rust]": {
        "editor.defaultFormatter": "rust-lang.rust-analyzer",
        "editor.formatOnSave": true
    },
    "rust-analyzer.checkOnSave": true,
    "rust-analyzer.check.command": "clippy",
    "rust-analyzer.check.extraArgs": ["--", "-A", "clippy::needless_return"],
}
```
**"rust-analyzer.check.command": "clippy"**
[clippy](https://rust-lang.github.io/rust-clippy/master/)はRustのLinter (静的解析ツール) で、`rust-analyzer.check.command`のデフォルトはcheckになっています。checkはコンパイル可能かどうかの最小限のチェックしか行いませんが、clippyはRustのより適切な書き方も教えてくれます。

**"rust-analyzer.check.extraArgs": ["--", "-A", "clippy::needless_return"]**
Rustでは暗黙的に、セミコロンのない最後の式が返され、returnで明示すると警告が出ます。この警告を出したくない場合に、`"rust-analyzer.check.extraArgs": ["--", "-A", "clippy::needless_return"]`を設定することで、制御することが出来ます。設定後、以下のようにしても警告は出ません。

```rust
fn double(value: i32) -> i32 {
    return value * 2; // 通常、value * 2 のような形でないと警告が出る
}

fn main() {
    let result = double(10);
    println!("Result: {}", result);
}
```

参考

https://code.visualstudio.com/docs/languages/rust

# 動作確認
プロジェクトの新規作成
```bash:bash
cargo new <プロジェクト名>
cd <プロジェクト名>
```

実行 (`Hello, world!`が出力されたら完了)
```bash:bash
mold -run cargo run
```

以上で環境構築は完了です。お疲れ様でした。

# 参考リンク

https://keens.github.io/blog/2021/12/20/moldwotsukautorustnobirudogahayakunaru/