リリースプロファイルでビルドをカスタマイズする

Rustにおいて、リリースプロファイルとは、プログラマがコードのコンパイルオプションについてより制御可能にしてくれる、 定義済みのカスタマイズ可能なプロファイルです。各プロファイルは、それぞれ独立して設定されます。

Cargoには2つの主なプロファイルが存在します: devプロファイルは、cargo buildコマンドを実行したときに使用され、 releaseプロファイルは、cargo build --releaseコマンドを実行したときに使用されます。 devプロファイルは、開発中に役に立つデフォルト設定がなされており、releaseプロファイルは、 リリース用の設定がなされています。

これらのプロファイル名は、ビルドの出力で馴染みのある可能性があります:

$ cargo build
    Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
$ cargo build --release
    Finished release [optimized] target(s) in 0.0 secs

このビルド出力で表示されているdevreleaseは、コンパイラが異なるプロファイルを使用していることを示しています。

プロジェクトのCargo.tomlファイルに[profile.*]セクションが存在しない際に適用される各プロファイル用のデフォルト設定が、 Cargoには存在します。カスタマイズしたいプロファイル用の[profile.*]セクションを追加することで、 デフォルト設定の一部を上書きすることができます。例えば、こちらがdevreleaseプロファイルのopt-level設定のデフォルト値です:

ファイル名: Cargo.toml

[profile.dev]
opt-level = 0

[profile.release]
opt-level = 3

opt-level設定は、0から3の範囲でコンパイラがコードに適用する最適化の度合いを制御します。 最適化を多くかけると、コンパイル時間が延びるので、開発中に頻繁にコードをコンパイルするのなら、 たとえ出力結果のコードの動作速度が遅くなっても早くコンパイルが済んでほしいですよね。 これが、devopt-levelのデフォルト設定が0になっている唯一の理由です。 コードのリリース準備ができたら、より長い時間をコンパイルにかけるのが最善の策です。 リリースモードでコンパイルするのはたった1回ですが、コンパイル結果のプログラムは何度も実行するので、 リリースモードでは、長いコンパイル時間と引き換えに、生成したコードが速く動作します。 そのため、releaseopt-levelのデフォルト設定が3になっているのです。

デフォルト設定に対してCargo.tomlで異なる値を追加すれば、上書きすることができます。 例として、開発用プロファイルで最適化レベル1を使用したければ、以下の2行をプロジェクトのCargo.tomlファイルに追加できます:

ファイル名: Cargo.toml

[profile.dev]
opt-level = 1

このコードは、デフォルト設定の0を上書きします。こうすると、cargo buildを実行したときに、 devプロファイル用のデフォルト設定に加えて、Cargoはopt-levelの変更を適用します。 opt-level1に設定したので、Cargoはデフォルトよりは最適化を行いますが、リリースビルドほどではありません。

設定の選択肢と各プロファイルのデフォルト設定の一覧は、Cargoのドキュメンテーションを参照されたし。