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.
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ě.