Cele mai multe eșecuri la compilare nu vin din cod, ci dintr-un sistem nepotrivit: alt compilator, altă arhitectură, o unealtă lipsă. Pe internet găsești zeci de tutoriale de tipul „instalează gcc 4.9 și copiază librăriile în /usr/lib”. Majoritatea sunt vechi și făcute pentru alte surse. În lecția asta înveți să afli **ce cere sursa ta** și să pregătești un server de test potrivit.
Makefile ce compilator cere sursa, apoi instalezi exact uneltele de care are nevoie: gmake, compilatorul și câteva librării.Nivel: Avansat. Ce trebuie să știi înainte: lecția game, db, client și sursă, comenzile de bază prin SSH și să ai un server de test cu FreeBSD.
Cuvinte pe care le vei întâlni
| Cuvânt | Ce înseamnă |
|---|---|
| Compilator | Programul care face compilarea. Aici: clang++ (sau, în surse mai vechi, g++). |
| gmake | Unealta care citește Makefile-ul și pornește compilatorul în ordinea corectă. Pe FreeBSD se numește gmake, nu make. |
| Makefile | Fișierul-rețetă: ce fișiere se compilează, cu ce opțiuni, ce librării se folosesc. |
| Arhitectură | Pe câți biți lucrează programul: i386 (32 de biți) sau amd64 (64 de biți). |
| Flag | O opțiune dată compilatorului, de exemplu -m32 („fă program pe 32 de biți”). |
Pasul 1: Află pe ce sistem rulează serverul tău
Pe serverul unde merge jocul (doar citești, nu schimbi nimic), rulează:
uname -m
freebsd-version
file /usr/home/game/share/bin/gameuname -mspune arhitectura sistemului:i386sauamd64.freebsd-versionspune versiunea FreeBSD.filespune pentru ce a fost construit binarulgame(calea e un exemplu, folosește-o pe a ta).
Ce ar trebui să vezi: în pachetul verificat de noi, file arată ELF 32-bit ... Intel i386 ... for FreeBSD 13.0. Asta înseamnă: program pe 32 de biți, făcut pe FreeBSD 13.0. Notează ce vezi la tine.
Pasul 2: Citește ce cere sursa
Copiază sursa pe serverul de test, de exemplu în /usr/home/sursa, cu WinSCP. Apoi caută liniile importante din Makefile-uri:
cd /usr/home/sursa
grep -n "^CC\|^CXX\|^CFLAGS" Makefile game/src/Makefile db/src/Makefilegrep -n afișează rândurile care încep cu CC, CXX sau CFLAGS, cu numărul lor. În sursa pe care am verificat-o am găsit:
| Ce am găsit | Ce înseamnă pentru tine |
|---|---|
CC = clang++-devel | Sursa cere o comandă numită exact clang++-devel. |
-m32 în game/src/Makefile | game se construiește pe 32 de biți. |
-std=c++2a | Cere un compilator destul de nou (standardul C++20). |
GAMEDIR = /usr/metin2/server/share/bin | După compilare, game e mutat automat în acel folder. |
python2.7 update_limit_time.py | Rețeta generală folosește Python 2.7 la un pas. |
makedepend | O unealtă care calculează legăturile dintre fișiere. |
La tine valorile pot fi altele. Scrie-le într-un fișier text, „fișa de compatibilitate” a sursei tale.
Pasul 3: Instalează uneltele
Uneltele de bază, de care au nevoie aproape toate sursele:
pkg install gmake makedependApoi verifică ce compilatoare ai:
which gmake makedepend clang++ clang++-develCe ar trebui să vezi: o cale pentru fiecare unealtă găsită, de exemplu /usr/local/bin/gmake. FreeBSD are deja clang++ în sistem. Comanda clang++-devel apare doar dacă instalezi pachetul de compilator care o aduce (în colecția FreeBSD, de obicei llvm-devel; verifică cu pkg search llvm). Ai două variante:
- Instalezi pachetul care oferă
clang++-devel, dacă există pentru sistemul tău. - Schimbi, într-o copie a sursei,
clang++-develînclang++peste tot unde apare (înMakefile-uri e scris laCCsauCXX), iar înliblua/configschimbiclang-develînclang. E mai simplu, dar trebuie testat: alt compilator poate da alte erori.
Ca să vezi toate locurile, rulează grep -rn "clang" --include=Makefile --include=config . din folderul sursei.
Nu instala un compilator vechi doar pentru că apare într-un tutorial. Folosește ce cere sursa ta.
Sursa verificată mai leagă game de câteva librării de imagini luate din sistem (-lIL -lpng -ltiff -lmng -llcms -ljpeg). Caută pachetele lor cu pkg search devil, pkg search png și așa mai departe. Numele exacte diferă între versiunile FreeBSD. MySQL, boost și cryptopp vin incluse în folderul etc/ al sursei.
Pasul 4: Atenție la 32 de biți
Toate librăriile gata compilate din sursa verificată (libthecore.a, libgame.a, liblua.a, clientul MySQL, cryptopp) sunt pe 32 de biți. Doar game și libserverkey au -m32 scris în Makefile. Pe un FreeBSD i386 asta nu contează, totul iese pe 32 de biți. Pe un FreeBSD amd64, librăriile fără -m32 ar ieși pe 64 de biți și nu s-ar mai potrivi cu game.
De aceea, cel mai simplu drum pentru un începător: un server de test cu aceeași arhitectură ca binarele tale (aici i386). Mutarea pe 64 de biți e un proiect separat, discutat în lecția despre portarea pe un FreeBSD modern.
Pasul 5: Oprește mutarea automată spre serverul live
Pasul ăsta e ușor de uitat și periculos. Makefile-ul din game/src și cel din db/src mută programul compilat într-un folder fix (GAMEDIR și DBDIR). Dacă acel folder e chiar share/bin al unui server pornit, compilarea îți înlocuiește programul fără să te întrebe.
În copia ta de sursă, deschide cu Notepad++ game/src/Makefile și db/src/Makefile și schimbă rândurile în:
GAMEDIR = /usr/home/build
DBDIR = /usr/home/buildApoi creează folderul:
mkdir -p /usr/home/buildAcum tot ce compilezi ajunge într-un loc separat, de unde îl verifici înainte să-l folosești.
Greșeli des întâlnite
- Folosești
makeîn loc degmake.Makefile-urile acestea sunt scrise pentru GNU make.make-ul din FreeBSD dă erori ciudate de sintaxă. - Compilezi pe serverul live. Compilarea ocupă procesorul minute întregi, iar jucătorii simt lag.
- Amesteci 32 și 64 de biți. Primești erori de tipul
file in wrong formatsauincompatible. - Copiezi librării „găsite” în
/usr/lib. E greu de urmărit ce ai schimbat și poți strica alte programe. - Uiți de
GAMEDIR. Primulgmakereușit îți poate suprascrie jocul pornit.
Întrebări frecvente
Pot compila pe Windows?
Sursa verificată are și fișiere Visual Studio vechi (m2server.2008.sln), dar binarele de pe server se fac pe FreeBSD. Pentru începători, recomandarea e un FreeBSD de test, ca un VirtualBox pe calculatorul tău.
Trebuie să am exact FreeBSD 13.0?
Nu neapărat, dar cu cât sistemul de test e mai apropiat de cel pentru care a fost făcută sursa, cu atât ai mai puține surprize. FreeBSD 13.0 nu mai primește actualizări de securitate, deci pentru un server nou verifică pe site-ul FreeBSD ce versiuni sunt încă suportate.
Cât spațiu îmi trebuie?
Câțiva GB liberi sunt suficienți pentru sursă și fișierele intermediare. Verifică cu df -h.
Ce urmează
Continuă cu compilarea librăriilor. Toate lecțiile sunt în lista tutorialelor Metin2.
Server Metin2 gata de joc
Găzduire Metin2 în România, cu instalare de serverfiles, bază de date MySQL și protecție Anti-DDoS inclusă.