Eida.cz - Neřesti SDL a nad hlavou Xcode

Neřesti SDL a nad hlavou Xcode

Eida

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);
> 	}
> 
SDLMain.m 1.2.14 patch

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.

SDLMain.m 1.2.14 full source (patched)

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ů

Tento článek přečetlo již 421 čtenářů (0 dnes).

Komentáře

Nový komentář