MySQL za iPhone DIY
Objavljeno 16.07.2009. Objavio/la: Tomislav Ribaric
U sekciji iPhone aplikacije, Škola | 12 Komentara

UNIX command-line (CLI – Command Line Interface) aplikacije na iPhone-u nisu novost. Od kad je uspješno “jailbreakan”, entuzijasti iz iphone-dev tima, no i ostali, uspješno su “portali” mnoštvo CLI UNIX aplikacija na iPhone. Od osnovnih sistemskih aplikacija, kao što su ljuske (sh, bash,..), osnovni shell alati (ls, ps, grep, su, sudo,…), do alata za konfiguraciju SQLITE sustava za upravljanje bazama podataka, OpenSSH-a, pa čak i command-line datotečnih upravitelja kao što je primjerice midnight commander.
CLI aplikacije zahtjevaju terminalni emulator kako bi se mogle koristiti, jer terminalni emulator omogućava korištenje jedne od UNIX ljuski (eng. shell), koje nisu ništa drugo nego linijsko komandno sučelje unutar kojega se izvršavaju CLI aplikacije. No, iPhone OS službeno ne uključuje takvu aplikaciju, niti ju je moguće downloadati s App Store-a, niti ne uključuje nijedan tip ljuske. No, jailbreakani uređaji imaju mogućnost instalacije terminalnog emulatora (Terminal.app) te najčešće korištenih ljuski (sh, bash, z-shell) preko Cydia repozitorija, što iPhone OS obogaćuje s mogućnošću korištenja CLI aplikacija – drugim riječima, pretvara ga u pravi mali UNIX stroj.
Na iPhone su, osim CLI aplikacija, portane i mnoge druge UNIX aplikacije i libraryji, pa tako i aplikacije potrebne za uspostavljanje funkcionalnog web servera; HTTP server (lighttp), PHP server-side skriptni jezik, pa čak i Ruby skriptni jezik te njegov framework za izradu web aplikacija – Rails. Svi mi koji se bavimo, na bilo koji način, web aplikacijama znamo da web aplikacija nije web aplikacija bez dobrog back-end-a za čuvanje podataka, dakle bez dobrog softwera za upravljanje bazama podataka. iPhone OS nativno koristi SQLite sustav za upravljanje podataka, što funkcionira dobro i s PHP web aplikacijama, i s Rails web aplikacijama, no danas mnoštvo aktualnih web CMS sustava (WordPress, Joomla, Drupal, TYPO3) najbolje se slažu s “kraljem” open source RDBMS-a (Relational Database Management System), MySQL RDBMS-om. Iz tog sam razloga krenuo u potragu za MySQL verzijom za iPhone OS (odnosno za ARM procesorsku arhitekturu jer iPhone koristi ARM procesor), no nisam pronašao takvu verziju. Sljedeća opcija je bila cross kompajliranje (eng. cross-compiling) MySQL sustava.
Cross kompajliranje znači kompajliranje software-a na jednoj platformi za drugu platformu; odnosno, binarne datoteke dobivene cross kompajliranjem ne mogu se izvršavati na stroju na kojemu su kompajlirane, nego na stroju za koji su kompajliranje. Cross kompajliranje zahtjeva cross kompajler, a takvih ima mnogo verzija; cross kompajler za powerpc linux, za arm linux, za arm darwin (iPhone OS), za SPARC arhitekture itd. Cross kompajlirati možemo i na linux sustavima, i na Mac OS X sustavima, u biti na svim sustavima za koje postoji cross kompajler za platformu za koju želimo kompajlirati aplikaciju.
Cross kompajliranje se može obaviti i za iPhone, i to u linux i Mac OS X sustavu koristeći iphone-dev toolchain – set alata za kompajliranje i cross kompajliranje nativnih aplikacija za iPhone OS, koji je u biti jedna alternativa za službeni iPhone SDK te pruža mogućnost izrade nativnih iPhone aplikacija i na drugim platformama, ne samo na Mac OS-u. Uz izradu novih aplikacija, toolchain omogućava i cross kompajliranje (možemo to nazvati i “portanje”) aplikacija koje rade, primjerice, na nekom od desktop UNIX sustava, za iPhone OS. Cross kompajler za iPhone podržava kompajliranje aplikacija pisanih u objektnom C-u, C-u i C++.
Alternativa toolchainu za cross kompajliranje je službeni iPhone SDK, no pomoću njega cross kompajlirati možemo samo na Mac OS-u. Ja sam cross kompajliranje MySQL-a za iPhone obavio pomoću iPhone SDK-a, i to zato jer nisam uspio kompajlirati iphone-dev toolchain cross kompajler na Leopardu za iPhone OS 3.0, a vraćanje na 2.2.1 zbog toga nije dolazilo u obzir. Zaključujete dakle da sam koristio najsvježiji SDK, 3.0, što ne znači da ne možemo koristiti i SDK za 2.0 ili 2.2 – ovisi samo o tome koji OS imamo na iPhone-u.
Tražeći po internetu smjernice za cross kompajliranje MySQL-a za iPhone, naišao sam na mnoštvo pesimističnih stavova (nije moguće, možda je moguće, moglo bi biti), al svejedno sam odlučio probati, pa da vidimo. Našao sam odličan tutorial za cross kompajliranje MySQL-a s jedne linux arhitekture na drugu (http://forge.mysql.com/wiki/LinuxCrossCompilation), tutorial za cross copajliranje OpenCV-a za iPhone (http://lambdajive.wordpress.com/2008/12/20/cross-compiling-for-iphone/), i kombinirajući informacije iz oba te dodatno prilagođavajući source MySQL-a, uspio sam cross kompajlirati MySQL verziju 5.0.41 za iPhone OS 3.0 (probam sam nekoliko verzija, ova se namanje “bunila”).
Članak sam započeo s pričom o CLI aplikacijama; razlog tome je taj što su osnovni alati za administraciju MySQL RDBMS-s CLI alati, te je za njegovo korištenje potreban terminalni emulator – nije ga dakle moguće cross kompajlirati bez da jailbreak-amo iPhone.
Slijedi kratak tutorial kako to učiniti.
ŠTO JE POTREBNO:
- MySQL 5.0.41 source
- ncurses headeri – najjednostavnije ih skinuti s iPhonea (naravno prije instalirati new courses preko cydie) – sadrže opis i definicije raznih terminalnih emulatora, a kako mysql sadrži CLI alate, treba ih
- iPhone SDK 3.0 – sadrži ono najvažnije – cross compiler
– naravno, ako se na mobu nalazi niži OS, koristi se “niži” SDK
KORACI:
1. prvo i osnovno, editirati configure skriptu iz source direktorija – kako bi se riješili izlaska iz skripte s outputom “error: cannot run test program while cross compiling” – testovi ionako ovdje nisu važni. Skripta ima nekoliko ovakvih dijelova:
if test “$cross_compiling” = yes; then
{ { echo “$as_me:$LINENO: error: cannot run test program while cross compiling
See \`config.log’ for more details.” >&5
echo “$as_me: error: cannot run test program while cross compiling
See \`config.log’ for more details.” >&2;}
{ (exit 1); exit 1; }; }
treba { (exit 1); exit 1; }; } dio zamijeniti s jednostavnom zatvorenom vitičastom zagradom, kako se skripta ne bi prekinula prilikom izvršenog danog uvijeta – to će onda izgledati ovako:
if test “$cross_compiling” = yes; then
{ { echo “$as_me:$LINENO: error: cannot run test program while cross compiling
See \`config.log’ for more details.” >&5
echo “$as_me: error: cannot run test program while cross compiling
See \`config.log’ for more details.” >&2;}
}
2. treba riješiti još jedan mali problemčić s configure skriptom; ukratko, sljedeći kod:
if test “$ac_cv_conv_longlong_to_float” != “yes”
then
{ { echo “$as_me:$LINENO: error: Your compiler cannot convert a longlong value to a float!
If you are using gcc 2.8.# you should upgrade to egcs 1.0.3 or newer and try
again” >&5
echo “$as_me: error: Your compiler cannot convert a longlong value to a float!
If you are using gcc 2.8.# you should upgrade to egcs 1.0.3 or newer and try
again” >&2;}
{ (exit 1); exit 1; }; };
postaje;
if test “$ac_cv_conv_longlong_to_float” != “yes”
then
{ { echo “$as_me:$LINENO: error: Your compiler cannot convert a longlong value to a float!
If you are using gcc 2.8.# you should upgrade to egcs 1.0.3 or newer and try
again” >&5
echo “$as_me: error: Your compiler cannot convert a longlong value to a float!
If you are using gcc 2.8.# you should upgrade to egcs 1.0.3 or newer and try
again” >&2;}
};
./configure –host=”arm-apple-darwin9″ –target=arm-apple-darwin9 –prefix=/usr/local/mysql –disable-assembler –with-extra-charsets=complex –enable-thread-safe-client –with-big-tables –with-readline –with-mysqld-ldflags=-static –with-client-ldflags=-static –enable-local-infile CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 CPP=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp CXXCPP=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/cpp CXX=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 AR=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar RANLIB=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ranlib NM=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/nm CFLAGS=”-arch armv6 -pipe -Wno-trigraphs -fpascal-strings -fasm-blocks -O0 -Wreturn-type -Wunused-variable -fmessage-length=0 -fvisibility=hidden -miphoneos-version-min=2.0 -gdwarf-2 -mthumb -miphoneos-version-min=2.0 -I/Library/iPhone/include -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk” LDFLAGS=”-arch armv6 -pipe -gdwarf-2 -mthumb -I/Library/iPhone/include -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk” CXXFLAGS=”-arch armv6 -pipe -felide-constructors -fno-exceptions -fno-rtti -Wno-trigraphs -fpascal-strings -fasm-blocks -O0 -Wreturn-type -Wunused-variable -fmessage-length=0 -fvisibility=hidden -miphoneos-version-min=2.0 -gdwarf-2 -mthumb -miphoneos-version-min=2.0 -I/Library/iPhone/include -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk”
5. iPhone SDK sys/socket.h C header datoteka ne definira konstantu TCP_NODELAY, koju MySQL source koristi, pa je moramo definirati; jednostavno u sys/socket.h datoteku iPhone SDK include direktorija dodati sljedeću liniju:
#define TCP_NODELAY 0×200
6. Naposljetku, izvršiti make
8. otići u /usr/local, te mysql direktorij kopirati na iPhone (putem SFTP klijenta najbolje) – ja sam ga primjerice kopirao u svoj home direktorij (/private/var/mobile), jer je on montiran na drugoj particiji od 7 i po GB, dok na prvoj nema baš mjesta (prva particija je “sistemska”, i velika oko 500MB)
ldid -S naziv_programa
primjerice, jednostavnije je ući u određeni direktorij, npr. bin, i dati naredbu da se potpišu sve datoteke unutar direktorija:
ldid -S *
12. kreirati unutar mysql direktorija var direktorij
14. na kraju pokrenuti mysql server kao root korisnik: mysql/bin/mysqld_safe –user=root & (primjerice, jer ne postoji mysql korisnik na iphoneu) – to možemo učiniti ili korištenjem sudo naredbe, ili da se prebacimo na root korisnika (su root – defaultni password za root korisnika je alpine)
Nakon uspješne instalacije i pokretanja MySQL-a, u CLI alat za administraciju ulazimo s bin/mysql naredbom (unutar mysql direktorija).
Sljedeći korak je konfiguracija PHP-a da radi s MySQL-om, pa instalacija phpmyadmin web aplikacije za konfiguraciju MySQL sustava itd.. No o tome drugom prilikom.
Tagovi: DIY, iPhone, mysql
Komentari:
12 komentara na “MySQL za iPhone DIY”
Ostavi komentar

Loading ...
Imam dojam da mi je IQ pao na cca 78…
Želim izraziti poštovanje svima koji se bave ovakvim … čudesima i omogućavaju nam da se koristimo ulickanim aplikacijama.
Pozdrav od “usera”
Samo jedno pitanje: cemu to??
Jebate ficho što si bahat u zadnje vrijeme. daj ohladi malo!
Ne znam ja ko je tu bahat. Samo pitam cemu patnja s MySQLom na iPhoneu jer sumnjam da Tomislav nema pristup bar jednom kvalitetnom MySQL serveru.
Zasto pas lize svoja jaja?
Zato jer moze
Mislim da je vaznije to sto se moze nego cemu sluzi (bar konkretno mysql) al je ujedno opisao kako napraviti cross compile hrpetine drugih stvari koje ce mozda nekome biti korisne.
Pa.. ima gomila web aplikacija koje zahtjevaju MySQL. Kad vec imamo PHP i web server glupo je ne imati i mysql ako moze raditi zadovoljavajuce, ne?
Da Toni, al pricamo o iPhoneu
Ne znam, strasno mi je da se jadan mobitel koristi za takve stvari, nije kao da mu baterija traje danima
od kad je iphona i toucha, prestao sam laptop koristit.. ne treba mi.. dakle, da mi treba MySQL, Tonijeva prezentacija bi mi bila itekako potrebna jer bi koristio preko iphonea..
Dobro, predajem se
(iako jos uvijek mislim da nema smisla vrtit server na mobitelu
)
ma puno tog nema smisla, al lijepo je prikazat da postoji mogucnost..
Eto sjetio sam se jednog scenarija di bi to moglo dobro doc. Prezentiras web aplikaciju i nestane struje…
Ficho, slazem se s tobom u tome da nije bas logicno vrtiti MySQL server na iPhoneu. Ovaj je clanak pisan s ciljem da samo ukaze na tu mogucnost, i to iz dva osnovna razloga: da se citatelji upoznaju s jednom od mnostva mogucnosti iphonea, da vide kako je iPhone u biti u svojoj srzi pravo UNIX racunalo, te, najbitnije, da im priblizi pojmove cross kompajliranja te mogucnosti “portanja” mnostva desktop aplikacija na iPhone. Drugo, da pomogne onima kojima treba MySQL na iPhone-u (ili cross kompajliranje nekog drugog programa) iz raznoraznih razloga; meni je primjerice bio potreban iz cistog hobija, da vidim koliko efikasno iPhone moze vrtiti web aplikacije koje koriste MySQL, a posebice kako se na njemu ponasaju web CMS sustavi tipa TYPO3. Naravno da za razvoj web sustava/aplikacija necu koristiti iPhone za server