aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Metin2

Metin2 Server Source Derleme: FreeBSD Üzerinde

Metin2 server source derleme işi, ilk kez yapan herkesin kafasını karıştıran bir süreçtir: kaynak kodun orijinal olarak FreeBSD için yazılmış olması bir avantaj gibi görünse de, eski bir derleyiciyle yazılmış C++ kodunu güncel kütüphanelerle bir araya getirdiğinizde hata çığ gibi büyür. Bu rehberde, game ve db kaynaklarını FreeBSD üzerinde temiz bir şekilde derlemek için izlediğim adımları ve en sık karşılaşılan hataların gerçek çözümlerini paylaşıyorum.

Neden FreeBSD?

Metin2'nin sunucu tarafı baştan beri FreeBSD üzerinde çalışacak şekilde tasarlandı. Kaynak kod, FreeBSD'nin kqueue tabanlı ağ modeline ve belirli sistem başlıklarına bağımlıdır. Linux'ta derlemek mümkündür ama yama gerektirir; bu yüzden hedefiniz kararlı bir prodüksiyon sunucusuysa, derlemeyi de çalıştıracağınız ortamla aynı tutmak en az sürprizi getirir. Pratikte çoğu kişi FreeBSD 10–12 aralığında bir sürüm tercih eder; çünkü çok eski sürümlerde paket depoları artık erişilemez, çok yenilerde ise clang varsayılan derleyici olduğu için ek uyumsuzluklar çıkar.

Ortamı ve bağımlılıkları hazırlamak

Derlemeye başlamadan önce sistemin temel geliştirme araçlarına ve kaynak kodun beklediği kütüphanelere ihtiyacınız var. FreeBSD'de bunları pkg ile kurabilirsiniz:

pkg install gcc gmake scons
pkg install mysql57-client
pkg install cryptopp devil lzo2 boost-libs

Önemli nokta: çoğu Metin2 source'u GCC ile derlenecek şekilde yazılmıştır, sistemdeki varsayılan clang ile değil. Bu yüzden derleyiciyi açıkça belirtmeniz gerekir. Ayrıca bağımlılıkların başlıca takıldığı yerler şunlardır:

  • MySQL client: libmysqlclient ve başlık dosyaları olmadan db kısmı derlenmez.
  • Crypto++ (cryptopp): serverkey ve şifreleme rutinleri buna bağlıdır; sürüm farkı ciddi hata kaynağıdır.
  • DevIL: bazı build'lerde görsel/atlas işleme için beklenir.
  • Boost: yeni source sürümlerinde gerekebilir; eski sürümler boost olmadan da derlenir.

Derleme sırası: önce kütüphaneler, sonra game ve db

Metin2 source'u tek bir proje değil, birbirine bağımlı birkaç statik kütüphane ve iki ana çalıştırılabilir dosyadan oluşur. Bağımlılık zincirini bozmamak için doğru sırayla derlemelisiniz. Tipik sıra şudur:

libthecore  ->  temel sistem soyutlamaları
libpoly     ->  geometri / çarpışma
libsql      ->  veritabanı katmanı (MySQL)
libgame     ->  oyun mantığı ortak kodu
libserverkey / libserverkey eşdeğeri
db          ->  veritabanı süreci
game        ->  oyun süreci

Her kütüphane kendi dizininde derlenir. Çoğu source'ta Makefile bulunur; bazılarında ise SConstruct dosyasıyla scons kullanılır. GCC'yi zorlamak için en güvenli yol, ortam değişkeniyle derleyiciyi sabitlemektir:

cd Srcs/Server/libthecore/src
gmake -j2 CC=gcc CXX=g++

Önce tüm lib* dizinlerini derleyin, ardından db ve game dizinlerine geçin. Bir kütüphane derlenmeden ona bağımlı olan süreci derlemeye çalışırsanız, bağlayıcı (linker) "undefined reference" hatalarıyla durur.

En sık karşılaşılan hatalar ve çözümleri

