Hlavní navigace

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

Stanislav Brabec 12. 8. 2002

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.

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

Našli jste v článku chybu?

22. 3. 2006 9:51

uživatel si přál zůstat v anonymitě
Asi doslo maslo.

28. 8. 2002 14:40

uživatel si přál zůstat v anonymitě

Nemohla by sa niektora z dalsich casti venovat trochu aj pohladu z druhej strany? Myslim nieco ako: "pisem si nejaky super projekt a uz ma nebavi pisat Makefiley, chcem zacat pouzivat automake a autoconf. ako na to?" Nemusi to byt nic podrobne, aspon par dobrych rad, aby clovek mohol ziskat prehlad a aby vedel, co vsetko sa pri tom pouziva, podrobnosti sa uz daju dohladat v dokumentacii. Proste nejaky strucny tutorial, kde by sa clovek mohol dozvediet co a hlavne v akom poradi robit.

Root.cz: Vypadl Google a rozbilo se toho hodně

Vypadl Google a rozbilo se toho hodně

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Vitalia.cz: Pečete cukroví a zbyl vám bílek?

Pečete cukroví a zbyl vám bílek?

Vitalia.cz: To není kašel! Správná diagnóza zachrání život

To není kašel! Správná diagnóza zachrání život

Vitalia.cz: Chtějí si léčit kvasinky. Lék je jen v Německu

Chtějí si léčit kvasinky. Lék je jen v Německu

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

DigiZone.cz: Sony KD-55XD8005 s Android 6.0

Sony KD-55XD8005 s Android 6.0

Vitalia.cz: Mondelez stahuje rizikovou čokoládu Milka

Mondelez stahuje rizikovou čokoládu Milka

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Lupa.cz: Google měl výpadek, nejel Gmail ani YouTube

Google měl výpadek, nejel Gmail ani YouTube

DigiZone.cz: ČT má dalšího zástupce v EBU

ČT má dalšího zástupce v EBU

Vitalia.cz: Baletky propagují zdravotní superpostel

Baletky propagují zdravotní superpostel

Vitalia.cz: Paštiky plné masa ho zatím neuživí

Paštiky plné masa ho zatím neuživí

Lupa.cz: Babiš: E-shopů se EET možná nebude týkat

Babiš: E-shopů se EET možná nebude týkat

Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Vitalia.cz: Dáte si jahody s plísní?

Dáte si jahody s plísní?

DigiZone.cz: Rádio Šlágr má licenci pro digi vysílání

Rádio Šlágr má licenci pro digi vysílání

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

Root.cz: Certifikáty zadarmo jsou horší než za peníze?

Certifikáty zadarmo jsou horší než za peníze?

120na80.cz: Horní cesty dýchací. Zkuste fytofarmaka

Horní cesty dýchací. Zkuste fytofarmaka