Make
Make je alat za automatizirano prevođenje datoteka izvornog koda u izvršne datoteke i/ili biblioteke. Uputstva kako make mora djelovati nalaze se u make datoteci (Makefile) koja obično dolazi sa samim izvornim kodom nekog softvera.
U make je datoteci moguće definirati više procedura/meta koje se pozivaju odvojeno ili povezano, tako npr. je česta praksa da naredba
make
(bez argumenata) prevodi izvorne datoteke u binarne/izvršne;
make install
premješta/kopira binarne datoteke po hijerarhiji sustava (za što su obično potrebne administratorske ovlasti);
make uninstall
briše instalirane datoteke iz hijerarhije sustava;
make clean
briše/čisti sve prevedene i obrađene datoteke i ostavlja samo izvorne datoteke. Dakako, moguća su i odstupanja od ovih pravila, što korisnik lako može provjeriti pregledavanjem make datoteke.
Make u direktoriju u kojem je pokrenut traži make datoteku i to pod više naziva, sljedećim redoslijedom: GNUMakefile, Makefile, makefile. Kad nađe datoteku obično skače na prvu proceduru/metu koja se pojavi u datoteci i tradicionalno naziva all. Moguće je naravno pozivanje i više procedura istovremeno, npr.
make provjeri instaliraj ocisti
ako su iste naravno definirane u make datoteci.
Pisanje make datoteke
Treba razumjeti da je jezik, odnosno sintaksa u kojoj je pisana make datoteka slična onima u deklarativnom programiranju gdje nema klasičnog "toka" u programu. To znači da je slijed i raspored u make datoteci nebitan (make sam određuje koju liniju treba kada izvršiti). Još jedan neuobičajen detalj je da sintaksa make datoteke razlikuje razmake, one od tabulatora od onih od razmaknice. Tabulator se koristi onda kad se žele dodati naredbe pod određenu proceduru.
Struktura tada izgleda ovako:
MARKO1=naredba ili pokrata
procedura/meta: komponenta
Primjer
CC = gcc
CFLAGS = -g -O2
RM = rm
all: helloworld
helloworld: helloworld.o
# Naredbe pocinju s tabulatorom (TAB)
$(CC) $(CFLAGS) -o $@ $<
helloworld.o: helloworld.c
$(CC) $(CFLAGS) -c -o $@ $<
clean:
${RM} -f helloworld helloworld.o
Na početku, radi preglednosti, definiramo makro naredbe i pokrate kako ih ne bi morali ponavljati unutar samih procedura. U ovom primjeru to su redom:
- CC = gcc - specificira koji će se prevoditelj koristiti (gcc); može biti i drugi, npr. g++;
- CFLAGS = -g -O2 - argumenti koji će biti proslijeđeni prevoditelju;
- RM = rm - naredba za brisanje (dobro ju je definirati ovako izdvojenu jer se razlikuje od sustava do sustava).
Make tada ide do prve procedure all koja mu govori da mora imati (ažuriranu) datoteku helloworld, a kako je nema dalje traži proceduru/metu koja nosi to ime i dolazi do sljedeće procedure helloworld. U njoj se pak zahtjeva postojanje datoteke/objekta helloworld.o, a kako ga nema traži se ta procedura (odmah sljedeća). U proceduri helloworld.o se traži datoteka helloworld.c koja postoji u istom direktoriju (izvorna datoteka) te se izvodi sljedeća naredba u bloku:
$(CC) $(CFLAGS) -c -o $@ $<
gdje se makroi $(CC) i $(CFLAGS) mijenjaju s gcc, odnosno -g -O2, a $@ označava ime procedure, tj. mete, u ovom slučaju helloworld.o, a $< ime komponente te procedure, odnosno helloworld.c. Konkretno, nakon interpretacije, taj redak izgleda:
gcc -g -O2 -c -o helloworld.o helloworld.c
Make se tada vraća na prošlu proceduru helloworld iz koje je došao na ovu posljednju i izvršava daljnji blok naredbi koji stvara izvršnu datoteku helloworld i time je make završio jer nema dodatnih procedura koje bi se pozvale iz početne procedure all.
Ako korisnik pokrene naredbu
make clean
Poziva se procedura clean u kojoj se brišu izvršna i objektne datoteke.
Izvori i reference
- GNU-ov make
- Uvod u Fortran 90 (pdf) - predavanje iz kolegija Numeričke metode na PMF-FO; na kraju je prezentacije ukratko objašnjeno korištenje make-a