LoginSignup
20
12

Rust高速ビルド環境構築帳

Last updated at Posted at 2023-12-17

はじめに

嘘導入

光陰矢の如しとは言いますが,もう年末になってしまいました.
年末と言えば,そう,サンタクロースの追跡ミッションの時期ですね.
毎年サンタクロースの追跡のために専用のシステムを開発する多種多様なエンジニアが世界で5000兆人,給料はクリスマスツリーについている星払いで動員されているというのは有名な話です.
しかしながら,亜光速で世界を翔けるトナカイに乗るサンタを捕捉するのは尋常な事ではありません!ゴウランガ!
高いパフォーマンスは必要ですし,ガベージコレクタが走ってStop the Worldが起ころうものならその一瞬でサンタは地平線の彼方へ消えてしまいます.ウカツ!
そこで,WST(World Santa Tracking)協会は今年のサンタ追跡システムの一部にRust言語を使用することを決定しました.
そのために,Rust環境を構築する手順を記事にすることにしました.

導入

ナマステ! neruneruna7です. 上に書いてあることは全て嘘です.

学生団体IDEAのアドベントカレンダー,その2日目の記事となります.

近頃,Rust言語の話題を目にすることが増えてきました.かくいう私も好んで使用しています.
自分での再確認の意味も込めて,Rustの環境構築手順を記事にすることにしました.

Rustといえばビルド時間が長いことで知られています.
そこで,本記事では高速なビルドができる,快適なRust環境を構築することを目的としています.

WslとUbuntuのインストールが完了している前提で進めます.

環境

環境構築をする環境ですが,以下の通りです.

Windows11: 22h2
wsl: 2.0.9.0
Ubuntu: Microsoft Storeから取得するUbuntu どのバージョンでも問題ないと思います(未検証)

自身の普段使用しているRust環境はUbuntu22.04上に構築しています.

バージョン表記のないUbuntuを普段使いしていないのは,気軽に爆破できるようにしたいためです.
世に諸行無常の響きあり...使っていればいつか肥大したり,壊れることもあるでしょう.
そんな時に,動かないUbuntuを御神体として祀ってお祓いをし,さらに念仏を唱える...わけにもいきません.

デフォルトディストリビューションにしていない構築することで,気軽に爆破,再構築できるようにしたいのです.

だったらDockerを使えって話ではある.

正直言えば,ただ単に気持ちの問題です.

チーム開発等の場合は,Dockerで構築して爆破した方が良いでしょう.
Dockerドッカーン!!

Dockerドッカーン!!と Twiter | X 上でリプライしたところ,なぜか相手のDockerとWslを破壊するという事故が発生しました.
くれぐれも乱用にはお気を付けください.

芸術は爆発だ!!

基本の環境構築

Ubuntuの準備

WslとUbuntuのインストールが完了している前提で進めます.

まずは,以下のコマンドを実行します.

sudo apt update
sudo apt upgrade

次に.build-essentialをインストールします.

sudo apt install build-essential

これでRustをインストールする準備が整いました!

Rustインストール

次のコマンドを実行します

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

途中で選択肢が出てきますが,基本的には何も入力せずにエンターキーを押し,デフォルトのままインストールで問題ないでしょう.

インストールが完了したら,ターミナルを再起動しましょう.

それでは,Rustをインストールできたか確認しましょう
rustup rustc cargoの3つがインストールされているはずです.
rustup -V rustc -V cargo -V をターミナルで実行します.

$ rustup -V
rustup 1.26.0 (5af9b9484 2023-04-05)
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `rustc 1.74.1 (a28077b28 2023-12-04)`

$ rustc -V
rustc 1.74.1 (a28077b28 2023-12-04)

$ cargo -V
cargo 1.74.1 (ecb9851af 2023-10-18)

以上のような結果が出力されれば,無事にインストール完了です.

インストールされたものは何?

ところで,これら3つはそれぞれ何なのでしょうか?

rustcコンパイラです.直接使うことはほぼありません.

rustupとは,Rustのインストーラーおよびバージョン管理ツールです.
これにより,インストールが簡単に行えたり,複数のバージョンのコンパイラを管理することができます.例えるならば,pyenvなどが似ているでしょうか? 違ったらすみません.

cargoとは,Rustのビルドツールおよびパッケージマネージャです.基本的にはこれを介してコンパイラを呼ぶことになります.またライブラリの依存関係管理なども行います.例えるならば,npmなどが近いですね.

cargoは非常に多くの機能を持っています.

  • ビルド
  • 実行
  • テスト
  • フォーマッタ
  • 静的解析(リンタ)
  • ドキュメントのビルド
  • ライブラリの公開...etc

さらに,ユーザによって開発されたサブコマンドによって,多数の便利なツールが公開されています.

