Rust
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.)
Örnek çözümü göster
fn main() {
let kanal = option_env!("RUST_DERS_KANAL").unwrap_or("geliştirme");
println!("{}", kanal);
}
Kendini test et
-
<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
- Hiç çalışmaz
Cevabı göster
Betik, paketteki herhangi bir dosya değişince yeniden çalışır; derleme yavaşlar — Doğru bağımlılıkları bildirmek, artımlı derlemenin hızlı kalmasını sağlar.
-
İsteğe bağlı ortam değişkeni
let kanal = ____!("RUST_DERS_KANAL").unwrap_or("geliştirme");
Cevabı göster
let kanal = option_env!("RUST_DERS_KANAL").unwrap_or("geliştirme");
-
Öğe ve görevi
- build.rs
- Derleme öncesi betik
- OUT_DIR
- Üretilen dosyalar
- cargo::rerun-if-changed
- Yeniden çalışma koşulu
- include!
- Dosyayı koda katar
Sıradaki ders: Cross compilation