問題一覧に戻る
上級システムプログラミング
問題110: ビルドスクリプト
build.rsはCargoのビルド前に実行される特別なスクリプトです。コンパイル時のコード生成、環境変数の設定、ネイティブライブラリのリンクなどを行います。OUT_DIR環境変数で指定されたディレクトリに生成ファイルを配置し、include!マクロで取り込みます。cargo:rerun-if-changedでビルドスクリプトの再実行条件を制御。ビルド時情報の埋め込み、バインディング生成、条件付きコンパイルなど、ビルドプロセスをカスタマイズする強力な機能です。
// ビルドスクリプト
// build.rs
use std::env;
use std::fs;
use std::path::Path;
fn main() {
// 出力ディレクトリ
let out_dir = env::var("").unwrap();
let dest_path = Path::new(&out_dir).join("");
// コード生成
let generated = format!(
"pub const BUILD_TIME: &str = \"{}\";\n\
pub const VERSION: &str = \"{}\";",
chrono::Local::now().format("%Y-%m-%d %H:%M:%S"),
env!("CARGO_PKG_VERSION")
);
fs::write(&dest_path, generated).unwrap();
// 再実行条件
println!("cargo:-if-changed=build.rs");
}
// メインコード
// src/main.rs
include!(concat!(env!("OUT_DIR"), "/generated.rs"));
fn main() {
println!("Built at: {}", );
println!("Version: {}", VERSION);
}