高速にビルドできる環境構築

ここまででRustの基本的な環境は構築できましたが,より快適な環境を構築していきましょう!

便利なサブコマンドのインストール

Rustには便利なサブコマンドが多数公開されています.今回はcargo-binstallcargo-watchを導入します.

Rustのサブコマンドのインストールはインストール時にコンパイルします.
さてこれ,バチクソコンパイル時間がなっっっっっがいわけですが,cargo-binstallを導入することによって大幅に短縮できることがあります.

cargo-binstallでは,実行バイナリをダウンロードしてインストールします.コンパイルする時間が無いわけですね.
その場合は数秒でインストールが完了するため,非常に便利です.できない場合はcargo installにフォールバックします.

cargo-watchは,プロジェクトの変更を監視し,自動で指定したcargoコマンドを実行します.

cargo install cargo-binstall

インストール長かったですね...
binstallのインストール完了後にwatchをbinstallしてください

cargo binstall cargo-watch

一瞬で終わりましたね!

sccache, moldのインストール

sccacheとは,Mozillaの開発する共有コンパイルキャッシュツールです.2回目以降のビルドを高速化します.しかしリンク時間は変わらないため,そこがネックになります.

moldとは,Rui Ueyama氏が開発するリンカです.現代のCPUはマルチコアのものが多いですが,これまでのリンカはその能力を活用できていませんでした.マルチコアを活かすことで高速に動作するリンカです.

これら2つを使用することで,高速にビルドできる環境を構築します.

以下のコマンドを実行します.

cargo binstall sccache
sudo apt install mold

Rustでsccacheを使う手段の1つとして,RUSTC_WRAPPER環境変数を設定というものがありますが,いちいち設定するのは面倒なので,.bashrcに記述します.

export RUSTC_WRAPPER=$(which sccache)

一度ターミナルを再起動しておきましょう.

これで高速にビルドする環境ができました!
適当なRustプロジェクトを作って,ビルド | 実行時にmold --run cargo runのようにコマンドを実行することで,デフォルトよりも高速にビルドできます!

さらに体感速度の向上を目指して

これまでで

  • コンパイル時間の短縮
  • リンク時間の短縮

を図ってきました.

もちろんビルドは速くなっていますが,依然としてRustのビルドとは時間がかかるものです.
Rustのコンパイラ自体はインクリメンタルビルド(増分ビルド)を採用しており,また高速化できるように細かい最適化が加えられているそうです.
そもそもとして,一度の変更が多ければ時間はかかりますし,初回コンパイルはキャッシュもインクリメンタルビルドも効かないのでどうしても遅いです.

ならば,ビルド自体をコードを書いてる最中に,細かい単位で繰り返せばよいのです.

そこで,cargo-watchを使用して,できるだけビルド時間が気にならないようにしていきましょう.

することは簡単です.Rustで開発しているときに,以下のコマンドを裏で実行しておくだけです.

cargo watch -s 'mold -run cargo build'

これにより,変更するたびに(ctrl + sで保存するたびに)ビルドが走ります.

また,

cargo watch -x fmt -s 'mold -run cargo build'

のようにすれば,保存時に毎回フォーマットしたりと好きなようにできます.

これでさらに快適にビルドすることができます.

欠点

保存のたびにビルドが走るということで,targetフォルダが肥大化します.
気づけば数十GBに膨れ上がっているというのはザラです.

普通に開発しているだけでも大きくなるのがtargetフォルダです.

定期的にcargo cleanコマンドを実行して綺麗に掃除しておきましょう

プロジェクトが多数ある場合,cargo-clean-recursiveをインストールして使用するのもおすすめです.

まとめ

Rustはコンパイル時間の長い言語ですが,これらによりだいぶ気にならなくなります.

  • cargo-binstall
  • cargo-watch
  • sccache
  • mold
  • cargo-clean-recursive

また,ここでは紹介していませんが,cargoのサブコマンドには便利で高機能なものがたくさんあります.
より快適な開発環境を目指していきたいですね.

それではみなさん,よい年末を!!

年末の注意点 学生でソフトウェアエンジニアリングを学んでいるみなさん,年末はお酒を飲む機会が増えると思います.普段あまりお酒を飲まなくて,あまり慣れていないということもよくあるんじゃないでしょうか.

そんなみなさん,必ず,必ずビニール袋は携行しましょう.とにかくすぐに準備できるところに携行しましょう. ゾルトラーク1 は突然やってきます.

いきなり目の前でゾルトラークしても即座に防御魔法を展開できるように準備しましょう.

年末シーズンではないですが,筆者は1度やらかしました.しかも電車内で...

参考文献

  1. 漫画,葬送のフリーレンに出てくる魔法

20
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
12