Svatá trojice
V této kapitole vám popíši to, co má být výsledkem celého snažení s autotools: skript configure a soubor Makefile.
O svaté trojici
Svatá trojice (holy trinity) je neformální označení pro příkazy
configure
(který zkonfiguruje projekt na základě argumentů a
prozkoumání systému), make
(který projekt přeloží)
a make install
(který projekt nainstaluje do určených adresářů).
GNU Build System, alias Autotools, je sada nástrojů, která vám pomáhá vytvořit soubory configure a Makefile.
Soubor configure není nic jiného, než skript naspaný v bashi, který má za úkol prohledat váš systém a zjistit, jaké knihovny, programy, nebo hlavičkové soubory máte či nemáte na svém počítači dostupné. Kromě toho také může vytvářet různé soubory na základě šablon, které mu připravíte. Typicky z config.h.in se vytváří config.h a z Makefile.in soubor Makefile.
Cíle makefile
Příkaz make už znáte z kapitoly o Makefile. GNU Standard vyžaduje mnoho cílů, o kterých jsem se ještě nezmínil. Kromě těch standardních vytváří automake další užitečné cíle. Nejdůležitější cíle jsou tyto:
- make all
- Toto je defaultní cíl, který se spustí když žádný cíl nezadáte. Zkompiluje celý program.
- make install
- Nainstaluje program do systému. S tímto cílem vám autotools (přesněji automake) velice pomůže. Postará se o to, aby binární i datové soubory skončili tam, kde je to pro ten či onen systém nejvhodnější. (Případně dá možnost uživateli určit, kam chce program, jeho datové soubory, hlavičkové soubory a sdílené knihovny nainstalovat). Postará se i o nastavení správných přístupových práv (např. práva spuštění pro program, právo čtení, ale ne zápisu uživateli – pokud instalujete do systémových adresářů atd.).
- make install-strip
- Jako install, jen nakonec odstraní debug symboly (zavolá program strip).
- make uninstall
- Program se všemi instalovanými soubory odinstaluje. Pozor, toto funguje jen ze stejného adresáře, ze kterého jste program nainstalovali – z Makefile vyrobeného pomocí configure, kterému byly předány tytéž přepínače. (Což je pochopitelné, když můžete přepínači změnit adresáře, kam se program instaluje, případně používat relativní cesty.)
- make clean
- Smaže všechny soubory vytvářené pomocí
make all
. (Např. objektové soubory *.o.) - make distclean
- Smaže i soubory vytvořené pomocí configure (Např. config.h, Makefile atd.)
- make dist
- Vytvoří balíček (obvykle .tar.gz), který obsahuje vše potřebné pro sestavení a nainstalování programu (včetně configure a Makefile souborů). Místo tohoto cíle doporučuji používat distcheck.
- make distcheck
-
Úspěšné provedení tohoto cíle je vrcholem snažení při vytváření
configure a Makefile. Cíl vezme vše, co by
make dist
zahrnul do balíčku a pokusí se přeložit program. A to ještě navíc tak, jako by byly všechny zdroje na read-only médiu, takže se výsledek ukládá do jiného adresáře. Následně pak vytvoří distribuční balíček, jakomake dist
. Pokud zapomenete přidat do distribučního balíčku nějaký potřebný soubor, tento test to odhalí. Odhalí i spousty dalších chyb, takže jej určitě používejte.
Úspěšné provedení make distcheck
je prvním krokem k
vytvoření binárního balíčku vašeho programu pro libovolnou linuxovou
distribuci!
Automake se za vás postará o vytvoření všech těchto cílů a ještě pár
dalších věcí. Makefile vytvořený pomocí autotomake se například
postará o automatické spuštění skriptu configure, pokud se změní některé
soubory, na kterých výsledek spuštění configure závisí.
Automake
věnuji samostatnou kapitolu, nebo dvě.
Utišení make
Jedním z důležitých přepínačů (z pohledu vývojáře) je -s (--silent). Program make defaultně vypisuje na obrazovku všechny příkazy, které provádí. V takovém množství informací se ale snadno stratí varování překladače. Pomocí -s lze make umlčet.
Příklad výstupu make bez -s
:
gcc -DHAVE_CONFIG_H -I. -I.. -Wall -D_REENTRANT -DPSANIPROFI -DBINDIR="/usr/local/bin" -DPKGDATADIR="/usr/local/share/psani-profi" -D_GNU_SOURCE -g -O2 -MT utils.o -MD -MP -MF .deps/utils.Tpo -c -o utils.o utils.c
mv -f .deps/utils.Tpo .deps/utils.Po
rm -f libmain.a
ar cru libmain.a napoveda.o textnapovedy.o root_varovani.o utils.o
ranlib libmain.a
gcc -DHAVE_CONFIG_H -I. -I.. -Wall -D_REENTRANT -DPSANIPROFI -DBINDIR="/usr/local/bin" -DPKGDATADIR="/usr/local/share/psani-profi" -D_GNU_SOURCE -g -O2 -MT curses2.o -MD -MP -MF .deps/curses2.Tpo -c -o curses2.o curses2.c
mv -f .deps/curses2.Tpo .deps/curses2.Po
gcc -DHAVE_CONFIG_H -I. -I.. -Wall -D_REENTRANT -DPSANIPROFI -DBINDIR="/usr/local/bin" -DPKGDATADIR="/usr/local/share/psani-profi" -D_GNU_SOURCE -g -O2 -MT tisk_obrazovky.o -MD -MP -MF .deps/tisk_obrazovky.Tpo -c -o tisk_obrazovky.o tisk_obrazovky.c
tisk_obrazovky.c: In function ‘tisk_zapisniku’:
tisk_obrazovky.c:64:28: warning: variable ‘xm’ set but not used [-Wunused-but-set-variable]
unsigned int yb, xb, ym, xm, x, y;
^
tisk_obrazovky.c:64:20: warning: variable ‘xb’ set but not used [-Wunused-but-set-variable]
unsigned int yb, xb, ym, xm, x, y;
^
mv -f .deps/tisk_obrazovky.Tpo .deps/tisk_obrazovky.Po
gcc -DHAVE_CONFIG_H -I. -I.. -Wall -D_REENTRANT -DPSANIPROFI -DBINDIR="/usr/local/bin" -DPKGDATADIR="/usr/local/share/psani-profi" -D_GNU_SOURCE -g -O2 -MT thread-ncurses.o -MD -MP -MF .deps/thread-ncurses.Tpo -c -o thread-ncurses.o thread-ncurses.c
mv -f .deps/thread-ncurses.Tpo .deps/thread-ncurses.Po
rm -f libcurses.a
ar cru libcurses.a curses2.o tisk_obrazovky.o thread-ncurses.o
ranlib libcurses.a
gcc -DHAVE_CONFIG_H -I. -I.. -Wall -D_REENTRANT -DPSANIPROFI -DBINDIR="/usr/local/bin" -DPKGDATADIR="/usr/local/share/psani-profi" -D_GNU_SOURCE -g -O2 -MT argumenty.o -MD -MP -MF .deps/argumenty.Tpo -c -o argumenty.o argumenty.c
mv -f .deps/argumenty.Tpo .deps/argumenty.Po
...
Všimli jste si té chyby? Výstup make -s
vypadá takto:
Making all in src
Making all in http
Making all in fileManager
Making all in kontrola
Making all in crack
tisk_obrazovky.c: In function ‘tisk_zapisniku’:
tisk_obrazovky.c:64:28: warning: variable ‘xm’ set but not used [-Wunused-but-set-variable]
unsigned int yb, xb, ym, xm, x, y;
^
tisk_obrazovky.c:64:20: warning: variable ‘xb’ set but not used [-Wunused-but-set-variable]
unsigned int yb, xb, ym, xm, x, y;
^
...
To je superstručný výstup, kde se varování neztratí, ale zase dlouho nevidíte, že se něco děje.
Makefile vytvořené pomocí autotools vám dává ještě jednu možnost. Můžete
spustit make s nastavením proměnné V=0
. Výstup pak bude stručný,
ale uvidíte vše, co se děje:
...
CC utils.o
AR libmain.a
CC curses2.o
CC tisk_obrazovky.o
tisk_obrazovky.c: In function ‘tisk_zapisniku’:
tisk_obrazovky.c:64:28: warning: variable ‘xm’ set but not used [-Wunused-but-set-variable]
unsigned int yb, xb, ym, xm, x, y;
^
tisk_obrazovky.c:64:20: warning: variable ‘xb’ set but not used [-Wunused-but-set-variable]
unsigned int yb, xb, ym, xm, x, y;
^
CC thread-ncurses.o
AR libcurses.a
CC argumenty.o
...
To je skvělá vychytávka, kterou dostanete díky automake zdarma.
Volby pro configure
Příkaz configure (vygenerovaný pomocí autotools) má také celou řadu zajímavých
voleb. Vypsat je můžete volbou --help
...
Configuration:
-h, --help display this help and exit
-q, --quiet, --silent do not print `checking ...` messages
...
Installation directories:
--prefix=PREFIX install architecture-independent files in PREFIX
[/usr/local]
--exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
[PREFIX]
...
Some influential environment variables:
...
CC C compiler command
...
Voleb má configure požehnaně, proto jsem výstup z nápovědy hodně zkrátil.
Volba -q
je podobná volbě -s
u makefile.
Potlačí většinu výstupu (checking for ...)
Program a jeho soubory se defaultně nainstalují do /usr/local
(na Linuxu).
Pomocí volby --prefix=/home/petr/testnito se program se všemi
soubory nainstaluje ... víte kam. Volba --exec-prefix změní
instalační adresář pouze pro binárky (spustitelný program, narozdíl od
„architecture-independent“ souborů, jako jsou třeba obrázky atp.).
To se třeba hodí, když mátě nějaký síťový disk sdílený různými operačními
systémy. „architecture-independent“ soubory mohou být sdíleny, ale
binárky ne.
Existují další „jemnější“ volby, kterými můžete změnit adresáře pro
manuálové stránky atp. Prohlédněte si celý výstup z ./configure
--help
pro další informace.
Jedna malá poznámka: tyto volby jsou dostupné i když nepoužijete automake pro vytoření Makefile souborů, ale v takovém případě jsou jaksi impotentní (protože ovlivňují právě jen vytvoření Makefile, který instalaci skutečně provádí).
Skript configure také umožňuje zapnout/vypnout některé featury překládaného programu, například podporu pro ukládání dat do databáze Postgresql. Aby toto program dokázal, potřebuje, abyste měli nainstalované potřebné vývojové balíčky pro postgres. (Za všechno se platí …) V další kapitole vám ukáži, jak přidat do configure skriptu volbu, pomocí níž lze ovlivnit generování Makefile a umožnit tak přeložit program s i bez podpory Postgresu (obecně jakékoliv knihovny).
Posledním důležitým prvkem ovlivňujícím konfiguraci jsou proměnné prostředí.
Například proměnná CC
ovlivňuje, jaký program použije makefile
defaultně pro překlad. (Při spuštění make ještě můžete volbu překaladače
ovlivnit. Spousta voleb configure skriptu lze ještě „přepsat“
při spuštění příkazu make.)
Následující příklady jsou ekvivalentí. První příklad nastaví proměnnou prostředí CC jen pro daný příkaz:
...
checking for gcc... clang
...
Téhož lze dosáhnout i takto:
...
checking for gcc... clang
...
Technicky vzato se takto nenastavuje proměnná prostředí, ale skript ./configure tomuto argumentu rozumí…
Poslední možností je samozřejmě mít proměnnou prostřední nastavenou globálně (třeba pomocí ~/.bashrc skriptu).
./configure
...
checking for gcc... clang
...
Tímto se v Makefile uloží jako defaultní překladač jazyka C program clang. Ale jak už jsem psal, při spuštění make máte stále ještě možnost překladač změnit.
Závěr
V této kapitole jste se naučili, nebo si připoměli, jak se používá
configure; make; make install
, jak lze nastavit adresáře,
kam se program a jeho soubory instalují, nebo jak lze průběh make ovlivnit
proměnnými prostředí.
Od teď už snad budete používat, jako profíci,
configure -q CC=clang; make V=0; make install
:-).