Hlavní navigace

Kompilujeme ze zdrojového kódu - základní schemata

12. 8. 2002
Doba čtení: 5 minut

Sdílet

Každý pokročilejší uživatel GNU-Linuxu se jednoho dne dostane do situace, kdy chce vyzkoušet poslední verzi nějakého programu, ale binární balíčky pro jeho distribuci ještě nejsou k dispozici. Tehdy většinou sáhne po vlastní kompilaci. Dnes se dozvíme, jak pracují základní kompilační schemata.

Ke kompilaci jakéhokoliv programu ze zdrojového kódu potřebujeme podrobný návod. Kromě těch nejmenších projektů se dnes používá téměř výhradně strojově čitelný návod – Makefile. Jeho zpracováváním se zabývá specializovaný program make. Ten se nachází v každé UNIXové distribuci (v GNU-Linuxu nejčastěji GNU Make).

Je to již letitý program, a protože je psaní makefilů pro velké a víceplatformní projekty poněkud pracné, objeví se občas projekty, které se snaží vytvořit jeho alternativu – za všechny jmenujme například Jam.

Většího rozšíření však dosáhly projekty, které sice používají standardní formát Makefile, ale soubory vytvářejí automaticky pomocí speciálních skriptů z nějakého metaformátu.

V první řadě je to skupina GNU programů pro generování souborů Makefile ze souborů Makefile.in z balíčků Autoconf,

Libtool a GNU gettext. K nim se pojí Automake, který slouží ke generování těchto souborů Makefile.in ze souborů Makefile.am. Programy generují skript configure, který prověří systémové závislosti a vygeneruje korektní makefily.

Druhou významnou skupinou je starší generátor xmkmf, který byl vytvořen v rámci projektu X-Window, aby usnadnil tvorbu knihoven a aplikací pro X.

Třetí skupinou jsou projekty, které generují soubory Makefile ve svém nativním jazyce – projekty v Perlu ze souborů Makefile.PL, projekty v Pythonu ze souborů setup.py atd.

Čtvrtou skupinou jsou balíky, které mají své vlastní generátory – zmiňme namátkou Sendmail, Procmail, Perl nebo projekt SING (Schily Is Not Gnu), použitý pro kompilaci cdrtools.

./configure ; make ; make install

Toto schéma vychází z programu Autoconf. Je to program, jehož účelem je provést řadu testů k ověření konfiguraci počítače a přizpůsobit kompilaci podle ní.

Za onou „magickou trojicí“ stojí celá řada programů, jejichž správná funkce je podmínkou toho, aby kompilace proběhla hladce.

K analýze zdrojového kódu slouží autoscan. Ten vygeneruje soubor configure.scan. Programátor ho vyedituje a dopracuje a poté přejmenuje na configure.in (nebo

configure.ac). Zároveň vytvoří i soubory Makefile.in – vzory pro vytvoření souborů Makefile – a může vytvořit nové testy a umístit je do souboru acinclude.m4, acsite.m4 nebo podobného.

Vytváření souborů Makefile.in a testů je ovšem nudná práce, proto ji většina programátorů přenechává programům z balíku Automake a místo toho ručně píše soubory

Makefile.am

Zde končí ruční zpracování.

V tomto stavu nalezneme většinu balíků například na CVS. Bývá k nim přibalen soubor autogen.sh – skript s instrukcemi, jak z dodaných souborů vytvořit plnohodnotný balík: Program aclocal z balíku Automake vygeneruje soubor testů aclocal.m4. Volitelně se spouští i program

libtoolize, který vytvoří soubory nutné pro tvorbu knihoven, a gettextize, který vytvoří pomocné soubory pro tvorbu lokalizovaných aplikací na všech platformách. Pak program autoheader vytvoří soubor config.h.in a program autoconf vytvoří skript configure. Nakonec skript automake vyrobí soubory Makefile.in ze souborů

Makefile.am

Po těchto úpravách je balík připraven k distribuci (a program autogen.sh již nebude potřeba).

Po rozbalení na cílové platformě se spouští skript configure (autoconf podporuje i křížovou kompilaci pro jinou platformu, ale tím si nebudeme popis komplikovat). Skript configure načte některé systémové proměnné a parametry předané na příkazové řádce. Může též načíst výsledky dříve provedených testů (pro opakovanou konfiguraci nebo křížovou kompilaci) ze souboru config.cache a spustí řadu připravených testů. Přitom zaznamenává výsledky a generuje protokol o činnosti – config.log. Po provedení všech testů vygeneruje ze souborů Makefile.in soubory

