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

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

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

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

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

devreleaseが、コンパイラによって使用される異なるプロファイルです。

Cargoには、プロジェクトのCargo.tomlファイルに[profile.*]セクションが明示的に追加されていない際に適用される、 各プロファイル用のデフォルト設定が存在します。カスタマイズしたいプロファイル用の[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のドキュメンテーションを参照されたし。