Razlika između inačica stranice Make

Izvor: HrOpenWiki
Skoči na: orijentacija, traži
m
m
 
Nije prikazano 14 međuinačica istog suradnika
Redak 1: Redak 1:
 
'''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.
 
'''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 koje se pozivaju odvojeno ili povezano, tako npr. je česta praksa da naredba
+
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
 
  make
prevodi izvorne datoteke u binarne/izvršne;
+
(bez argumenata) prevodi izvorne datoteke u binarne/izvršne;
 
  make install
 
  make install
 
premješta/kopira binarne datoteke po hijerarhiji sustava (za što su obično potrebne administratorske ovlasti);
 
premješta/kopira binarne datoteke po hijerarhiji sustava (za što su obično potrebne administratorske ovlasti);
Redak 9: Redak 9:
 
briše instalirane datoteke iz hijerarhije sustava;
 
briše instalirane datoteke iz hijerarhije sustava;
 
  make clean
 
  make clean
briše/čisti sve kompajlirane datoteke i ostavlja samo izvorne datoteke. Dakako, moguća su i odstupanja od ovih pravila, što korisnik lako može provjeriti pregledavanjem make datoteke.
+
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==
 
==Pisanje make datoteke==
  
Treba razumjeti da je jezik, odnosno sintaksa u kojoj je pisana make datoteka slična onima u deklarativnom programiranju gdje nema "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).
+
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:
 +
<source lang=make>
 +
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
 +
...
 +
</source>
 +
 
 +
===Primjer===
 +
<source lang=make>
 +
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
 +
</source>
 +
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==
 
==Izvori i reference==
 
* [http://www.gnu.org/software/make/ GNU-ov make]
 
* [http://www.gnu.org/software/make/ GNU-ov make]
 +
* [http://grdelin.phy.hr/~ivo/Nastava/Numericke_methode/predavanja/01_pred.pdf Uvod u Fortran 90 (pdf)] - predavanje iz kolegija Numeričke metode na [http://www.phy.hr PMF-FO]; na kraju je prezentacije ukratko objašnjeno korištenje make-a
 +
* [http://www.cs.umd.edu/class/spring2002/cmsc214/Tutorial/makefile.html vodič za pisanje make datoteke @cs.umd.edu]
 +
 +
[[Kategorija:Programiranje]]

Trenutačna izmjena od 00:19, 1. lipnja 2011.

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