Lühike sissejuhatus makefailidesse avatud lähtekoodiga tarkvaraarenduses GNU Make abil


GNU Make on arendusutiliit, mis määrab konkreetse koodibaasi kompileeritavad osad ja võib anda käsklusi nende toimingute tegemiseks koodibaasis. Seda konkreetset utiliiti make saab kasutada mis tahes programmeerimiskeelega, tingimusel et nende kompileerimise saab teha shellist käske väljastades.

GNU Make kasutamiseks peab meil olema mingi reeglistik, mis määratleb meie programmi erinevate failide vahelised suhted ja käsud iga faili värskendamiseks. Need on kirjutatud spetsiaalsesse faili nimega ‘ makefile ’. Käsk ‘ make ’ kasutab andmebaasi ‘ makefile ’ ja failide viimaseid muutmisaegu, et otsustada, millised failid uuesti kompileerida.

Makefile'i sisu

Üldiselt sisaldavad ‘ makefiles ’ 5 liiki asju, nimelt kaudseid reegleid, selgesõnalisi reegleid, muutujadefineerimisi, direktiive ja kommentaare.

  1. selgesõnaline reegel määrab, kuidas ühte või mitut faili teha (ümber nimetada sihtmärkideks, selgitatakse hiljem) ja millal seda teha.
  2. kaudne reegel määrab, kuidas ühte või mitut faili nende nimede põhjal teha/ümber teha. See kirjeldab, kuidas sihtfaili nimi on seotud ühe failiga, mille nimi sarnaneb sihtmärgiga.
  3. muutuja määratlus on rida, mis määrab hiljem asendatava muutuja stringi väärtuse.
  4. direktiiv on käsk make teha faili lugemise ajal midagi erilist.
  5. Kasutatakse sümbolit "#", mis tähistab makefiles i sees oleva kommentaari algust. Rida, mis algab tähega #, lihtsalt eiratakse.

Teave, mis ütleb make , kuidas süsteemi uuesti kompileerida, pärineb andmebaasi makefile lugemisest. Lihtne makefile koosneb järgmise süntaksi reeglitest:

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

eesmärk on määratletud kui programmi genereeritud väljundfail. See võib olla ka võlts sihtmärgid , mida selgitatakse allpool. Sihtfailide näited hõlmavad käivitatavaid faile, objektifaile või võltsitud sihtmärke, näiteks puhas , install , desinstalli jne.

Eeltingimus on fail, mida kasutatakse sisendina sihtfailide loomiseks.

retsept on toiming, mille make täidab eeltingimuste põhjal sihtfaili loomiseks. Iga retsepti ette tuleb makefiles s panna tabulaatori märk, kui me ei määra muutuja ‘.RECIPEPREFIX’, et määratleda mõne muu tähemärgi retsepti eesliide.

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

Ülaltoodud näites kasutasime käivitatava final loomiseks 4 C lähtefaili ja kahte päisefaili. Siin on iga .o-fail nii sihtmärk kui ka eeltingimus makefile sees. Nüüd heitke pilk viimasele sihtnimele puhas . See on pigem toiming kui sihtfail.

Kuna me seda kompileerimise ajal tavaliselt ei vaja, ei ole see ühegi teise reegli eeltingimuseks kirjutatud. Sihte, mis ei viita failidele, vaid on lihtsalt toimingud, nimetatakse võltsmärkideks. Neil ei ole teiste sihtfailidena eeldusi.

Vaikimisi algab make makefile ’ esimese sihtmärgiga ja seda nimetatakse ‘ vaikesihiks ’. Arvestades meie näidet, on meie esimene sihtmärk lõplik . Kuna selle eeldused hõlmavad muid objektifaile, tuleb neid enne lõpliku loomist värskendada. Kõiki neid eeltingimusi töödeldakse vastavalt oma reeglitele.

Ümberkompileerimine toimub siis, kui lähtefaile või päisefaile on muudetud või kui objektifaili pole üldse olemas. Pärast vajalike objektifailide uuesti kompileerimist otsustab make , kas linkida uuesti lõplik või mitte. Seda tuleb teha, kui faili final pole olemas või kui mõni objektifailidest on uuem kui see.

Seega, kui muudame faili inter.c , siis make käivitamisel kompileerib see lähtefaili uuesti, et uuendada objektifaili inter.o ja seejärel linkige lõplik .

Meie näites pidime kõik objektifailid kaks korda final reeglisse loetlema, nagu allpool näidatud.

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

Selliste dubleerimiste vältimiseks võime kasutusele võtta muutujad makefile -is kasutatavate objektifailide loendi salvestamiseks. Muutuja OBJ abil saame valimi makefile ümber kirjutada sarnaseks allpool näidatuga.

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)

Nagu näites makefile nägime, saame määratleda lähtekataloogi puhastamise reeglid, eemaldades pärast kompileerimist soovimatud objektifailid. Oletame, et meil juhtub olema sihtfail nimega puhas . Kuidas saab panna eristada kahte ülaltoodud olukorda? Siit tuleb võltssihtide mõiste.

Võlts sihtmärk on see, mis tegelikult ei ole faili nimi, pigem on see lihtsalt retsepti nimi, mis tuleb käivitada alati, kui makefile -lt tehakse selgesõnaline taotlus. Üks peamine põhjus võltsmärgi kasutamiseks on vältida konflikti samanimelise failiga. Teine põhjus on jõudluse parandamine.

Selle asja selgitamiseks paljastan ühe ootamatu pöörde. puhas retsepti ei käivitata vaikimisi make käivitamisel. Selle asemel on vaja sama käivitada, väljastades käsu make clean .

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

Proovige nüüd oma koodibaasi jaoks luua makefiles . Kommenteerige julgelt siin oma kahtlustega.