Stutt kynning á Makefiles í opnum hugbúnaðarþróun með GNU Make


GNU Make er þróunarforrit sem ákvarðar hluta tiltekins kóðagrunns sem á að setja saman aftur og getur gefið út skipanir til að framkvæma þessar aðgerðir á kóðagrunninum. Þetta tiltekna make tól er hægt að nota með hvaða forritunarmáli sem er að því tilskildu að hægt sé að gera samantekt þeirra úr skelinni með því að gefa út skipanir.

Til þess að nota GNU Make þurfum við að hafa sett af reglum sem skilgreina tengslin milli mismunandi skráa í forritinu okkar og skipanir til að uppfæra hverja skrá. Þetta er skrifað á sérstaka skrá sem kallast 'makefile'. 'make' skipunin notar 'makefile' gagnagrunninn og síðustu breytingartíma skránna til að ákveða hvaða allar skrár á að endursafna aftur.

Innihald Makefile

Almennt innihalda 'makefiles' 5 tegundir af hlutum, nefnilega: óbeinum reglum, skýrum reglum, breytilegum skilgreiningum, tilskipunum og athugasemdum.

  1. skýr regla tilgreinir hvernig eigi að búa til/endurgera eina eða fleiri skrár (kallaðar markmið, verður útskýrt síðar) og hvenær eigi að gera slíkt hið sama.
  2. óbein regla tilgreinir hvernig eigi að búa til/endurgera eina eða fleiri skrár út frá nöfnum þeirra. Það lýsir því hvernig markskráarheiti er tengt einni skrá með nafni sem er svipað og markið.
  3. breytuskilgreining er lína sem tilgreinir strengsgildi fyrir breytu sem á að skipta út síðar.
  4. tilskipun er leiðbeining fyrir make að gera eitthvað sérstakt á meðan make-skráin er lesin.
  5. Táknið „#“ er notað táknar upphaf athugasemda inni í make-skrám. Lína sem byrjar á „#“ er einfaldlega hunsuð.

Upplýsingarnar sem segja make hvernig eigi að endursafna kerfi koma frá lestri gagnagrunns sem kallast makefile. Einföld makefile mun samanstanda af reglum með eftirfarandi setningafræði:

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

mark er skilgreint sem úttaksskráin sem forritið býr til. Það geta líka verið fölsk skotmörk, sem verður útskýrt hér að neðan. Dæmi um markskrár eru keyrslur, hlutaskrár eða svikin markmið eins og hreint, setja upp, fjarlægja osfrv.

forsenda er skrá sem er notuð sem inntak til að búa til markskrárnar.

uppskrift er aðgerðin sem ger framkvæmir til að búa til markskrána út frá forsendum. Nauðsynlegt er að setja tab staf á undan hverri uppskrift inni í makefiles nema við tilgreinum ‘.RECIPEPREFIX‘ breytuna til að skilgreina einhvern annan staf sem forskeyti við uppskrift.

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

Í dæminu hér að ofan notuðum við 4 C frumskrár og tvær hausskrár til að búa til keyrsluna final. Hér er hver ‘.o’ skrá bæði markmið og forsenda inni í makefile. Líttu nú á síðasta marknafnið hreint. Það er bara aðgerð frekar en markskrá.

Þar sem við þurfum þetta venjulega ekki meðan á samantekt stendur er það ekki skrifað sem forsenda í neinum öðrum reglum. Markmið sem vísa ekki til skráa heldur eru bara aðgerðir eru kölluð fölsk skotmörk. Þeir munu ekki hafa neinar forsendur eins og aðrar markskrár.

Sjálfgefið er að make byrjar á fyrsta markinu í 'makefile' og er kallað 'sjálfgefið markmið'. Miðað við dæmið okkar höfum við endanlegt sem fyrsta markmið okkar. Þar sem forsendur þess innihalda aðrar hlutaskrár á að uppfæra þær áður en endanlegt er búið til. Hver þessara forsendna er unnin samkvæmt eigin reglum.

Endursamsetning á sér stað ef breytingar eru gerðar á frumskrám eða hausskrám eða ef hlutskráin er alls ekki til. Eftir að hafa endursamlað nauðsynlegar hlutaskrár, ákveður make hvort endurtengja eigi endanlegt eða ekki. Þetta verður að gera ef skráin endanlegt er ekki til, eða ef einhver af hlutaskránum er nýrri en hún.

Þannig að ef við breytum skránni inter.c, þegar make er keyrt mun hún endursafna frumskránni til að uppfæra hlutskrána inter.o og síðan skaltu tengja final.

Í dæminu okkar þurftum við að skrá allar hlutaskrárnar tvisvar í reglunni fyrir endanlegt eins og sýnt er hér að neðan.

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

Til að koma í veg fyrir slíkar tvítekningar getum við kynnt breytur til að geyma lista yfir hlutskrár sem verið er að nota í makefile. Með því að nota breytuna OBJ getum við endurskrifað sýnishornið makefile í svipaða sem sést hér að neðan.

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)

Eins og við sáum í dæminu makefile getum við skilgreint reglur til að hreinsa upp upprunaskrána með því að fjarlægja óæskilegar hlutaskrár eftir söfnunina. Segjum sem svo að við séum með markskrá sem heitir clean. Hvernig er hægt að gera greinarmun á ofangreindum tveimur aðstæðum? Hér kemur hugmyndin um svikin skotmörk.

Falsað skotmark er það sem er í raun ekki nafn skráar, frekar er það bara nafn á uppskrift sem á að framkvæma þegar bein beiðni er gerð úr makefile. Ein aðalástæðan fyrir því að nota falsað mið er að forðast átök við skrá með sama nafni. Önnur ástæða er að bæta árangur.

Til að útskýra þetta mun ég sýna eina óvænta snúning. Uppskriftin að clean verður ekki keyrð sjálfgefið þegar make er keyrt. Þess í stað er nauðsynlegt að kalla fram það sama með því að gefa út skipunina make clean.

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

Reyndu nú að búa til makefiles fyrir þinn eigin kóðagrunn. Ekki hika við að kommenta hér með efasemdir þínar.