AtCoder運営者向けの情報

本章では以下の内容について説明します。

  • Rustツールチェインやクレート(外部ライブラリ)をジャッジサーバへインストールする手順
  • 提出されたプログラムのコンパイルおよび実行手順

Rustツールチェインやクレートの内容など

  • Rust 1.39.0
  • インストールするクレート:このページを参照

内容についてのお問い合わせなど

内容について質問などがありましたら、GitHub Issueなどでご連絡ください。

なお本章のMarkdownソースファイルはGitHub rust-lang-ja/atcoder-rust-resourcesにあります。

素のRust環境について

AtCoder 2019/7 Language Updateのスプレッドシートでは、従来のようにクレートがインストールされていない「素のRust環境」の併設を望む声もあるようです。

そのような環境を望む理由については、正直な話、よくわかりません。 本章の手順に従ってセットアップした環境が問題なく動作するなら、わざわざ別の環境を用意する必要はないからです。 もしユーザプログラム(選手が提出したプログラム)がクレートを使わないなら、本章の手順でインストールしたクレートはないものと同じになります。コンパイルにかかる時間やコンパイルによって生成される実行ファイルには影響を与えません1

あるいは本章でセットアップした環境が何らかの条件下ではうまく動かないものであって、それに当たった際に一切コンパイルできなくなるなどの障害が起こることを心配しているのかもしれません。とはいえジャッジサーバの環境は固定されていますので、そういうことは起こりにくいと考えられます。

もしそれでも欲しいという声があるなら、素のRust環境を別途用意することも技術的には可能です。

1

このことは他の言語におけるライブラリとまったく同様かと思います。例えばC++にboostがインストールされていても、それらをincludeしたり利用したりしなければコンパイル時間や成果物の性能にほぼ影響を与えないのと同じです。

方法1:環境は1つのまま、コンパイルコマンドを2種類用意する

1つ目の方法は、環境自体は本章の手順で1つだけセットアップして、コンパイルコマンドを切り替えることです。

本章ではクレート入りの環境を利用する方法として、公式のパッケージマネージャCargoを使う方法と、rustcに必要なオプションを追加して呼び出す方法の二通りを提案します。しかし、これはRustコンパイラを呼び出す方法やコンパイルオプションが違うだけであって、ツールチェインを改変するものではありません。rustcを今まで通りに外部クレートのパスを指定せずに呼び出せば、そのまま素の環境ということになります。

たとえばクレート入り環境を利用する方法として「rustcに必要なオプションを付ける方法」を選んだとします。このときのコンパイルコマンドは以下のように直接外部クレートのパスを指定するオプションを付けてコンパイラを実行します2

$ RUST_LIB=$RUST_HOME/lib
$ rustc --edition=2018 -C opt-level=3 \
    $(rustc-dep-option-generator $RUST_LIB/Cargo.toml $RUST_LIB/target/release/deps) \
    main.rs

この環境を素の環境、つまりクレートがインストールされていない環境と同じにするには、外部クレート関連のコンパイルオプションをつけずにコンパイラを実行します。

$ rustc --edition=2018 -C opt-level=3 main.rs
2

例示のコマンドラインではクレート検索パス生成ツール(rustc-dep-option-generatorコマンド)を利用しています。このコマンドの出力は各外部クレートのパスを指定するコンパイルオプション群です。なおこのツールを利用することは必須ではありませんし、事前にこのツールを使うか手動でコンパイルオプションを生成してベタ書きするのでも構いません。

方法2:文字通り2つの環境を用意する

2つ目の方法は、本章の環境に加えて、素のRust環境も用意することです。 シェルの環境変数RUSTUP_HOMECARGO_HOMEを本章のものとは違う値に設定して(またはunsetして)rustupをインストールすれば、本章の環境とは別の場所にRustツールチェインがインストールでされます。

コンパイルの際も環境変数の値を変えることで、本章でセットアップする環境と、素のRust環境を切り替えます。

環境変数本章でセットアップする環境(クレートを使用できる環境)を使用する場合素のRust環境を使用する場合
RUSTUP_HOME/usr/local/lib/rust/rustuprustupをデフォルトの場所にインストールしたのならunset RUSTUP_HOME
CARGO_HOME/usr/local/lib/rust/cargoCargoをデフォルトの場所にインストールしたのならunset CARGO_HOME