CodeBlanks Logo Icon CodeBlanks

build.rs

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

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
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

Soru
let kanal = ____!("RUST_DERS_KANAL").unwrap_or("geliştirme");
Cevap
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

Uzman bölümündeki tüm dersler