Kratek uvod v datoteke Make Make pri odprtokodni programski opremi z GNU Make


GNU Make je razvojni pripomoček, ki določa dele določene osnove kode, ki jih je treba znova sestaviti, in lahko izda ukaze za izvajanje teh operacij na osnovi kode. To posebno pripomoček make lahko uporabite s katerim koli programskim jezikom, pod pogojem, da je njihovo sestavljanje mogoče narediti iz lupine z izdajanjem ukazov.

Za uporabo GNU Make moramo imeti nekaj pravil, ki opredeljujejo razmerje med različnimi datotekami v našem programu in ukaze za posodabljanje posamezne datoteke. Ti so zapisani v posebno datoteko, imenovano ‘ makefile ’. Ukaz ‘ make ‘ uporablja bazo podatkov ‘ makefile ‘ in zadnje čase spreminjanja datotek, da se odloči, katere datoteke bodo znova prevedene.

Vsebina datoteke Make

Na splošno ‘ makefiles ’ vsebuje 5 vrst stvari, in sicer: implicitna pravila, eksplicitna pravila, definicije spremenljivk, direktive in komentarje.

  1. Izrecno pravilo določa, kako narediti/predelati eno ali več datotek (imenovane cilji, bodo razloženi kasneje) in kdaj storiti enako.
  2. implicitno pravilo določa, kako narediti/predelati eno ali več datotek glede na njihova imena. Opisuje, kako je ime ciljne datoteke povezano z eno datoteko z imenom, podobnim ciljnemu.
  3. Definicija spremenljivke je vrstica, ki določa vrednost niza za spremenljivko, ki jo je treba nadomestiti pozneje.
  4. Direktiva je navodilo, da make med branjem datoteke make naredi nekaj posebnega.
  5. Uporabljen je simbol „#“, ki predstavlja začetek komentar znotraj datotek make . Vrstica, ki se začne z '#', se preprosto prezre.

Informacije, ki povejo make , kako prevesti sistem, prihajajo iz branja podatkovne baze, imenovane makefile . Preprosta makefile volja je sestavljena iz pravil naslednje sintakse:

target ... : prerequisites ... 
	recipe 
... 
...

Cilj je definiran kot izhodna datoteka, ki jo ustvari program. Lahko so tudi lažne tarče , kar bo razloženo spodaj. Primeri ciljnih datotek vključujejo izvršljive datoteke, objektne datoteke ali lažne cilje, kot so clean , install , uninstall itd.

Predpogoj je datoteka, ki se uporablja kot vhod za ustvarjanje ciljnih datotek.

Recept je dejanje, ki ga make izvede za ustvarjanje ciljne datoteke na podlagi predpogojev. Pred vsakim receptom je treba v make-datoteke postaviti znak za zavihek, razen če določimo spremenljivko ‘.RECIPEPREFIX’, da določimo kakšen drug znak kot predpono recepta.

final: main.o end.o inter.o start.o
	gcc -o final main.o end.o inter.o start.o
main.o: main.c global.h
	gcc -c main.c
end.o: end.c local.h global.h
	gcc -c end.c
inter.o: inter.c global.h
	gcc -c inter.c
start.o: start.c global.h
	gcc -c start.c
clean:
	rm -f main.o end.o inter.o start.o

V zgornjem primeru smo za izdelavo izvršljive final uporabili izvorne datoteke 4 C in dve datoteki glave. Tu je vsaka datoteka .o tako cilj kot predpogoj v datoteki make . Zdaj si oglejte priimek ciljnega cilja čist . To je samo dejanje in ne ciljna datoteka.

Ker tega med prevajanjem običajno ne potrebujemo, ni zapisano kot predpogoj v nobenih drugih pravilih. Cilji, ki se ne nanašajo na datoteke, ampak so samo dejanja, se imenujejo lažni cilji. Za druge ciljne datoteke ne bodo imeli predpogojev.

Privzeto se make začne s prvim ciljem v datoteki make in se pokliče kot ‘ privzeti cilj ’. Glede na naš primer imamo za prvo tarčo final . Ker njeni predpogoji vključujejo druge objektne datoteke, jih je treba posodobiti, preden ustvarite final . Vsak od teh predpogojev se obdeluje v skladu s svojimi pravili.

Ponovno prevajanje se zgodi, če pride do sprememb izvornih datotek ali datotek glave ali če predmetna datoteka sploh ne obstaja. Po ponovnem prevajanju potrebnih predmetnih datotek se make odloči, ali bo končno znova povezal ali ne. To je treba storiti, če datoteka final ne obstaja ali je katera od objektnih datotek novejša od nje.

Če torej spremenimo datoteko inter.c , bo ob zagonu make znova prevedel izvorno datoteko, da bo posodobil objektno datoteko inter.o in nato povezavo končno .

V našem primeru smo morali vse datoteke datotek dvakrat navesti v pravilu za končni , kot je prikazano spodaj.

final: main.o end.o inter.o start.o
	gcc -o final main.o end.o inter.o start.o

Da bi se izognili takim podvajanjem, lahko uvedemo spremenljivke za shranjevanje seznama predmetnih datotek, ki se uporabljajo v datoteki make . Z uporabo spremenljivke OBJ lahko vzorčni makefile prepišemo v podobnega, prikazanega spodaj.

OBJ = main.o end.o inter.o start.o
final: $(OBJ)
	gcc -o final $(OBJ)
main.o: main.c global.h
	gcc -c main.c
end.o: end.c local.h global.h
	gcc -c end.c
inter.o: inter.c global.h
	gcc -c inter.c
start.o: start.c global.h
	gcc -c start.c
clean:
	rm -f $(OBJ)

Kot smo videli v primeru makefile , lahko določimo pravila za čiščenje izvornega imenika tako, da odstranimo neželene predmetne datoteke po prevajanju. Recimo, da imamo slučajno ciljno datoteko z imenom čisto . Kako lahko naredim razlikovanje zgornjih dveh situacij? Tu prihaja koncept lažnih tarč.

Lažni cilj je tisti, ki v resnici ni ime datoteke, temveč je le ime za recept, ki se izvrši vsakič, ko je iz makefile podana izrecna zahteva. Eden glavnih razlogov za uporabo lažne tarče je izogibanje konfliktu z istoimensko datoteko. Drugi razlog je izboljšanje učinkovitosti.

Za razlago te stvari bom razkril en nepričakovan preobrat. Recepta za čiščenje pri zagonu make privzeto ne bo izveden. Namesto tega je treba istega priklicati z izdajo ukaza počisti .

.PHONY: clean
clean:
	rm -f $(OBJ)

Zdaj poskusite ustvariti datoteke datotek za svojo lastno kodno osnovo. Tukaj lahko komentirate s svojimi dvomi.