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, jako make 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:

make -s
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:

make V=0
...
  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

./configure --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:

CC=clang ./configure
...
checking for gcc... clang
...

Téhož lze dosáhnout i takto:

./configure CC=clang
...
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).

export CC=clang
./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.

make CC=gcc

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 :-).

Komentář Hlášení chyby
Created: 24.12.2018
Last updated: 24.12.2018
Tato stánka používá ke svému běhu cookies, díky kterým je možné monitorovat, co tu provádíte (ne že bych to bez cookies nezvládl). Také vás tu bude špehovat google analytics. Jestli si myslíte, že je to problém, vypněte si cookies ve vašem prohlížeči, nebo odejděte a už se nevracejte :-). Prohlížením tohoto webu souhlasíte s používáním cookies. Dozvědět se více..