Makefile a ze souboru config.h.in soubor config.h. Zaktualizuje soubor config.cache a vygeneruje pomocný soubor config.status pro případnou další konfiguraci.

Tím je balík připraven na spuštění make.

Proběhle-li vše v pořádku, stačí zadat make install a je hotovo!

Jistě se ptáte, proč používat něco tak složitého a nepřehledného, abychom provedli konfiguraci malého balíčku. Je zde mnoho důvodů:

Psát přenositelné aplikace není nijak jednoduché. Na některých platformách chybějí v hlavičkových souborech definice důležitých proměnných nebo funkcí, na jiných platformách jejich definice naopak způsobí chybu. Jindy je nutné vložit hlavičkový soubor jiného jména. Stejná funkce může být na různých platformách v různých knihovnách a může vyžadovat další pomocné knihovny. I vlastní knihovny se vytvářejí na různých platformách různě. Spustitelné soubory mohou vyžadovat přípony a mohou být umísťovány do jiné hierrarchie… Přenositelné testy je nutné psát pouze za pomoci univerzálně dostupného holého Bourne Shellu a základní verze programu

sed.

To ještě není všechno, co programy kolem Autoconf dokáží. Skriptu configure je možné jednoduše předat požadované volby pro kompilátor (např. pro optimalizaci), typ vytvářených knihoven či požadavky na změnu cílového umístění souborů. Autoconf samozřejmě podporuje instalaci do distribučního adresáře pro snadné vytváření binárních balíčků.

Programy lze též kompilovat mimo zdrojový adresář – ten pak zůstává beze změny a nepotřebujeme ani právo zápisu do něj:

tar -z -x -f balik-verze.tar.gz
mkdir build
cd build
../balik-verze/configure --volby
make

Automake navíc nabídne mnoho dalších užitečných cílů (targetů) pro make. Za všechny jmenujme:

make install-strip: instalovat binární soubory bez ladicích informací

make uninstall: odinstalovat soubory

make clean: vymazat z pracovního adresáře zkompilované výsledky

make distclean: vymazat z pracovního adresáře všechny generované soubory

make dist: vytvořit distribuční balíček se zdrojovým kódem

make distcheck: vytvořit distribuční balíček se zdrojovým kódem a ověřit jeho funkčnost

xmkmf

Xmkmf je generátor souborů Makefile, vytvořený původně pro kompilaci X-Window. Je však použitelný i ke kompilaci aplikací. Na rozdíl od Autoconfu není navržen univerzálně, ale na míru kompilaci X. Jeho proměnné popisují stav jednotlivých komponent X, požadované knihovny, jejich jména apod.

Výchozím souborem je ručně psaný Imakefile. Tento soubor zpracuje xmkmf. Na pomoc si vezme systémový konfigurační adresář /usr/X11R6/lib/­X11/config, v němž najde definice pro jednotlivé platformy, a místní konfigurační soubor

host.def, popisující další úpravy konfigurace. Kompilační volby a další hodnoty se zadávají při kompilaci X a xmkmf je použije jako implicitní. Xmkmf vygeneruje soubor Makefile v hlavním adresáři projektu.

Dalšími kroky mohou být make Makefiles, který vygeneruje soubory Makefile v podadresářích, make includes, který vytvoří generované hlavičkové soubory, a make depend, který vytvoří tabulky závislostí.

Pak následuje vlastní kompilace příkazem make a instalace pomocí make install. Po ní ještě následuje make install.man pro instalaci manuálových stránek. Pokud se jedná o knihovnu, make install.sdk nainstaluje hlavičkové soubory (ve staších verzích XFree86 to bylo make install.linkkit).

make ; make install

Toto schéma se používá tam, kde byly soubory Makefile napsány ručně.

Před kompilací je často nutné ručně vyeditovat soubor Makefile, abychom změnili instalační adresář, volby optimalizace, cestu k některým programům apod. Kolik cílů programu make je implementováno, záleží pouze na programátorovi a liší se balík od balíku.

root_podpora

textový popis

Nejstarší schéma, jak kompilovat, byl prostý návod či skript s příkazy. S tím se dnes setkáme pouze u projektů sestávajících z jediného zdrojového souboru. Kompilace se provádí pomocí cc optimalizační_a_dal­ší_volby soubor.c -o soubor a výsledek se instaluje ručně.

Byl pro vás článek přínosný?