GNU Make je alat koji pomaže u generiranju izvršnih programa iz izvornog koda, a također obrađuje i druge izvorne datoteke iz projekta. Make dobiva logiku izgradnje izvršnih datoteka i obrade ostalih datoteka koje nisu izvorne iz datoteke koja se naziva makefile ili a Makefile.
Zašto napraviti?
-
Make je de facto alat za izgradnju izvršnih programa iz izvornog koda u svijetu otvorenog koda.
-
Make krajnjim korisnicima omogućuje izgradnju izvršnih programa bez poznavanja tehničkih detalja o njihovoj izradi.
-
Svi detalji o tome kako graditi izvršne datoteke i obrađivati izvorne datoteke navedeni su u datoteci make - tako da postupak postaje ponovljiv od strane svih ljudi ili sustava koji pokušavaju izgraditi projekt.
-
Ako je baza podataka vrlo velika, onda je dugotrajno i problematično izgraditi izvršnu datoteku ispočetka kada je promjena u izvornom kodu vrlo mala. Make se brine za to. Prati koje se datoteke mijenjaju i u skladu s tim rješava ovisnost za izgradnju ponovne izgradnje određenog dijela programa.
-
Make je agnostički programski jezik. Svejedno je koji programski jezik ili koji od njihovih dijalekata koristite. Makefile je tekstualna datoteka naredbi ljuske strukturirano strukturirana s ovisnošću i drugom logikom za izgradnju programa i upravljanje drugim izvornim datotekama. Kako se radi o gomili naredbi ljuske, može se izvoditi bilo gdje naredbe ljuske. Windows prema zadanim postavkama ne izvodi naredbe linux ljuske, ali to možete učiniti pomoću njegove specijalizirane verzije za Windows.
-
Tijekom gradnje izvršnih programa stvara se mnogo posrednih datoteka koje ne moraju biti tamo kad zgrada završi. Omogući automatsko brisanje tih datoteka. Pomaže u održavanju okoliša čistim i štedi puno dragocjenog vremena.
Instaliranje Make
Samo stvaranje nije dovoljno za izgradnju programa. Da biste izgradili programe iz izvora, na vašem sustavu trebaju biti instalirani kompajleri i drugi alati. Dakle, potreban nam je čitav niz razvojnih alata za našu svrhu.
Za kompajliranje izvora na Linuxu postoji paket koji se naziva "bitan za izgradnju" na sustavima temeljenim na Debianu (npr.g. Ubuntu, Linux Mint, itd.) I "Alati za razvoj" na Red Hat-u i CentOS-u.
Da biste ovo instalirali na sustave temeljene na Debianu:
apt-get install build-bitno
Da biste ovo instalirali na CentOS i Red Hat trčanje:
yum groupinstall "Alati za razvoj"
Početak rada s Makefileom
Krenimo s pisanjem a Pozdrav svijete program s programskim jezikom C.
Glavna funkcija našeg C programa nalazit će se unutra hellomain.c. Sadržaj datoteke trebao bi izgledati ovako:
#includeint main () moja_zabava (); return 0;
Ovaj kod uključuje datoteku zaglavlja hellofun.h koja sadrži deklaraciju funkcije koja se naziva hello_fun (). Sadržaj hellofuna.h je:
void my_fun ();
Definicija my_fun () živi unutar hellofuna.c:
#include#include void my_fun () printf ("Pozdrav svijetu!\ n "); povratak;
Ovo je vrlo jednostavan program i mogli bismo ga kompilirati s gcc-om sa samo jednim retkom naredbe. Ali programi iz stvarnog života nisu tako jednostavni i tako mali kao ovaj. Stvari se vrlo brzo zakompliciraju. U nastavku ću napisati potrebnu skriptu makefile za sastavljanje ovog programa hello world. Objasnit ću njegove različite dijelove u sljedećim odjeljcima.
hellomain: hellomain.c zdravo.c gcc -o zdravo hellomain.c hellomain.c -I.
Čuvajte ovaj kod u datoteci koja se naziva makefile (bez ikakvog nastavka datoteke). Stavite datoteku u direktorij u kojem su datoteke C. Usmjerite naredbeni redak u ovaj direktorij. U naredbeni redak napišite make i pritisnite enter. Izvršna datoteka nazvana hello generirat će se u trenutnom direktoriju. Rezultat možete provjeriti pokretanjem izvršne datoteke pomoću sljedeće naredbe.
./zdravo
Izlazi:
Pozdrav svijete!
Pravila, ciljevi i ovisnosti
Makefile skripta je zbirka pravila. Pravila upućuju Napravite kako izgraditi cilj ili izlaz iz izvora ili drugih datoteka. Pravilo također određuje ovisnosti cilja. Pravila ovisnosti moraju se prvo izvršiti, ovisno o tome je li to već obrađeno gledajući vremenske oznake. U našem primjeru makefile gore, imamo pravilo s imenovanim ciljem hellomain i njegove ovisnosti. Ime cilja odvojeno je dvotočkom sa popisa ovisnosti. Naredbe ljuske koje će se izvršiti navedene su u sljedećem retku. Naredbe ljuske moraju započinjati znakom kartice.
Ako naredbom make ne navedete parametar, izvršava se prva meta. U našem primjeru nismo naveli nijedan parametar, a jesmo hellomain kao prva i jedina meta.
Varijable
Varijable su sjajan način da se vrijednost jednom napiše i koristi više puta bez ponavljanja vrijednosti iznova i iznova. Pomaže nam da naš kod ostane suh (nemojte se ponavljati). Ako ikada trebate promijeniti neku vrijednost u cijeloj skripti, samo je trebate promijeniti na jednom mjestu kako bi odrazila promjenu svugdje ako koristite varijablu.
U našem primjeru smo koristili gcc kao kompajler, ali možda ćemo morati promijeniti kompajler u nešto drugo. Dakle, ime kompajlera možemo zadržati u varijabli. Također, zastave kompajlera možemo zadržati u nekoj drugoj varijabli da bi se to ponovno koristilo. Za postavljanje vrijednosti na varijablu koristimo znak jednakosti (=), a za čitanje te varijable koristimo $ (ime_ varijable).
CC = gcc CFLAGS = -I. hellomain: hellomain.c zdravo.c $ (CC) -o zdravo hellomain.c hellomain.c $ (CFLAGS)
Čišćenje okoliša
Često ćemo možda morati očistiti svoj okoliš. Ako želimo da se svaki dio našeg projekta obnovi ispočetka, moramo ga očistiti. U našem jednostavnom primjeru jedina datoteka koja se generira je zdravo izvršna. Bez ručnog brisanja, to možemo izbrisati pomoću make. Dakle, možemo stvoriti pravilo za to i cilj imenovati kao čist.
CC = gcc CFLAGS = -I. hellomain: hellomain.c zdravo.c $ (CC) -o zdravo hellomain.c hellomain.c $ (CFLAGS) čisto: rm pozdrav
Naredba ljuske u čistom cilju samo je prastara naredba ljuske rm. Sada iz naredbenog retka izvršite:
učiniti čistim
Pogledajte trenutni direktorij da vidite da li zdravo izvršna datoteka je nestala.
Proširivanje našeg primjera radi rješavanja više problema
U našem jednostavnom primjeru kompilacije hello world imamo problem koji još nismo riješili. hellomain meta gleda pozdravni.c i zdravo.c vremenske oznake datoteka sljedeći put kada je pokušate ponovno sastaviti napraviti ili napraviti hellomain. Dakle, ako promijenite bilo koju od te dvije datoteke, one će se ponovno sastaviti. Ali, ako se promijenite zdravo.h tada se neće ponovno sastaviti. To je neočekivano!
Opet smo preskočili srednju razinu. Nismo generirali objektne datoteke i izravno smo generirali izvršnu datoteku. Ali, iza scene, datoteke objekata kreiraju se u privremenom direktoriju i brišu. Želimo generirati objektne datoteke prije izgradnje izvršne datoteke. Ovaj put glavnu metu imenujemo kao svi
svi: hellomain.o zdravo.o gcc hellomain.o zdravo.o -o zdravo hellomain.o: hellomain.c zdravo.h gcc -I. -c hellomain.c zdravo.o: zdravo.c zdravo.h gcc -I. -c zdravo.c čisto: rm -rf *.o rm zdravo
Ponovno pokrenite naredbu make da biste provjerili gradi li vaš program uspješno ili ne. Pokrenite hello izvršnu datoteku da biste provjerili rezultat. Pogledajte trenutni direktorij i vidjet ćete da su stvorene datoteke objekata. Čistom cilju dodali smo još jedan redak za čišćenje objektnih datoteka. Ova skripta makefile pomoći će u ponovnom sastavljanju programa hello world čak i ako zdravo.h datoteka je izmijenjena.
Zaključak
Make je jedan od najvažnijih alata za korisnike Linuxa i programere. Ako ste krajnji korisnik, znanje o makeu pomoći će vam popraviti mnoge slomljene stvari u vašem svijetu linuxa. Ako ste programer, jednostavno ne možete otići tako da napišete kôd i pustiti korisnike da shvate kako kompajlirati taj izvorni kod u izvršne datoteke. Morate stvoriti skriptu makefile za krajnje korisnike, tako da oni ne igraju neku igru pogađanja kako bi kompilirali vaš izvor u izvršne datoteke.
Reference
Početna stranica projekta GNUMake
GNU Napravite dokumentaciju