Utangulizi Mufupi wa Makefiles katika Ukuzaji wa Programu huria na GNU Make


GNU Make ni shirika la usanidi ambalo huamua sehemu za msingi mahususi wa msimbo ambazo zinapaswa kukusanywa tena na inaweza kutoa amri za kufanya shughuli hizo kwenye msingi wa msimbo. Huduma hii mahususi ya make inaweza kutumika kwa lugha yoyote ya programu mradi tu ukusanyaji wao unaweza kufanywa kutoka kwa ganda kwa kutoa amri.

Ili kutumia GNU Make, tunahitaji kuwa na baadhi ya sheria zinazofafanua uhusiano kati ya faili tofauti katika programu yetu na amri za kusasisha kila faili. Hizi zimeandikwa kwenye faili maalum inayoitwa ‘makefile’. Amri ya ‘tengeneza’ hutumia msingi wa data wa ‘makefile’ na nyakati za mwisho za urekebishaji wa faili ili kuamua ni faili zipi zitakusanywa tena.

Yaliyomo kwenye Makefile

Kwa ujumla ‘makefiles’ huwa na aina 5 za vitu ambavyo ni: sheria zisizo wazi, sheria zilizo wazi, ufafanuzi tofauti, maagizo na maoni.

  1. Sheria iliyo wazi hubainisha jinsi ya kutengeneza/kutengeneza upya faili moja au zaidi (zinazoitwa shabaha, zitaelezwa baadaye) na wakati wa kufanya vivyo hivyo.
  2. Sheria iliyofichwa hubainisha jinsi ya kutengeneza/kutengeneza faili moja au zaidi kulingana na majina yao. Inafafanua jinsi jina la faili linalolengwa linavyohusiana na faili moja yenye jina sawa na lengwa.
  3. A ufafanuzi wa kigeugeu ni mstari unaobainisha thamani ya mfuatano wa kigezo ambacho kitabadilishwa baadaye.
  4. A maelekezo ni maagizo ya kufanya kufanya kitu maalum wakati wa kusoma faili.
  5. Alama ya ‘#’ inatumika kuwakilisha mwanzo wa maoni ndani ya makefiles. Mstari unaoanza na ‘#’ umepuuzwa kwa urahisi.

Taarifa inayoambia make jinsi ya kuunda upya mfumo hutoka kwa kusoma msingi wa data unaoitwa makefile. makefile rahisi itajumuisha sheria za sintaksia ifuatayo:

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

lengo inafafanuliwa kuwa faili ya towe inayotolewa na programu. Inaweza pia kuwa lengo la udanganyifu, ambalo litafafanuliwa hapa chini. Mifano ya faili zinazolengwa ni pamoja na zinazoweza kutekelezwa, faili za vipengee au lengwa ghushi kama vile safisha, sakinisha, kuondoa n.k.

sharti ni faili ambayo hutumiwa kama ingizo kuunda faili lengwa.

mapishi ni kitendo ambacho tengeneza hufanya kwa kuunda faili inayolengwa kulingana na sharti. Ni muhimu kuweka herufi ya kichupo kabla ya kila kichocheo ndani ya makefiles isipokuwa tubainishe kigezo cha ‘.RECIPEPREFIX‘ ili kufafanua baadhi ya herufi nyingine kama kiambishi awali cha mapishi.

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

Katika mfano ulio hapo juu tulitumia faili 4 za chanzo na faili mbili za vichwa kwa kuunda mwisho inayoweza kutekelezeka. Hapa kila faili ya ‘.o’ ni lengwa na sharti ndani ya makefile. Sasa angalia jina lengwa la mwisho safisha. Ni kitendo tu badala ya faili inayolengwa.

Kwa kuwa kwa kawaida hatuhitaji hii wakati wa ujumuishaji, haijaandikwa kama sharti katika sheria zingine zozote. Malengo ambayo hayarejelei faili lakini ni vitendo tu huitwa shabaha za udanganyifu. Hazitakuwa na sharti zozote kama faili zingine zinazolengwa.

Kwa chaguo-msingi make huanza na shabaha ya kwanza katika ‘makefile’ na inaitwa ‘lengo chaguo-msingi’. Kwa kuzingatia mfano wetu, tuna mwisho kama shabaha yetu ya kwanza. Kwa kuwa sharti lake ni pamoja na faili zingine za vipengee, hizo zinapaswa kusasishwa kabla ya kuunda mwisho. Kila moja ya mahitaji haya yanashughulikiwa kulingana na sheria zao wenyewe.

Recompilation hutokea ikiwa kuna marekebisho yaliyofanywa kwa faili chanzo au faili za kichwa au ikiwa faili ya kitu haipo kabisa. Baada ya kurejesha faili zinazohitajika za vipengee, make huamua kama itaunganisha tena mwishoau la. Hili lazima lifanyike ikiwa faili mwisho haipo, au ikiwa faili zozote za vipengee ni mpya zaidi yake.

Kwa hivyo ikiwa tutabadilisha faili inter.c, basi kwenye kuendesha make itakusanya faili chanzo kusasisha faili ya kitu inter.o na kisha unganisha mwisho.

Katika mfano wetu, ilitubidi kuorodhesha faili zote za kitu mara mbili katika sheria ya mwisho kama inavyoonyeshwa hapa chini.

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

Ili kuzuia urudufishaji kama huo, tunaweza kuanzisha vigeu ili kuhifadhi orodha ya faili za vipengee zinazotumika ndani ya makefile. Kwa kutumia OBJ tofauti tunaweza kuandika upya sampuli ya makefile hadi sawa na iliyoonyeshwa hapa chini.

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)

Kama tulivyoona katika mfano makefile, tunaweza kufafanua sheria za kusafisha saraka ya chanzo kwa kuondoa faili zisizohitajika baada ya mkusanyiko. Tuseme tutakuwa na faili inayolengwa inayoitwa safi. Jinsi gani kufanya kutofautisha hali mbili zilizo hapo juu? Hapa inakuja dhana ya malengo ya udanganyifu.

Lengo la uwongo ni lile ambalo si jina la faili, bali ni jina tu la mapishi ya kutekelezwa wakati wowote ombi la wazi linapotolewa kutoka kwa makefile. Sababu moja kuu ya kutumia shabaha ya udanganyifu ni kuzuia mzozo na faili ya jina moja. Sababu nyingine ni kuboresha utendaji.

Ili kuelezea jambo hili, nitafunua twist moja isiyotarajiwa. Kichocheo cha safisha hakitatekelezwa kwa chaguo-msingi kwenye kuendesha make. Badala yake ni muhimu kuomba sawa kwa kutoa amri make clean.

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

Sasa jaribu kuunda makefiles kwa msingi wako wa msimbo. Jisikie huru kutoa maoni hapa na mashaka yako.