Rust Kurulumu: rustup ile Araç Zinciri Yönetimi

Sistem yöneticisi olarak hayatımın bir döneminde “neden herkes Rust’tan bu kadar bahsediyor?” diye sordum kendime. Sonra birkaç sistem aracını Rust ile yazılmış versiyonlarıyla değiştirince anladım. ripgrep, fd, bat, exa… Bunların hepsini derlemeye, özelleştirmeye ya da Rust ile kendi araçlarını yazmaya başladığında, Rust araç zincirini iyi yönetmek hayati önem kazanıyor. İşte bu yazıda rustup‘ı, Rust’ın resmi araç zinciri yöneticisini, hem Linux hem de Windows ortamında nasıl kullanacağını en ince ayrıntısına kadar anlatacağım.

rustup Nedir ve Neden Önemlidir?

rustup, Rust programlama dilinin resmi yükleyici ve araç zinciri yöneticisidir. Python’daki pyenv‘e ya da Node.js’deki nvm‘e benzer şekilde çalışır, ancak Rust’a özgü bazı ek yeteneklere sahiptir.

rustup ile yapabileceklerin bir özeti:

  • Birden fazla Rust sürümünü (stable, beta, nightly) yönetmek
  • Farklı platformlar için cross-compilation toolchain’leri yüklemek
  • Proje bazında araç zinciri kitlemeyi sağlamak (rust-toolchain.toml)
  • rustfmt, clippy, rust-analyzer gibi bileşenleri kolayca yönetmek
  • Rust’ı sistem genelinde veya kullanıcı bazında güncellemek

Alternatif olarak bazı Linux dağıtımları apt veya dnf üzerinden Rust paketleri sunsa da bu yöntem genellikle eski sürümleri ve eksik bileşenleri beraberinde getirir. Sistem paket yöneticileriyle kurulan Rust, özellikle nightly özellikler ya da özel hedef platformlar söz konusu olduğunda yetersiz kalır. Bu yüzden rustup her zaman önerilen yoldur.

Linux’ta rustup Kurulumu

Linux üzerinde kurulum son derece basittir. Resmi script’i indirip çalıştırman yeterli:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Bu komut seni etkileşimli bir kurulum sihirbazına yönlendirir. Üç seçenek sunar:

  • 1) Proceed with installation (default): Varsayılan ayarlarla kur, genellikle bu yeterli
  • 2) Customize installation: Araç zinciri, profil ve yükleme dizinini özelleştir
  • 3) Cancel installation: İptal et

Çoğu durumda 1 numaralı seçenek yeterlidir. Kurulum tamamlandığında rustup, ~/.cargo/bin dizinine gerekli binary dosyaları yerleştirir ve ~/.bashrc veya ~/.zshrc dosyana PATH atamasını ekler.

Değişikliklerin aktif olması için ya yeni bir terminal aç ya da şunu çalıştır:

source $HOME/.cargo/env

Kurulumu doğrulamak için:

rustc --version
cargo --version
rustup --version

Sessiz (Non-Interactive) Kurulum

Otomasyon ortamlarında, örneğin Ansible playbook’larında veya Docker imajı oluştururken, etkileşimli kurulum istemezsin. Bu durumda:

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y

-y parametresi tüm varsayılanları kabul eder. Dockerfile içinde kullanmak istediğinde şöyle bir yapı kurabilirsin:

FROM debian:bookworm-slim

RUN apt-get update && apt-get install -y curl build-essential && 
    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y && 
    echo 'source $HOME/.cargo/env' >> ~/.bashrc

ENV PATH="/root/.cargo/bin:${PATH}"

RUN rustc --version && cargo --version

Windows’ta rustup Kurulumu

Windows’ta iki yol var. Birincisi ve önerilen yol, [rustup-init.exe](https://rustup.rs) dosyasını indirip çalıştırmak. İkincisi ise winget kullanmak:

winget install Rustlang.Rustup

Windows’ta Rust derlemesi için MSVC Build Tools gereklidir. rustup-init.exe bunu otomatik olarak algılar ve Visual Studio Build Tools’u yüklemenizi önerir. Eğer Visual Studio zaten kuruluysa sorun yaşamazsın.

Alternatif olarak GNU toolchain’i tercih edebilirsin, bu durumda WSL veya MinGW-w64 üzerinden çalışman gerekir. Ancak Windows’ta native geliştirme yapıyorsan MSVC toolchain çok daha az sorun çıkarır.

PowerShell’de PATH güncellemesi kurulumdan sonra otomatik yapılır. Yeni bir terminal açtığında rustc komutunun çalışması gerekir.

Araç Zinciri (Toolchain) Yönetimi

Rust’ta üç ana release kanalı vardır:

  • stable: Kararlı sürüm, üretim ortamları için
  • beta: Bir sonraki stable sürümün test kanalı
  • nightly: Her gece derlenen, deneysel özellikleri içeren kanal

Mevcut Araç Zincirlerini Listeleme

# Yüklü toolchain'leri listele
rustup toolchain list

# Kullanılabilir bileşenleri listele
rustup component list

# Yüklü hedef platformları listele
rustup target list --installed

Farklı Kanalları Yükleme ve Geçiş Yapma

# Beta kanalını yükle
rustup toolchain install beta

# Nightly kanalını yükle
rustup toolchain install nightly

# Belirli bir sürümü yükle
rustup toolchain install 1.75.0

# Varsayılan toolchain'i değiştir
rustup default stable
rustup default nightly

# Geçici olarak farklı toolchain kullan
rustup run nightly rustc --version

Proje Bazında Araç Zinciri Kilitleme

Bir projede belirli bir Rust sürümü kullanman gerekiyorsa (bu oldukça yaygın bir durum, özellikle embedded veya firmware projelerinde), projenin kök dizinine rust-toolchain.toml dosyası eklersin:

[toolchain]
channel = "1.75.0"
components = ["rustfmt", "clippy"]
targets = ["x86_64-unknown-linux-musl"]

Bu dosya mevcut olduğunda, cargo build veya rustc komutları çalıştırıldığında rustup otomatik olarak doğru sürümü kullanır. Hatta yüklü değilse otomatik indirir. Bu özellik ekip çalışması için muhteşem bir kolaylık sağlar, “bende çalışıyor ama sende çalışmıyor” problemlerini büyük ölçüde ortadan kaldırır.

Bileşen Yönetimi

Rust araç zinciri, birbirinden ayrı bileşenlerden oluşur. En sık kullanılanlar:

  • rustfmt: Kod formatlayıcı
  • clippy: Gelişmiş lint aracı
  • rust-analyzer: LSP sunucusu, editör entegrasyonu için
  • rust-src: Standart kütüphane kaynak kodları
  • llvm-tools-preview: LLVM tabanlı araçlar
  • miri: Unsafe kod için deneysel yorumlayıcı
# Bileşen ekle
rustup component add rustfmt
rustup component add clippy
rustup component add rust-analyzer
rustup component add rust-src

# Belirli bir toolchain'e bileşen ekle
rustup component add clippy --toolchain nightly

# Bileşen kaldır
rustup component remove rust-analyzer

Gerçek dünya senaryosu: CI/CD pipeline’ında clippy ile kod kalitesini kontrol etmek istiyorsun. GitHub Actions workflow’una şunu eklersin:

- name: Rust Toolchain Kur
  run: |
    rustup toolchain install stable --component clippy rustfmt
    rustup default stable

- name: Clippy Kontrolü
  run: cargo clippy -- -D warnings

- name: Format Kontrolü
  run: cargo fmt --all -- --check

Cross-Compilation: Farklı Platformlar için Derleme

Bu konu sistem yöneticileri için özellikle değerli. Diyelim ki x86_64 Linux makinende ARM tabanlı bir Raspberry Pi veya gömülü sistem için binary derliyorsun.

Hedef Platform Ekleme

# Mevcut hedefleri listele (çok uzun bir liste)
rustup target list

# ARM hedefi ekle (Raspberry Pi için)
rustup target add armv7-unknown-linux-gnueabihf

# ARM64 hedefi ekle
rustup target add aarch64-unknown-linux-gnu

# Statik binary için musl hedefi
rustup target add x86_64-unknown-linux-musl

# Windows cross-compilation
rustup target add x86_64-pc-windows-gnu

Hedefi ekledikten sonra derlemek için:

# ARM için derle
cargo build --target armv7-unknown-linux-gnueabihf --release

# Statik binary oluştur (Alpine Linux veya Docker scratch image için ideal)
cargo build --target x86_64-unknown-linux-musl --release

Statik binary konusu özellikle ilgimi çekiyor. Musl toolchain ile derlenen binary’ler, glibc bağımlılığı olmaksızın çalışır. Bu da onu minimal Docker imajlarında kullanmak için mükemmel kılar. 10-15 MB’lık bir scratch imajı ile production’a gidebilirsin.

Cross-compilation için genellikle sistem linker’ını da ayarlaman gerekir. ~/.cargo/config.toml dosyasına şunu ekle:

[target.armv7-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc"

[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"

[target.x86_64-unknown-linux-musl]
linker = "x86_64-linux-musl-gcc"

Gerekli cross-compiler paketlerini yüklemek için Ubuntu/Debian üzerinde:

sudo apt-get install gcc-arm-linux-gnueabihf
sudo apt-get install gcc-aarch64-linux-gnu
sudo apt-get install musl-tools

rustup’ı Güncelleme ve Bakım

Rust oldukça aktif geliştirilen bir dil. Özellikle güvenlik düzeltmeleri ve performans iyileştirmeleri düzenli gelir.

# rustup'ın kendisini güncelle
rustup self update

# Yüklü tüm toolchain'leri güncelle
rustup update

# Sadece stable'ı güncelle
rustup update stable

# Sadece nightly'yi güncelle
rustup update nightly

# Artık kullanılmayan toolchain'i kaldır
rustup toolchain uninstall 1.70.0

# Önbelleği temizle
rustup self clean

Sunucularda aylık rustup update komutu çalıştırmak iyi bir alışkanlık. Bunu cron job olarak ayarlayabilirsin:

# Her ayın 1'inde güncelleme yap
0 2 1 * * /home/deploy/.cargo/bin/rustup update stable 2>&1 | logger -t rustup-update

Nightly Özellikler ve Gerçek Kullanım Senaryoları

Nightly kullanımı riskli görünebilir ama bazı durumlarda kaçınılmazdır. Örneğin async_trait benzeri bazı özellikler stable’a gelmeden önce yıllarca nightly’de geliştirildi. Ya da belirli benchmark araçları (criterion‘un bazı özellikleri) nightly gerektirir.

Proje düzeyinde nightly özelliği aktif etmek için src/lib.rs veya src/main.rs dosyasının en üstüne:

// Sadece nightly'de çalışır
#![feature(async_fn_in_trait)]
#![feature(portable_simd)]

Nightly kullanıyorken toolchain’in belirli bir tarihini kilitlemek de mümkün:

[toolchain]
channel = "nightly-2024-01-15"
components = ["rustfmt", "clippy", "rust-src"]

Bu yöntem, nightly’nin bir günden diğerine değişen davranışlarından seni korur.

Çoklu Kullanıcı Ortamında rustup

Sunucularda birden fazla kullanıcının Rust kullanması gerektiğinde her kullanıcının kendi rustup kurulumuna sahip olması en temiz yaklaşımdır. Ancak disk alanından tasarruf etmek istiyorsan RUSTUP_HOME ve CARGO_HOME ortam değişkenlerini paylaşılan bir dizine yönlendirebilirsin:

# /etc/environment veya /etc/profile.d/rust.sh dosyasına ekle
export RUSTUP_HOME=/opt/rust/rustup
export CARGO_HOME=/opt/rust/cargo
export PATH="/opt/rust/cargo/bin:$PATH"

Kurulumu bu ortam değişkenleri aktifken yap:

RUSTUP_HOME=/opt/rust/rustup CARGO_HOME=/opt/rust/cargo 
  curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y

Ardından /opt/rust dizinini ilgili gruba ait yaparak grup yazma izni ver:

sudo groupadd rustdev
sudo chown -R root:rustdev /opt/rust
sudo chmod -R 775 /opt/rust
sudo usermod -aG rustdev deploy
sudo usermod -aG rustdev jenkins

Yaygın Sorunlar ve Çözümleri

OpenSSL hatası: Cargo bazı crate’leri derlerken OpenSSL’e ihtiyaç duyar.

# Ubuntu/Debian
sudo apt-get install pkg-config libssl-dev

# CentOS/RHEL
sudo dnf install pkgconfig openssl-devel

# Alternatif: vendored OpenSSL kullan
OPENSSL_STATIC=1 cargo build

Linker bulunamıyor hatası: Özellikle minimal sistemlerde cc linker eksik olabilir.

# Ubuntu/Debian
sudo apt-get install build-essential

# CentOS/RHEL
sudo dnf groupinstall "Development Tools"

Disk alanı sorunu: Rust’ın araç zincirleri ve derlenmiş artifact’ları ciddi disk alanı kaplar.

# Cargo önbelleğini temizle
cargo clean

# Kullanılmayan toolchain'leri kaldır
rustup toolchain list
rustup toolchain uninstall <eski-surum>

# sccache ile derleme önbelleğini merkezi hale getir
cargo install sccache
export RUSTC_WRAPPER=sccache

Windows’ta MSVC bulunamıyor: Visual Studio Build Tools eksik olabilir. rustup show komutu aktif toolchain ve hedefleri gösterir. Hata mesajında genellikle link.exe not found yazar. Visual Studio Installer’dan “C++ ile masaüstü geliştirme” iş yükünü yüklemen gerekir.

Ortam Değişkenleri ile İnce Ayar

rustup ve cargo‘nun davranışlarını çeşitli ortam değişkenleriyle kontrol edebilirsin:

  • RUSTUP_HOME: rustup’ın toolchain’leri ve meta verilerini sakladığı dizin (varsayılan: ~/.rustup)
  • CARGO_HOME: Cargo’nun binary’leri, registry önbelleği ve kaynak kodları sakladığı dizin (varsayılan: ~/.cargo)
  • RUSTUP_TOOLCHAIN: Varsayılan toolchain’i geçici olarak değiştirir
  • RUSTFLAGS: Derleyiciye ekstra bayraklar iletir (-C target-cpu=native gibi)
  • CARGO_TARGET_DIR: Derleme çıktılarının yazılacağı dizin
  • RUSTC_WRAPPER: sccache gibi bir wrapper kullanmak için
  • RUST_BACKTRACE: Hata mesajlarında stack trace göstermek için 1 veya full değeri alır

Örnek: Yerel CPU optimizasyonlarıyla derlemek için:

RUSTFLAGS="-C target-cpu=native" cargo build --release

Bu özellikle sayısal hesaplama yoğun uygulamalarda belirgin performans artışı sağlar.

Sonuç

rustup, Rust ekosisteminin en iyi düşünülmüş parçalarından biridir. Sistem yöneticisi gözüyle bakınca, rustup‘ın toolchain yönetimini bu kadar temiz çözmesi gerçekten takdire değer. Proje bazında sürüm kilitleme, cross-compilation kolaylığı ve bileşen yönetiminin tek çatı altında toplanmış olması onu diğer dil yöneticilerinin önüne geçiriyor.

Pratikte önerdiğim yaklaşım şu: Geliştirme makinende stable varsayılan olarak kalsın, belirli projeler için rust-toolchain.toml ile versiyonu kilitle, nightly’yi yalnızca gerçekten gerektiren projelerde kullan. CI/CD ortamlarında her seferinde taze kurulum yapmak yerine, Docker imajlarında önceden hazırlanmış Rust toolchain kullan, bu derleme sürelerini dramatik biçimde kısaltır.

Rust öğrenme eğrisi dik olabilir ama rustup‘ı iyi öğrenince araç zinciriyle boğuşmak yerine tamamen dile ve projeye odaklanabiliyorsun. Gerisi zaten Rust’ın kendi güzelliğinde.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir