Creating Binary Modules: Rust

C++'ın aksine, Rust bir projeyi derlemek için bir saatlik CMake/diğer ince ayarları gerektirmez, sadece Cargo'ya sahip olmanız yeterlidir.

Rust'ta ikili modüller (binary modules) oluşturmak için artık iki ana crate (kütüphane) bulunmaktadır - gmod-rs ve rglua (kütüphane, işlevselliği ve yapıyı tanımlar).

İkisinin de kod yazmaya farklı ama benzer yaklaşımlarının yanı sıra farklı işlevsellikleri ve giriş eşikleri vardır.

Bu makalede WilliamVenner'ın gmod-rs crate'ine (kütüphanesine) göz atacağız.

Bağımlılıklar

Resmi sitesinden Rust'ı yükleyin, tek bir yükleyici ile Cargo'ya (paket yöneticisi) ve Rust derleyicisinin kendisine aynı anda sahip olacaksınız.

Rust analyzer (LSP)

İsterseniz, IDE'niz için rust-analyzer'ı (Dil Sunucusu (Language Server) ve diğer güzellikler dahil olmak üzere kolay kod yazımı için bir dizi yardımcı program) kurabilirsiniz.

Bunu vscode'a yüklemek için tek yapmanız gereken marketplaceden resmi eklentiyi yüklemektir.

Yeni bir proje kurma

Rust'ta yeni bir proje oluşturmak için sadece bir komut yazmanız yeterlidir - cargo new <proje adı> --lib.

cargo new my_gmod_dll --lib

Tebrikler! Rust projenizi başlattınız.

Projeyi yapılandırma

Şimdi projemizi gmod için özelleştirelim:

  1. gmod-rs'i bir bağımlılık olarak yükleyin:
cargo add gmod
  1. Bu satırları Cargo.toml dosyasına ekleyin:
[lib] crate-type = ["cdylib"]

Aşağı yukarı şöyle görünmelidir:

[package] name = "my_gmod_dll" version = "0.1.0" edition = "2021" [lib] crate-type = ["cdylib"] [dependencies] gmod = "17.0.0"
  1. nightly araç zincirini (toolchain) ayarlayın:
rustup override set nightly

Kodu düzenleme

Projemiz neredeyse hazır, sadece lib.rs dosyasının kaynak kodunu değiştirmemiz gerekiyor - bu durumda bu bir giriş noktası (entrypoint) dosyasıdır ve C++'daki main.cpp'nin bir benzeridir.

lib.rs dosyasını açın ve içindeki her şeyi silin.

İçine bu kodu yerleştirin:

use gmod::{gmod13_close, gmod13_open, lua::State}; #[gmod13_open] fn gmod13_open(lua: State) -> i32 { println!("Hello from Rust!"); 0 } #[gmod13_close] fn exit(_: State) -> i32 { 0 }

Tamamdır! Projenizin sadece derlenmesi gerekiyor ve ardından gmod-rs crate'ini (kütüphanesini) keşfetmeye ve Lua yığını (stack) ile çalışmaya başlayabilirsiniz!

Gördüğünüz gibi, gmod13_open ve gmod13_close fonksiyonları State argümanı ile doldurulmuştur. Bu, Lua ile ikili modülünüz (binary module) arasındaki arayüz olan bir nesnedir. Onun aracılığıyla Lua yığınını (stack) kontrol edebiliriz.

Derleme

WilliamVenner, gmod-rs deposunda projeyi derlemek için hazır CLI komutları sunmaktadır, ancak ben bunları yine de burada paylaşacağım:

Platform Komut Açıklama
win32 cargo build --target i686-pc-windows-msvc Windows 32-bit
Sunucunuz Windows üzerinde çalışıyorsa ve Garry's Mod'un main branch'inde ise (bu varsayılan branch'tir) bunu kullanın.
win64 cargo build --target x86_64-pc-windows-msvc Windows 64-bit
Sunucunuz Windows üzerinde çalışıyorsa ve Garry's Mod'un x86-64 branch'inde ise bunu kullanın.
linux cargo build --target i686-unknown-linux-gnu Linux 32-bit
Sunucunuz Linux üzerinde çalışıyorsa ve Garry's Mod'un main branch'inde ise (bu varsayılan branch'tir) bunu kullanın.
linux64 cargo build --target x86_64-unknown-linux-gnu Linux 64-bit
Sunucunuz Linux üzerinde çalışıyorsa ve Garry's Mod'un x86-64 branch'inde ise bunu kullanın.

Proje başarıyla derlendikten sonra, oluşturulan .dll (.so unix benzeri sistemlerde) dosyasını bulun ve burada yazıldığı gibi istenen sonuca göre yeniden adlandırın.

Derlenmiş ikili dosyayı Windows'ta target/<TARGET>/debug/my_gmod_dll.dll veya Linux'ta target/<TARGET>/debug/libmy_gmod_dll.so yolunda bulabilirsiniz.

Projeyi release modunda derlemek isterseniz, derleme komutuna --release bayrağını ekleyin.

Sonuç

Bu kadar kullanışlı araçlarımız olduğu için Rust'ta her şeyin kolay olduğunu düşünmenizi istemem. Evet, C++'ın aksine araçlarımız çok kullanışlıdır, ancak dilin kendisine alışmak uzun zaman alır. Bu yüzden onu öğrenmeyi düşünüyorsanız, buna değip değmeyeceğini birkaç kez düşünün.

Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord