町の時計屋さんがRust toolchainのカスタムビルドに至った理由

に公開

何故又こんなことを?

いつの頃からか、Rustのnightly-x86_64-pc-windows-gnu Tool chainがProfiler = falseでビルドされてるらしくてgrcovが動かなくなっちまったのが始まり。別にnightly-x86_64-pc-windows-msvcの方は問題ない反面、なんか出力結果に齟齬があるような気がしたのと、カスタムツールチェインの作成に興味が少しあったので良い機会だから作ってみることにした

前提条件

前提となる環境は以下の通り

  • Windows 11
  • PowerShell 7.4.5
  • Msys2導入済み
    • Powershell側にPathが通ってる前提
    • mingw-w64-x86_64-toolchain python git cmake当たりが既に放り込んである
  • Rustup導入済み
    • nightly-x86_64-pc-windows-gnu がインストール済み

制限

何となくChatGptにお伺いを立てながらTry and Errでうまくいった事例なので、もしかしたら環境によっては不奏功になることもあるのでその点ご容赦の程。

また、各種configもとりあえず走り切れたモノなので、齟齬や問題があるのならご指摘ください。

加えて、profiler = falseに変更してビルドされたモノが提供されている理由を僕は知らないのであくまでビルドと導入に成功した以上の意味は無く、nightly-x86_64-pc-windows-gnuを代替できるかどうかは未確認なのでその点ご注意の程

実際の手順

それじゃ実際にビルドと導入をしていこうと思う

Step1 GitからRustを貰ってくる

初手はGithubからRustのソースコードをcheckoutすることになる。ぼちぼちサイズがでかいのでそれなりの回線速度と、ストレージサイズを用意しておこう

git clone https://github.com/rust-lang/rust.git
cd ./rust

Step2 config.tomlを作る

Cloneされた中にconfig.example.tomlが存在する。これを元にprofilerを有効にしたconfigをこさえた僕の場合は以下の通り

[llvm]
download-ci-llvm = true

[build]
target = ["x86_64-pc-windows-gnu"]
extended = true
verbose = 1
submodules = false

[rust]
channel = "nightly"
codegen-units = 0
debug = true
optimize = true

[target.x86_64-pc-windows-gnu]
profiler = true

こいつを./rust以下に放り込んどく。

Step3 ビルド

ここまでできたらビルドを実行する。

.\x.ps1 build --stage 2

pythonのスクリプトもあるのだけど、そっちだと不奏功だったのでPowershellを使ってる。また、理由は不明なんだけどーー stage 2を指定しないとfmtとかが使えなかった。

Step4 Rustupに登録

ビルドが成功したらRustupに作ったTool chainを登録する必要がある

rustup toolchain link my-nightly ./rust/build/x86_64-pc-windows-gnu/stage2

この例だとmy-nightlyという名前で登録している。

Step5 Defaultを変更する

問題なければ

rustup toolchain listで先に登録した名前が表示されているはずである。なのでrustup default my-nightlyでデフォルトのツールチェインを変更して完了となる。

注意事項

カスタムツールチェインの作成を使うにあたりいくつかの注意事項がある

cargo installする際

cargo installを実行すると、tripleがオカシナことになってるのでエラーになる。なので、tripleを明示しよう。例は以下の通り

cargo install --target x86_64-pc-windows-gnu grcov

最新版にする場合

最新版にする場合は、以下のようにする

cd <path to rust dirctory>
git pull
./x.ps1 build --stage 2

リンクは済んでるのでこれだけで良い。

ただしビルドには時間がそれなりにかかるので時間のあるときにした方が良いと思う

Discussion