Make

Izvor: HrOpenWiki
Skoči na: orijentacija, traži

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 i sintaksa tada izgleda ovako:

MARKO1=neka naredba ili pokrata
MARKO2=neka naredba ili pokrata
MARKO3=neka naredba ili pokrata
...
all: procedura1
procedura1: komponenta2 komponenta3
            blok naredbi
procedura2: komponenta4
            blok naredbi
procedura3: komponenta5
            blok naredbi
...

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