Rustコンパイラをクラウドでビルドする備忘録

概要

Rustコンパイラをいじっているとビルドの遅さのせいで作業に支障をきたすため、クラウドでビルドするようにしてみる。

EC2を立ち上げる

Ubuntu 16.04 (HVM) の c5.4xlarge を使うことにする。使うインスタンスの強さは財布と相談して決めることにする。

高くて強いインスタンスを使っていくので、使わないときは落とし忘れないように気をつける(停止時はEBSやEIPだけ課金される)。このあたりも必要なら自動でシャットダウンする仕組みを考えるといいかもしれない。

セットアップ

手元から rust-builder という名前でSSHできるようにする。依存関係として以下を入れておく。

$ sudo apt update && sudo apt upgrade && sudo apt install build-essential python-minimal cmake curl git

スクリプトの配置

Rustコンパイラを手元にcloneして、 x.py があるのと同じ位置に以下の y.sh を置いてexec permissionをつける。

#!/usr/bin/env bash
set -ue

# Remote side:
# sudo apt update && sudo apt upgrade && sudo apt install build-essential python-minimal cmake curl git

builder_host=rust-builder
local_host="$(hostname)"
dirpath="$(realpath --relative-to "$HOME" "$(pwd)")"

git submodule update --init --recursive
rsync -avz --delete --exclude '.git' --exclude '/build' "$HOME/$dirpath/" "$builder_host:$local_host/$dirpath"
ssh -t "$builder_host" "cd $local_host/$dirpath; ./x.py $@"

やっていることは以下。

  • rsyncで送って向こうでビルドを叩く。
  • gitを全部転送したくないので .git は省く。ただしsubmoduleが必要なのでsubmodule updateを自動で叩く。 (x.pyは.gitがあるときはsubmodule updateを自動でやってくれる)
  • build も当然省く。手元のbuildと衝突しうるし、 --delete に巻き込まれないようにする意図もある。ただしbuildというディレクトリがソースツリーの中にあるので、 /build と指定する必要がある。
  • tmuxを立ち上げたりはしない。ビルドが短くなることが期待されているので途中で切れてもよい。むしろ自動アタッチとか考えるのが面倒。

ビルド

./x.py のかわりに ./y.sh をつけてビルドする。(例: ./y.sh test --stage 1)

設定

クラウドとは関係ないが、コンパイラを開発するときは config.toml を絶対にいじったほうがよい。

  • compiler-docs = true。ほとんどの関数はdoc-comment (///) を持たないが、シグネチャが一覧できるだけでもありがたい。
  • debug-assertions = true。 これがないとログがほとんど出ない。また、これを有効にすると一部の追加のチェックが行われる。
  • debuginfo = true, debuginfo-lines = true。 これがないとICE(コンパイラ内部エラー)の時のバックトレースがちょっと貧弱で困る。
  • incremental = true。 効果は計測してないけど効率がちょっと上がりそう