Asıl zorluk derlemenin kendisinde değil, eski kodun modern başlıklarla çakıştığı noktalarda. İşte tekrar tekrar gördüğüm hatalar:

  • "error: 'NULL' was not declared" veya eksik tür hataları: genelde bir başlık dosyasının (<cstring>, <cstdlib>) açıkça #include edilmemesinden kaynaklanır. Eski GCC bunları dolaylı olarak çekerdi, yeni sürümler çekmez. İlgili kaynak dosyanın başına eksik başlığı ekleyin.
  • cryptopp ile bağlama hataları: Integer, RSA gibi sembollerde "undefined reference". Bu genellikle başlıkların bir sürüm, bağlanan libcryptopp.a'nın başka bir sürüm olmasından çıkar. Çözüm: Makefile'daki cryptopp yolunu sistemdeki gerçek sürümle eşleştirmek ya da kaynakla gelen cryptopp'u kullanmak.
  • MySQL başlık yolu bulunamıyor: mysql.h: No such file or directory. Makefile genelde /usr/local/include/mysql bekler; pkg'nin kurduğu yol farklıysa -I bayrağını düzeltin. Doğru yolu mysql_config --include ile öğrenebilirsiniz.
  • clang ile derlenmeye çalışması: anlamsız şablon (template) hataları görüyorsanız büyük ihtimalle GCC yerine clang çalışıyordur. CXX=g++ verdiğinizden emin olun.
  • 32-bit / 64-bit uyumsuzluğu: bazı eski source'lar 32-bit'e göre yazılmıştır. 64-bit FreeBSD'de pointer boyutu farkından kaynaklı uyarı ve çökme yaşarsanız, source'un 64-bit'e uyarlanmış bir sürümünü kullanmak en sağlıklısıdır; aksi halde -m32 ile 32-bit araç zinciri kurmak gerekir.

Derleme bittikten sonra: doğrulama

Çıktı olarak db ve game ikili dosyalarını aldığınızda, iş bitmemiştir. Bağlayıcı geçse bile dinamik kütüphane uyumsuzlukları çalışma anında ortaya çıkar. Şu kontrolleri yapın:

file game db          # 64-bit mi 32-bit mi, doğru mimari mi?
ldd game              # eksik paylaşımlı kütüphane var mı?

ldd "not found" diyorsa, ilgili kütüphane kurulu değil ya da LD_LIBRARY_PATH içinde değildir. Sunucuyu başlatmadan önce veritabanı şemasının yüklü olduğundan ve conf.txt / CONFIG dosyalarındaki port ve yol ayarlarının doğru olduğundan emin olun. İlk açılışta syserr ve syslog dosyalarını izlemek, çoğu yapılandırma hatasını ilk dakikada yakalamanızı sağlar.

Pratik tavsiyeler

  • Derleme loglarını dosyaya yönlendirin (gmake 2>&1 | tee build.log) — hata yığınında ilk hatayı bulmak, sondaki yüzlerce takip hatasından çok daha değerlidir.
  • Bir şeyi düzelttiğinizde baştan değil, sadece o kütüphaneden itibaren derleyin; ama bir başlığı değiştirdiyseniz ona bağlı her şeyi temizleyin (gmake clean).
  • Çalışan bir derleyici/kütüphane kombinasyonu bulduğunuzda sürümlerini not edin. Metin2 source'larında "neyle derlendiği" en kıymetli bilgidir.

Sık Sorulan Sorular

Metin2 source'unu Linux'ta da derleyebilir miyim?

Evet, ama doğrudan değil. Kod FreeBSD'ye özgü kqueue ve sistem başlıklarına bağımlı olduğu için Linux'ta epoll uyarlaması ve çeşitli yamalar gerekir. Üretim sunucunuz FreeBSD'de çalışacaksa, derlemeyi de FreeBSD'de yapmak en az sorun çıkaran yoldur.

Hangi FreeBSD ve GCC sürümünü kullanmalıyım?

Kesin bir sürüm yoktur; source'un yazıldığı döneme yakın bir araç zinciri en az hata verir. Pratikte FreeBSD 10–12 aralığı ve pkg'den kurulan bir GCC sürümü iyi sonuç verir. Önemli olan, derlemeyi clang yerine GCC ile yapmaktır.

"undefined reference" hatasını nasıl okurum?

Bu bir derleme değil, bağlama hatasıdır: derleyici dosyayı anladı ama bağlayıcı, çağrılan fonksiyonun gövdesini bulamadı. Genellikle eksik bir kütüphaneyi henüz derlememiş olmanızdan ya da bağlama sırasında -l bayrağının/yolunun eksik olmasından kaynaklanır. Derleme sırasını ve Makefile'daki kütüphane yollarını kontrol edin.

Metin2 sunucu kaynağınız bir türlü derlenmiyor mu? FreeBSD üzerinde temiz bir build, hata ayıklama ve sunucu kurulumu konusunda yardıma ihtiyacınız varsa benimle iletişime geçin — kaynağınıza ve ortamınıza özel çözüm üretelim.

Devamı için