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?