Urobme niečo s `make` 1.

gcc != grc

Ak máte tú smolu (šťastie) a ste (nie ste) nutení používať na vývoj programov v céčku nejaké integrované (molochovité) vývojové prostredie, veľmi rýchlo sa naučíte kompilovať svoje prvé zápočťáky v Linuxe pomocou tradičného GNU kompilátora gcc.

Veď je to jednoduché: gcc hello.c, z kompilátora vypadne a.out a ideme.

To platí aj pre viaceré súbory. Ak máte knižnicu library.c, hlavičkový súbor library.h a hlavný súbor main.c, ktorý využíva vašu knižnicu, všetko viete schrústať do spustiteľnej binárky pomocou jediného príkazu

gcc main.c modul.c

Praví linuxáci však málokedy používajú takúto konštrukciu. Oni totiž nerobia zápočťáky, a už vôbec nie také, ktoré pozostávajú z jediného modulu.

Namiesto toho používajú make.

Pomocou neho vedia sprehľadniť a zrýchliť kompiláciu viacerých súborov a zároveň mať jeden všeobjímajúci nástroj na vykonávanie viacerých typických perácií nad projektom. Kompilácie, balíčkovanie, distribúcia, to všetko vám make radostne sprostredkuje.

Ale dosť reklamy.

make make

make je inak veselý príkaz, klenotnica mnohých geeky vtipov. make love a podobne.

Teraz je však čas na praktickejšie veselice. Predstavme si najsmiešnejší projekt sveta: jedno hello.c. Základná operácia nad projektom je zrejme vyrobiť spustiteľnú binárku.

gcc -o hello hello.c

Samozrejme, popri tom by sme možno chceli „nainštalovať“ projekt do systému, teda skopírovať ho do /usr/local/bin/.

cp hello /usr/bin/local

Ale beda, na to samozrejme musíme mať skompilované zdrojáky! To však nechajme bokom.

Makefile

Smiešny makefile

make potrebuje na svoje fungovanie súbor, ktorý mu povie, čo sa má urobiť, tzv. makefile. V adresári nášho projektu vytvorme makefile s názvom… nuž… makefile.

hello: 
    gcc -o hello hello.c

Pozor, druhý riadok začína tabulátorom! Má tam byť tabulátor, žiadne štyri medzery, ani dve medzery, toto nie je Python! Znak tabulátora. Jeden. V opačnom prípade bude make nervózny. Tento makefile obsahuje jediné pravidlo pre cieľ (target) s názvom hello. Na to, aby sa zrealizoval cieľ hello, načim skompilovať a zlinkovať súbor hello.c, čo vyrieši gcc.

Gratulujem, to je všetko, čo treba pre prvý makefile. Spusťme ho.

make

Výsledkom je binárka hello.

Spusťme to ešte raz

make

Dve pravidlá v makefile

Zatiaľ to bolo jednoduché. make našiel v makefile jediné pravidlo pre cieľ a spustil ho. Čo ak chceme nainštalovať našu binárku? Dodajme druhé pravidlo:

hello:
    gcc -o hello hello.c
install:
    cp hello /usr/local/bin

Ak teraz zavoláme make, vykoná sa prvý cieľ v makefile, čo je to isté, ako keby sme v našom príklade zavolali make hello. Inštalácia je potom očividná:

make install

Spustí sa kopírovanie a toť vsjo.

Tri pravidlá v makefile: clean

Dodajme si ešte tretí cieľ, typický clean, ktorým upraceme medzisúbory vzniknuté pri kompilácii — v našom prípade vycleanovanie znamená, že zmažeme z projektu všetko, čo nie je zdrojákom, t. j. len binárku:

hello:
    gcc -o hello hello.c
install:
    cp hello /usr/local/bin
clean:
    rm -f hello

Spustenie už poznáte:

make clean

Skúsme si teraz vzápäť z prče spustiť inštaláciu

make install
cp: cannot stat `hello': No such file or directory
make: *** [install] Error 1

Aha, ale inštalácia nemohla prebehnúť, lebo binárku sme zmazali a nová sa ešte neskompilovala! Nebolo by lepšie, keby sa pred inštaláciou automaticky skompilovali zdrojáky? Bolo.

Závislosti medzi cieľmi

Aj v životných cieľoch sú isté závislosti. Na kúpu bytu treba vybaviť hypotéku, na hypotéku mať zamestnanie, na zamestnanie skončiť školu a podobne. Detto platí pre závislosti medzi cieľmi v makefile. Ak chceme ustanoviť závislosť medzi cieľmi install a hello, je to jednoduché. V danom cieli uvedieme za dvojbodku názov cieľa, na ktorom závisíme. install záleží na hello, čiže:

install: hello
    cp hello /usr/local/bin

Skúsme teraz

make install

Všimnime si, ako sa utešene vykonali oba príkazy z oboch cieľov.

Samozrejme, môžeme spúšťať aj viac cieľov naraz. Vymazanie projektu a jeho inštalácia:

make clean install

Pravidlá pre ciele môžu mať v zdrojáku ľubovoľné poradie, pretože make si závislosti sám vyskladá tak, aby sa vykonali správne. Jediná zásada je nezabudnúť na to, že ak make spúšťate bez parametra, tak sa vykoná prvý cieľ v makefile. Deštrukčné ciele teda rozhodne nedávajte na prvé miesto.

Sumár časti číslo jedna

Zatiaľ vieme asi všetko, čo stačí na primitívne programy. Nabudúce si ukážeme, ako zefektívniť zostavovanie projektu vynechaním cieľov, ktoré je zbytočné vykonávať dvakrát. Načo dokola zostavovať binárku, ktorej zdrojáky sa nezmenili?