Úvod
Poselstvím minulého dílu měl být pohled na kompilaci spíše jako na nouzové řešení. Ideální je používat správce balíčků a software instalovat a spravovat prostřednictvím něj. Ruční kompilace je nejen relativně složitější, ale také vyžaduje, abyste se o takto instalovaný software starali, tedy primárně sledovali bezpečnostní problémy, hodnotili jejich vážnost a řešili je, druhotně pak abyste také měli přehled o dostupnosti nových verzí a změn fungování i nastavování daného softwaru. To je velmi důležité, jelikož nové verze mohou měnit syntax či parametry v konfiguračních souborech, což by při slepém přechodu na novou verzi mohlo zapříčinit nefunkčnost dané komponenty.
Kompilace však přináší i jisté výhody, které pak dotahují do konce zdrojově založené (source-based) distribuce jako Gentoo, SourceMage GNU/Linux atd., které pak kompilaci v mnohém usnadňují. Co se týče výhod kompilace, v první řadě je to jistě možnost mít konkrétní verzi softwaru bez ohledu na to, která verze je k dispozici v aktuálním vydání distribuce. Vedle toho je to ale také možnost používat upravenou verzi, aplikovat specifické patche nebo naopak možnost použít čistou (tzv. vanilla) verzi, která nebyla distribučně upravena – řada distribucí totiž pro různé komponenty využívá vlastní patche, které mohou měnit jejich funkčnost, což někdy přináší nové vlastnosti, ale někdy to může být zdrojem chyb či problémů (v souvislosti s tím nemohu nezmínit nechvalně známý zásah Debianu do openssl knihovny, který díky predikovatelnosti generátoru náhodných čísel oslabil veškeré klíče či certifikáty generované pomocí této knihovny).
Leckterý software lze sestavit s podporou nějaké komponenty nebo bez ní. Kupříkladu, oblíbený textový editor Vim může fungovat jak v terminálu, tak samostatně v grafickém prostředí. Podpora grafického režimu je otázkou kompilační volby. Na serveru je obvykle zbytečné mít konzolové aplikace zkompilované s podporou Xorg, což u binárních distribucí znamená mj. nutnost dotáhnout spolu s instalovanými aplikacemi ještě Xkové knihovny. Kompilací můžete sami určit, jak se má vámi instalovaný software sestavit. Výše uvedená situace je opravdu jen příklad pro ilustraci, jelikož v Debianu můžete tuto situaci snadno vyřešit nainstalováním verze Vimu zkompilované bez Xorg (balíček vim-nox
).
Další výhodou kompilace je možnost použít specifické volby kompilátoru, které mohou kód optimalizovat (zrychlit, zmenšit apod.) či jej lépe zabezpečit.
Máte-li potřebu měnit konfigurační volby a kompilovat větší množství softwaru podle svých potřeb, doporučuji zvážit použití některé ze source-based distribucí.
Kompilační nástroje a zdrojový kód
Abyste mohli kompilovat, potřebujete příslušné nástroje, zejména pak kompilátor. Pro software napsaný v C nebo C++ postačí GCC, dále pak nástroj make
. V Debianu je možné tyto nástroje nainstalovat prostřednictvím metabalíčku build-essential
:
aptitude install build-essential
Ne vždy ale budete kompilovat zrovna aplikace v C. To poznáte podle dokumentace k danému softwaru, která by vám měla říci, co potřebujete k úspěšnému sestavení.
Kromě kompilačních nástrojů potřebujete samozřejmě zdrojový kód daného softwaru. Obvykle jeho získání nepředstavuje problém, pomocí vyhledávače lokalizujete oficiální web projektu, stáhnete příslušný balíček, obvykle tar.gz
či tar.bz2
, přičemž před jeho použitím ověříte kontrolní součty nebo digitální podpisy. Na serveru se vám určitě hodí nástroj wget
, popřípadě nějaký textový prohlížeč (např. lynx
), abyste mohli příslušný software stahovat přímo na serveru a nemuseli ho tam kopírovat ze své stanice (což byste nejspíše provedli pomocí nástroje scp
či FUSE modulu sshfs
).
SCM: Systémy pro správu verzí
Chcete-li opravdu „bleeding-edge“ kód (na serveru lze jeho použití důrazně nedoporučit), přijdete nejspíše do styku s nástroji pro správu verzí (SCM, Source Control Management, tedy např. Git, Mercurial, Subversion apod.). To jsou nástroje, které umožňují v zásadě dvě věci – v první řadě udržují přehled změn ve zdrojovém kódu, ve druhé řadě pak umožňují nebo usnadňují spolupráci více vývojářů na jednom projektu. Z pohledu správce obvykle představují nutnost nainstalovat příslušný nástroj nebo jeho klienta. Zde předešlu, že mnoho webových služeb (GitHub apod.) umožňuje stáhnout balíček s kódem odpovídajícím dané revizi, čímž si tuto práci ušetříte.
Závislosti a instrukce pro sestavení
Řada softwaru má k dispozici instrukce pro sestavení buď v dokumentaci na webu projektu, nebo v souboru INSTALL
, který je přibalován ke zdrojovému kódu. Měli byste zde najít veškeré podstatné závislosti.
Závislosti kompilovaných programů lze rozdělit do dvou kategorií – závislosti kompilační, které jsou nutné pro kompilaci, ale už ne pro samotný běh programu, a závislosti běhové, které jsou třeba pro samotnou funkčnost zkompilovaného softwaru. Kompilační závislostí je samozřejmě kompilátor a s ním spojené nástroje, ale občas to může být i něco jiného. Více vám napoví dokumentace k danému softwaru. Podstatné je, že kompilační závislosti můžete po kompilaci bez obav ze systému odstranit, ty běhové samozřejmě nikoliv.
Jelikož v případě kompilace za vás správce balíčků závislosti řešit nemůže, musíte se s nimi vypořádat ručně. Řešit závislosti je však vhodné s pomocí správce balíčků: máte-li příslušnou závislost v požadované verzi v repozitářích, můžete ji nainstalovat a nemusíte ji kompilovat. K vyhledávání můžete použít příslušné funkce správce balíčků:
aptitude search závislost apt-cache search závislost
Pokud danou závislost v repozitářích nemáte, nebo ji máte ve staré verzi, nezbude vám než ji zkompilovat také. Vzhledem k tomu, že závislostní vazby mohou být košaté, musíte zvážit, zdali se vám kompilace, ale také následná údržba, opravdu vyplatí. Máte-li stabilní binární distribuci, která je už nějaký čas venku, může se klidně stát, že aktuální verze vámi zvoleného softwaru bude vyžadovat kompilaci řady dalších komponent, jelikož v repozitářích je sice máte, ale příliš zastaralé. Udržovat takto sestavený software ručně je dřina.
Hlavičkové soubory
V případě knihoven a komponent, které tvoří závislosti vámi zvoleného softwaru, potřebujete nejenom binárky příslušných knihoven, ale také tzv. hlavičkové soubory. Hlavičkové soubory představují kompilační závislost, k běhu softwaru po kompilaci je tedy nepotřebujete. V případě některých distribucí jsou hlavičkové soubory součástí balíčků s danými komponentami (namátkou Arch Linux). V Debianu jsou umístěny v samostatných balíčcích s přídomkem -dev
. Pokud byste tedy měli knihovnu libssl
v závislostech vámi zvoleného softwaru, nainstalovali byste nejenom balíček libssl
, ale také libssl-dev
.
Svatá trojice
Tento díl zakončím základní informací o tzv. svaté trojici, tedy sérii třech příkazů, které se nejčastěji zmiňují v souvislosti s kompilací. V příštím díle na tuto informaci navážu a ukážu vám vše na příkladu. „Svatá trojice“ vypadá takto:
./configure make make install
První příkaz spouští skript configure
v aktuálním adresáři. Předpokládá se, že se nacházíte v adresáři s rozbalenými zdrojovými kódy. Tento skript je generován obvykle vývojářem, pomocí nástroje autoconf
(více viz GNU build system), a distribuován spolu se zdrojovými kódy. V některých případech (často při kompilaci softwaru získaného pomocí SCM) se můžete setkat s tím, že tento skript chybí a vy si jej musíte vygenerovat sami.
Skript configure
analyzuje váš systém a vygeneruje soubor Makefile
, který pak řídí proces kompilace. Pokud vám chybí nějaká závislost, nebo váš systém neodpovídá požadavkům daného softwaru, měl by tento skript skončit a vyprodukovat chybovou hlášku. Ta by vám měla osvětlit, co vám chybí nebo co musíte udělat.
Jakmile máte k dispozici Makefile
, můžete spustit kompilaci pomocí nástroje make
. Pokud půjde vše dobře, kompilace skončí úspěchem.
Zbývá už jen software nainstalovat. Jeho instalaci je možné provést příkazem make install
, avšak tento postup nedoporučuji – software instalovaný mimo repozitáře je vhodné izolovat od zbytku systému, abyste měli přehled o tom, kde se nachází jeho soubory a nezanesli si do systému nepořádek. Popřípadě si můžete (např. pomocí nástroje checkinstall
) vytvořit balíček, který pak nainstalujete pomocí správce balíčků (v Debianu nástrojem dpkg
). O tom ale až v příštím díle.