Znáte to určitě velmi dobře. Pracujete na docela malém projektu (tedy řádově stovky až tisíce řádek) a když to po mnoha probděných nocích zprovozníte do stadia, kdy to lze ukázat i někomu jinému než sobě, tak to s povznášejícím pocitem jak jste dobří odnesete někomu ukázat. Nakopírujete a spustíte make. Jenže ouha. Zcela jistě nastane jedna ze dvou situací. Buď se to vůbec nezkompiluje, nebo se to zkompiluje ale nerozběhne. Tomuto problému se asi nikdy nebude dát úplně zabránit, ale přece jen s tím jde něco udělat.
Projekt GNU postupem času vytvořil sadu nástrojů, které mají pomoci tento problém řešit. Ono projekt GNU postupem času vytvořil (a tvoří) sadu nástrojů, které pomáhají řešit skoro všechno :-). Momentálně se tato sada skládá z následujících částí:
- Autoconf – pomáhá s přenositelností projektu mezi různými počítači (OS, HW architektura, verze knihoven a programů)
- Automake – vytváří vstupní Makefile pro autoconf. Zajišťuje standardně používané cíle jako all, clean, install a mnohé další
- Libtool – vrstva, která usnadňuje vytváření sdílených knihoven na různých systémech
- Gettext – nástroj pro internacionalizaci, překlad textů v projektu do různých jazykových verzí.
Uživatelé unixových systémů jsou známi tím, že neradi opisují dokola to samé. S využitím GNU sady nástrojů si usnadníte správu projektu v následujících krocích. Místo ručního vytváření několika souborů Makefile pro různé OS, vytváříte pouze jednu sadu souborů a ty se potom automaticky převedou před kompilací na správné podklady pro make. Koncový uživatel potom nemusí zuřivě prolézat Makefile.linux a podobné a upravovat je dle svého systému.
Místo toho uživatel (tedy spíše překladatel) spustí před vlastní kompilací skript configure, který vygeneruje z připravených šablon soubory Makefile pro vlastní překlad. Takto vygenerované Makefiles jsou potom jedinečné pro konkrétní počítač, verze programů, knihoven a nastavení. Pokud chcete takto rozbalený program přenést někam jinam, musíte ho nejdříve vyčistit a potom na druhém systému znovu spustit skript configure. Nicméně většinou se přenáší zkomprimovaný balík, který jste někde získali, a ten je samozřejmě vyčištěn a ‚ready to use‘.
Pro programátora to znamená několik změn:
- Autoconf – místo souborů Makefile je nutné vyrobit Makefile.in a v hlavním adresáři projektu také soubor configure.in. Makefile.in je šablona pro vygenerování koncového Makefile a configure.in je šablona pro vygenerování skriptu configure. Makefile.in tedy obsahuje informace o tom, co se bude generovat, zatímco configure.in říká jak se to bude dělat. Obvyklé odlišnosti jsou třeba v potřebných knihovnách a jejich umístění, v umístění hlavičkových souborů, vlastnostech překladače, definici datových typů a další radosti.
- Automake – aby programátor nemusel vytvářet soubory Makefile.in, může použít tento nástroj. Rozdíl je v tom, že při použití automake vytváří místo Makefile.in soubor Makefile.am. Ten obsahuje pouze nejnutnější informace a pomocí automake se z něj vygeneruje Makefile.in.
- Config.h.in – často používaný soubor generovaný pomocí autoconfu. Po proběhnutí skriptu configure vznikne config.h (název se může lišit), který lze vložit do zdrojových souborů a podle voleb v něm řídit překlad projektu. Typické použití je:
detekce_funkce_v_knihovně (pomocí maker autoconfu)
→ #define HAVE_FUNCTION_XXX (v config.h)
→ použití ve zdrojovém kódu
#ifdef HAVE_FUNCTION_XXX
func_XXX()
#endif
Nástroj gettext slouží pro vytváření jazykových verzí vašeho projektu. Pomocí připravených programů se ze zdrojových souborů vygeneruje seznam řetězců pro překlad a vám potom už jen zbývá vzít slovník a vytvořit verze vašeho programu v japonštině, ruštině a dalších jazycích. Přitom požadavky na vlastní zdrojové texty jsou celkem minimální. Na začátku programu zavoláte pár funkcí, vložíte nějaký ten hlavičkový soubor a místo „řetězce pro překlad“ použijete něco jako _(„řetězec pro překlad“).
Za tímto zápisem se skrývá makro, které místo zadaného řetězce podšoupne jeho jazykovou mutaci. Jazyk se samozřejmě řídí nastavením proměnných prostředí pro locales – konkrétně LC_ALL. Binární soubory vzniklé z jazykových překladů se potom instalují spolu s programem do adresáře /usr/share/locale/$LANG/LC_MESSAGES jako nazev_programu.mo. Adresář se může dle distribuce a verze OS lišit – např. /usr/local/share… a jiné. Pokud neexistuje příslušné jazykové verze, použijí se základní řetězce umístěné ve zdrojových souborech. V balíku gettext je také sada programů, které slouží pro správu, údržbu a aktualizaci souborů s překlady.
Na konec (tedy spíše pro začátek) ještě příslušné odkazy:
Příště se na některé GNU nástroje podíváme podrobněji.