Introduzzjoni qasira għall-Makefiles fl-Iżvilupp tas-Software ta' Sorsi Miftuħ b'GNU Make


GNU Make hija utilità ta 'żvilupp li tiddetermina l-partijiet ta' bażi ta 'kodiċi partikolari li għandhom jiġu kkompilati mill-ġdid u tista' toħroġ kmandi biex twettaq dawk l-operazzjonijiet fuq il-bażi ta 'kodiċi. Din l-utilità partikolari ta’ make tista’ tintuża bi kwalunkwe lingwa ta’ programmar sakemm il-kumpilazzjoni tagħhom tkun tista’ ssir mill-qoxra billi jinħarġu kmandi.

Sabiex nużaw GNU Make, jeħtieġ li jkollna xi sett ta 'regoli li jiddefinixxu r-relazzjoni bejn fajls differenti fil-programm tagħna u kmandi għall-aġġornament ta' kull fajl. Dawn jinkitbu fuq fajl speċjali msejjaħ ‘makefile‘. Il-kmand ‘make’ juża d-database ‘makefile’ u l-aħħar ħinijiet ta’ modifika tal-fajls biex jiddeċiedi liema fajls kollha għandhom jerġgħu jiġu kkompilati mill-ġdid.

Kontenut ta' Makefile

Ġeneralment 'makefiles' fihom 5 tipi ta' affarijiet jiġifieri: regoli impliċiti, regoli espliċiti, definizzjonijiet varjabbli, direttivi, u kummenti.

  1. regola espliċita tispeċifika kif tagħmel/jagħmel mill-ġdid fajl wieħed jew aktar (imsejħa miri, se jiġu spjegati aktar tard) u meta tagħmel l-istess.
  2. regola impliċita tispeċifika kif tagħmel/jagħmel mill-ġdid fajl wieħed jew aktar ibbażati fuq isimhom. Jiddeskrivi kif isem ta' fajl fil-mira huwa relatat ma' fajl wieħed b'isem simili għall-mira.
  3. Definizzjoni ta' varjabbli hija linja li tispeċifika valur ta' string għal varjabbli li għandha tiġi sostitwita aktar tard.
  4. Direttiva hija struzzjoni biex tagħmel biex tagħmel xi ħaġa speċjali waqt li taqra l-makefile.
  5. Simbolu ‘#’ jintuża jirrappreżenta l-bidu ta’ kumment ġewwa makefiles. Linja li tibda b''#' hija sempliċement injorata.

L-informazzjoni li tgħid lil make kif terġa’ tikkompila sistema tiġi mill-qari ta’ bażi tad-dejta msejħa l-makefile. makefile sempliċi se jikkonsisti f'regoli tas-sintassi li ġejja:

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

A mira hija definita bħala l-fajl tal-output iġġenerat mill-programm. Jista 'jkun ukoll miri foniċi, li se jiġu spjegati hawn taħt. Eżempji ta' fajls ta' mira jinkludu eżekutibbli, fajls ta' oġġetti jew miri falzi bħal naddaf, installa, uninstall eċċ.

prerekwiżithuwa fajl li jintuża bħala input biex jinħolqu l-fajls fil-mira.

A riċetta hija l-azzjoni li tagħmeltwettaq għall-ħolqien tal-fajl fil-mira bbażata fuq il-prerekwiżiti. Huwa meħtieġ li jitqiegħed karattru tab qabel kull riċetta ġewwa l-makefiles sakemm ma nispeċifikawx il-varjabbli ‘.RECIPEPREFIX’ biex niddefinixxu xi karattru ieħor bħala prefiss għar-riċetta.

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

Fl-eżempju ta 'hawn fuq użajna fajls sors 4 C u żewġ fajls header għall-ħolqien tal-finali eżekutibbli. Hawnhekk kull fajl ‘.o’ huwa kemm mira kif ukoll prerekwiżit ġewwa l-makefile. Issa agħti ħarsa lejn l-aħħar isem tal-mira nadif. Huwa biss azzjoni aktar milli fajl fil-mira.

Peress li normalment ma għandna bżonn dan waqt il-kumpilazzjoni, mhuwiex miktub bħala prerekwiżit fi kwalunkwe regola oħra. Miri li ma jirreferux għal fajls iżda huma biss azzjonijiet jissejħu miri foloz. Huma mhux se jkollhom l-ebda prerekwiżiti bħala fajls fil-mira oħra.

B'default make jibda bl-ewwel mira fil-'makefile' u tissejjaħ bħala 'għan default'. Meta wieħed iqis l-eżempju tagħna, għandna l-finali bħala l-ewwel mira tagħna. Peress li l-prerekwiżiti tagħha jinkludu fajls ta’ oġġetti oħra, dawn għandhom jiġu aġġornati qabel ma jinħoloq finali. Kull wieħed minn dawn il-prerekwiżiti huma pproċessati skont ir-regoli tagħhom stess.

Ir-rikompilazzjoni sseħħ jekk ikun hemm modifiki magħmula lill-fajls tas-sors jew lill-fajls header jew jekk il-fajl tal-oġġett ma jeżisti xejn. Wara li tikkompila mill-ġdid il-fajls tal-oġġetti meħtieġa, make jiddeċiedi jekk torbotx mill-ġdid finali jew le. Dan għandu jsir jekk il-fajl finali ma jeżistix, jew jekk xi wieħed mill-fajls tal-oġġett ikun aktar ġdid minnu.

Għalhekk jekk nibdlu l-fajl inter.c, imbagħad meta tħaddem make terġa’ tikkompila l-fajl tas-sors biex taġġorna l-fajl tal-oġġett inter.o u imbagħad link finali.

Fl-eżempju tagħna, kellna nilnutaw il-fajls tal-oġġetti kollha darbtejn fir-regola għal finali kif muri hawn taħt.

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

Sabiex nevitaw tali duplikazzjonijiet, nistgħu nintroduċu varjabbli biex jaħżnu l-lista ta 'fajls ta' oġġetti li qed jintużaw ġewwa l-makefile. Billi nużaw il-varjabbli OBJ nistgħu nikteb mill-ġdid il-kampjun makefilema' wieħed simili muri hawn taħt.

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)

Kif rajna fl-eżempju makefile, nistgħu niddefinixxu regoli biex inaddfu d-direttorju tas-sors billi tneħħi l-fajls tal-oġġetti mhux mixtieqa wara l-kumpilazzjoni. Ejja ngħidu li jiġri li jkollna fajl mira msejjaħ nadif. Kif tista' tagħmel jiddifferenzja ż-żewġ sitwazzjonijiet ta' hawn fuq? Hawnhekk jidħol il-kunċett ta 'miri foloz.

Mira falza hija waħda li mhix verament l-isem ta 'fajl, anzi hija biss isem għal riċetta li għandha tiġi esegwita kull meta ssir talba espliċita mill-makefile. Raġuni ewlenija għall-użu ta 'mira falza hija li jiġi evitat kunflitt ma' fajl bl-istess isem. Raġuni oħra hija li tittejjeb il-prestazzjoni.

Biex nispjega din il-ħaġa, se niżvela twist wieħed mhux mistenni. Ir-riċetta għal nadif mhux se tiġi eżegwita awtomatikament meta tħaddem make. Minflok huwa meħtieġ li tinvoka l-istess billi toħroġ il-kmand tagħmel nadif.

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

Issa ipprova oħloq makefiles għall-bażi tal-kodiċi tiegħek stess. Ħossok liberu li tikkummenta hawn bid-dubji tiegħek.