GNU Make je orodje, ki pomaga ustvarjati izvedljive programe iz izvorne kode in obdelovati tudi druge nevirske datoteke iz projekta. Make dobi logiko gradnje izvedljivih datotek in obdelave drugih nevirskih datotek iz datoteke, imenovane makefile ali a Makefile.
Zakaj narediti?
-
Make je dejansko orodje za gradnjo izvedljivih programov iz izvorne kode v svetu odprte kode.
-
Make končnim uporabnikom omogoča izdelavo izvedljivih programov, ne da bi vedeli tehnične podrobnosti o njihovi izdelavi.
-
Vse podrobnosti o tem, kako zgraditi izvedljive datoteke in obdelati nevirske datoteke, so navedene v datoteki make - tako postane postopek ponovljiv vsem ljudem ali sistemom, ki poskušajo zgraditi projekt.
-
Če je kodna baza zelo velika, je zamudno in problematično ustvariti izvršljivo datoteko iz nič, kadar je sprememba izvorne kode zelo majhna. Make poskrbi za to. Sledi spremembam datotek in temu primerno razrešuje odvisnost, da lahko znova zgradi določen del programa.
-
Make je agnostičen programski jezik. Vseeno je, kateri programski jezik ali katero narečje med njimi uporabljate. Makefile je besedilna datoteka ukazov ukazne lupine, strukturirano organizirana z odvisnostjo in drugo logiko za gradnjo programa in upravljanje drugih nevirskih datotek. Ker gre za kup ukazov lupine, se lahko izvaja kjerkoli teče ukaz lupine. Windows privzeto ne izvaja ukazov lupine linux, lahko pa to storite s posebno različico tega za Windows.
-
Med gradnjo izvedljivih programov se ustvari veliko vmesnih datotek, ki jih po končani gradnji ni treba. Izbriši te datoteke samodejno. Pomaga ohranjati okolje čisto in prihrani veliko dragocenega časa.
Nameščanje znamke
Za izdelavo programov samo narediti ni dovolj. Za izdelavo programov iz vira morate imeti v sistemu nameščene prevajalnike in druga orodja. Torej za svoj namen potrebujemo celoten nabor razvojnih orodij.
Za zbiranje virov v Linuxu obstaja sistem, imenovan "build-bistven" za sisteme, ki temeljijo na Debianu (npr.g. Ubuntu, Linux Mint itd.) In "Orodja za razvoj" na Red Hat in CentOS.
To namestite v sisteme, ki temeljijo na Debianu:
apt-get install build-bistvenega pomena
Če želite to namestiti na CentOS in Red Hat, zaženite:
yum groupinstall "Orodja za razvoj"
Uvod v Makefile
Začnimo s pisanjem a Pozdravljen, svet program s programskim jezikom C.
Glavna funkcija našega programa C bo v notranjosti hellomain.c. Vsebina datoteke mora biti videti tako:
#includeint main () my_fun (); vrnitev 0;
Ta koda vključuje glavo datoteke hellofun.h, ki vsebuje izjavo funkcije, imenovane hello_fun (). Vsebina hellofuna.h je:
void my_fun ();
Definicija my_fun () živi znotraj hellofun.c:
#include#include void my_fun () printf ("Pozdravljeni, svet!\ n "); vrni;
To je zelo preprost program, ki bi ga lahko zbrali v gcc z eno samo vrstico ukaza. Toda programi v resničnem življenju niso tako preprosti in tako majhni. Stvari se zares kmalu zapletejo. Spodaj bom napisal potreben skript makefile za sestavljanje tega programa hello world. V naslednjih poglavjih bom razložil različne njegove dele.
hellomain: hellomain.c zdravo.c gcc -o zdravo hellomain.c hellomain.c -I.
To kodo shranite v datoteki, imenovani makefile (brez pripone datoteke). Datoteko shranite v imenik, kjer so datoteke C. Usmerite svojo ukazno vrstico v ta imenik. V ukazno vrstico napišite znamko in pritisnite enter. Izvedljiva datoteka, imenovana hello, bo ustvarjena v trenutnem imeniku. Rezultat lahko preverite z zagonom izvedljive datoteke z naslednjim ukazom.
./zdravo
Izhodi:
Pozdravljen, svet!
Pravila, cilji in odvisnosti
Skript makefile je zbirka pravil. Pravila navajajo, kako zgraditi cilj ali izhod iz izvornih ali drugih datotek. Pravilo določa tudi odvisnosti cilja. Pravila odvisnosti je treba najprej izvesti, odvisno od tega, ali je to že obdelano s pogledom na časovne žige. V našem primeru makefile zgoraj imamo pravilo z imenovanim ciljem hellomain in njegove odvisnosti. Ciljno ime je s seznama odvisnosti ločeno z dvopičjem. Ukazi lupine, ki se bodo izvajali, so navedeni v naslednji vrstici. Ukazi lupine se morajo začeti z znakom zavihka.
Če z ukazom make ne določite nobenega parametra, se izvede prvi cilj. V našem primeru nismo podali nobenega parametra in smo ga imeli hellomain kot prvi in edini cilj.
Spremenljivke
Spremenljivke so odličen način, kako enkrat zapisati vrednost in jo večkrat uporabiti, ne da bi jo vedno znova ponavljali. Pomaga nam obdržati kodo SUHO (Ne ponavljajte se). Če boste kdaj morali spremeniti neko vrednost po celotnem skriptu, jo morate spremeniti na enem mestu, da bo povsod odražala spremembo, če uporabljate spremenljivko.
V našem primeru smo uporabili gcc kot prevajalnik, vendar bomo morda morali prevajalnik spremeniti v nekaj drugega. Torej, lahko ime prevajalnika shranimo v spremenljivko. Zastave prevajalnika lahko obdržimo tudi v drugi spremenljivki, da to ponovno uporabimo. Za nastavitev vrednosti na spremenljivko uporabimo znak enakosti (=), za branje spremenljivke pa $ (ime_premenljivke).
CC = gcc CFLAGS = -I. hellomain: hellomain.c zdravo.c $ (CC) -o zdravo hellomain.c hellomain.c $ (CFLAGS)
Čiščenje okolja
Pogosto bomo morali očistiti svoje okolje. Če želimo, da se vsak del našega projekta obnovi iz nič, ga moramo očistiti. V našem preprostem primeru je ustvarjena edina datoteka zdravo izvršljiv. Ne da bi to ročno izbrisali, lahko to zbrišemo z make. Torej, lahko ustvarimo pravilo za to in cilj poimenujemo kot čisto.
CC = gcc CFLAGS = -I. hellomain: hellomain.c zdravo.c $ (CC) -o zdravo hellomain.c hellomain.c $ (CFLAGS) čisto: rm zdravo
Ukaz lupine v čistem cilju je samo starostni ukaz lupine rm. Zdaj iz ukazne vrstice izvršite:
naredi čisto
Oglejte si trenutni imenik, da vidite, ali je zdravo izvršljiva datoteka je izginila.
Širitev našega primera za reševanje več težav
V našem preprostem primeru kompilacije hello world imamo težavo, ki je še nismo rešili. hellomain tarča gleda zdravo.c in zdravo.c časovni žig datotek, ko ga naslednjič poskusite znova sestaviti naredite ali naredite hellomain. Torej, če spremenite katero koli od teh dveh datotek, bosta znova sestavljeni. Ampak, če se spremeniš zdravo.h potem se ne bo prevedel. To je nepričakovano!
Spet smo preskočili vmesno stopnjo. Predmetnih datotek nismo ustvarili in neposredno izvedljivo. Toda za prizorom se datoteke datotek ustvarijo v začasnem imeniku in izbrišejo. Pred gradnjo izvršljive datoteke želimo ustvariti objektne datoteke. Tokrat glavni cilj imenujemo vse
vsi: 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
Znova zaženite ukaz make, da preverite, ali vaš program uspešno gradi ali ne. Zaženite zdravo izvršljivo datoteko, da preverite rezultat. Oglejte si trenutni imenik in videli boste, da so ustvarjene datoteke predmetov. Čistemu cilju smo dodali še eno vrstico za čiščenje predmetnih datotek. Ta skript makefile bo pomagal znova sestaviti program hello world, tudi če zdravo.h datoteka je spremenjena.
Zaključek
Make je eno najpomembnejših orodij za uporabnike in programerje linux. Če ste končni uporabnik, vam bo znanje znamke pomagalo popraviti marsikaj pokvarjenega v vašem svetu linuxa. Če ste programer, preprosto ne morete oditi tako, da napišete kodo in pustite uporabnikom, da ugotovijo, kako to izvorno kodo prevesti v izvršljive datoteke. Ustvariti morate skript makefile za končne uporabnike, da ne bodo igrali igre ugibanj za prevajanje vašega vira v izvršljive datoteke.
Reference
Domača stran projekta GNUMake
GNU Naredi dokumentacijo