O SDL se všude možne už určtě naplkalo dost pověstí nejen v bezesných a nezasněžených nocích, takže by asi bylo nemálo zbytečné se pouštět do nějakého toho obecně libového a zbytečně okrasného úvodu. Se SDL se poprvé z hlubin příkazové... řádky vynořil minjík na svém tehdejším (a dnes již pekelně zanedbaném) binárním blogísku a od té doby je tak nějak všudypřítomné.
Všudypřítomné možná až tak, že vznikl bombový projekt Codename Bomb, který má za cíl kompletní přepis Atomic Bombermana z roku 1997 pomocí C++/SDL při zachování všech jeho vlastností a grafiky a doplnění o podporu moderních síťových protokolů (IPv4 a IPv6) a podobné vychytávky. A abych se asi ani já příliš nenudil, dělám testování a vlastně i dobrovolně odpovídám za chod celé této bombově multiplatformní věcičky pod Mac OS X.
SDL samotné funguje jako knihovna vyvíjená s drakonickou licencí GPL a od toho se pochopitelně odvíjí první část libovolného problému. Bombí projekt měl původně v úmyslu se nechat sestavovat jednoduše pomocí CMake, s čímž tu narážíme, neboť z pohledu SDL lze Mac OS X chápat jako hybrid klasického systému MacOS a obecného UNIXu. Pro vývoj uživatelsky přirozenější cestou je SDL výhodnější používat jako framework, který je tak koneckonců i na strákách SDL pro Mac jako jediný ke stažení (nepočítám zdrojové kódy - z nich ovšem také může vzniknout celý balík frameworku). A pokud je v systému pouze framework a ne UNIXové knihovny, není možné kompilovat klasickou cestou z generovaného Makefile pomocí CMake. A když se naopak SDL nainstaluje pomocí MacPorts, objeví se zas nové možné chyby v cestách. Takže jak z toho?
Prvním a naivním řešením je použití statické knihovny, kterou v první řadě nekomerční licence zrovna nedovoluje tímhle způsobem používat a kdesi cosi. Zábavou v tomto případě je, že statická knihovna ve frameworku jako takové neexistuje, musíme ji nejprve vytvořit.
$ gcc -I/Library/Frameworks/SDL.framework/Headers -c /Library/Frameworks/SDL.framework/Headers/SDLMain.m
$ ar rcs libSDLmain.a SDLMain.o
A pozor během sestavování na architekturu (dá se specifikovat pomocí -arch přepínače, samozřejmě), nebo to bude zas zdlouhavé a brutální. Vznikne tak SDLmain.o soubor a ten se pak připojí mezi ostatní kompilované soubory a jede se.
Bohužel, jak bylo řečeno, takhle to trvale nelze, takže to chtělo najít mnohem lepší řešení a využít pro sestavení Xcode, čímž se i získá vlastně celá paráda - hotová, čistá a hlavně jednoduše klikatelná aplikace (.app bundle). A spěchalo to. Spolu s SDLmain jsou v extras obsaženy i mustry, tedy project templates pro Xcode. Pomocí nich se vytvoří projekt typu SDL Application, vyhodí se z něj zbytečnosti a akorát se přidají ostatní zdrojové soubory. Pokud není nikde žádný jiný speciální požadavek - což by u multiplatformních kódů být neměl - musí toto stačit a vše by mělo fungovat hned prostým kliknutím na zelené tlačítko Build. Pokud ne, vyskočme z okna.
Nějaká chytrá hlava si ale vymyslela, že implicitní cesta, ze které si bude výsledná SDL aplikace brát data, nebude ovšem v adresáři Resources jak bývá slušným zvykem u Cocoa aplikací (.app/Contents/Resources), ale na úrovni samotného balíku. To je poněkud nepříjemné a rozbíjí to celý hezký záměr vytvořit 100% jablečnou aplikaci, takže je potřeba SDLmain.m trochu pokrotit a upravit, aby se to celé chovalo podle očekávání.
89,97c89,96
< char parentdir[MAXPATHLEN];
< CFURLRef url = CFBundleCopyBundleURL(CFBundleGetMainBundle());
< CFURLRef url2 = CFURLCreateCopyDeletingLastPathComponent(0, url);
< if (CFURLGetFileSystemRepresentation(url2, 1, (UInt8 *)parentdir, MAXPATHLEN)) {
< chdir(parentdir); /* chdir to the binary app's parent */
< }
< CFRelease(url);
< CFRelease(url2);
< }
---
> char workingdir[MAXPATHLEN];
> CFURLRef url = CFBundleCopyResourcesDirectoryURL(CFBundleGetMainBundle());
> if (CFURLGetFileSystemRepresentation(url, true, (UInt8 *)workingdir, MAXPATHLEN)) {
> chdir(workingdir); /* chdir to Resources */
> }
> CFRelease(url);
> }
>
Pokud by to z tohoto diff nebylo příliš jasné, pak zde je k dispozici celý upravený zdrojový kód - tak, jak odpovídá aktuální verzi 1.2.14.
Na závěr... by se hodilo, kdyby milý minjísek bral úvodní zmínku o jeho blogísku jako apel a celou tu zapomenutou věc oživil a/nebo nějak převedl. Protože potřebujeme, aby se blogovalo. O nesmyslech, ale kvalitně. Je toho málo.
Pár odkazů
- SDL: http://www.libsdl.org/
- Binární blog: http://binary.blog.cz/
- Codename Bomb: http://bagauio.eida.cz/bombwiki
