build.rs
- Rust kursu
- Uzman
- Ders 37/46
- 4 dk
build.rs ile derleme öncesi kod çalıştırmayı öğrenirsin.
build.rs
Paket kökündeki build.rs, crate derlenmeden önce çalışan bir Rust programıdır. Kod üretmek, C kütüphanesi derlemek (cc crate'i), bağlayıcıya talimat vermek ya da derleme bilgisi eklemek için kullanılır. Cargo'ya standart çıktıdaki cargo:: satırlarıyla konuşur:
// build.rs
fn main() {
println!("cargo::rerun-if-changed=sablon.txt");
println!("cargo::rustc-env=DERLEME_SURUM=1.4.0");
let cikis = std::env::var("OUT_DIR").unwrap();
std::fs::write(format!("{cikis}/uretilen.rs"), "pub const N: u32 = 42;").unwrap();
}
// src/main.rs
include!(concat!(env!("OUT_DIR"), "/uretilen.rs"));
const SURUM: &str = env!("DERLEME_SURUM");Üretilen dosyalar yalnızca OUT_DIR'a yazılmalıdır; kaynak klasörü değiştirilmez.
env! ve option_env!
Derleme anındaki ortam değişkenleri koda gömülebilir. env! değişken yoksa derlemeyi durdurur; option_env! bir Option<&'static str> döndürür:
const PAKET: &str = env!("CARGO_PKG_NAME"); // Cargo hep tanımlar
const SURUM: &str = env!("CARGO_PKG_VERSION");
let kanal = option_env!("RUST_DERS_KANAL").unwrap_or("geliştirme");Bu değerler çalışma anında değil, derleme anında okunur; ikili dosyanın içine sabit olarak girer.
Uygulama Derleme anı bilgisi
option_env!("RUST_DERS_KANAL") ile derleme anı değişkenini oku; tanımlı değilse "geliştirme" kullan ve yazdır. (Alıştırma ortamında bu değişken tanımlı değildir.)
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
fn main() {
let kanal = option_env!("RUST_DERS_KANAL").unwrap_or("geliştirme");
println!("{}", kanal);
}Beklenen çıktı
geliştirme
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>cargo::rerun-if-changed</code> yazılmazsa ne olur?
- Derleme hatası
- Bir kez çalışır
- Betik, paketteki herhangi bir dosya değişince yeniden çalışır; derleme yavaşlar Doğru cevap
- Hiç çalışmaz
Açıklama: Doğru bağımlılıkları bildirmek, artımlı derlemenin hızlı kalmasını sağlar.
2 İsteğe bağlı ortam değişkeni
let kanal = ____!("RUST_DERS_KANAL").unwrap_or("geliştirme");
let kanal = option_env!("RUST_DERS_KANAL").unwrap_or("geliştirme");
Açıklama: option_env! değişken yoksa derlemeyi durdurmaz, None verir.
3 Öğe ve görevi
| Kavram | Anlamı |
|---|---|
build.rs |
Derleme öncesi betik |
OUT_DIR |
Üretilen dosyalar |
cargo::rerun-if-changed |
Yeniden çalışma koşulu |
include! |
Dosyayı koda katar |