Usa ka Mubo nga Pasiuna sa Makefiles sa Open Source Software Development uban sa GNU Make


Ang GNU Make kay usa ka development utility nga nagdeterminar sa mga bahin sa usa ka partikular nga code base nga i-compile ug maka-issue og mga command para sa pagbuhat sa maong mga operasyon sa code base. Kining partikular nga make utility mahimong gamiton sa bisan unsang programming language basta ang ilang compilation mahimo gikan sa shell pinaagi sa pag-isyu og mga command.

Aron magamit ang GNU Make, kinahanglan nga adunay pipila ka hugpong sa mga lagda nga naghubit sa relasyon sa lainlaing mga file sa among programa ug mga mando alang sa pag-update sa matag file. Gisulat kini sa usa ka espesyal nga file nga gitawag og 'makefile'. Ang ‘make‘ nga sugo naggamit sa ‘makefile‘ data base ug ang kataposang mga panahon sa pag-usab sa mga file aron sa pagdesisyon kon asa ang tanang mga file i-compile pag-usab.

Mga sulod sa usa ka Makefile

Sa kasagaran ang 'makefiles' adunay 5 ka matang sa mga butang nga mao ang: implicit rules, explicit rules, variable definitions, directives, ug comments.

  1. Usa ka tin-aw nga lagda nagtino kon unsaon paghimo/paghimo pag-usab sa usa o daghan pang mga file (gitawag nga mga target, ipatin-aw sa ulahi) ug kanus-a buhaton ang sama.
  2. Usa ka implicit nga lagda nagtino unsaon paghimo/paghimo pag-usab sa usa o daghan pa nga mga file base sa ilang mga ngalan. Gihubit niini kung giunsa ang usa ka target nga ngalan sa file adunay kalabotan sa usa ka file nga adunay ngalan nga parehas sa target.
  3. Ang variable definition maoy usa ka linya nga nagtakda ug string value para sa variable nga ilisan unya.
  4. Ang
  5. Usa ka direktiba usa ka instruksyon para sa paghimo sa pagbuhat ug butang nga espesyal samtang nagbasa sa makefile.
  6. Ang '#' nga simbolo gigamit nagrepresentar sa pagsugod sa usa ka comment sulod sa makefiles. Usa ka linya nga nagsugod sa ‘#’ kay gibalewala lang.

Ang impormasyon nga nagsulti sa make unsaon pag-recompile og sistema gikan sa pagbasa sa data base nga gitawag og makefile. Ang yano nga makefile maglangkob sa mga lagda sa mosunod nga syntax:

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

Ang usa ka target gihubit nga mao ang output file nga gihimo sa programa. Kini mahimo usab nga phony target, nga ipasabut sa ubos. Ang mga pananglitan sa mga target file naglakip sa mga executable, object file o phony nga mga target sama sa clean, install, uninstall etc.

Ang prerequisite kay usa ka payl nga gigamit isip input sa paghimo sa target files.

Ang usa ka resipe mao ang aksyon nga paghimo sa paghimo sa target nga payl base sa gikinahanglan. Kinahanglang ibutang ang tab nga karakter sa dili pa ang matag resipe sulod sa makefiles gawas kon atong ipiho ang '.RECIPEPREFIX' nga baryable aron ipasabot ang ubang karakter isip prefix sa resipe.

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

Sa pananglitan sa ibabaw gigamit namo ang 4 C source files ug duha ka header files para sa paghimo sa executable final. Dinhi ang matag '.o' nga file usa ka target ug usa ka kinahanglanon sa sulod sa makefile. Karon tan-awa ang katapusang target nga ngalan limpyo. Kini usa lamang ka aksyon kaysa usa ka target nga file.

Tungod kay sa kasagaran dili nato kinahanglan kini sa panahon sa paghugpong, wala kini gisulat isip kinahanglanon sa bisan unsang ubang mga lagda. Ang mga target nga wala magtumong sa mga file apan mga aksyon lang gitawag nga phony target. Wala silay bisan unsang kinahanglanon sama sa ubang mga target nga file.

Sa default make nagsugod sa unang target sa 'makefile' ug gitawag nga 'default nga tumong'. Sa pagkonsiderar sa among panig-ingnan, kami adunay katapusan ingon among una nga target. Tungod kay ang mga kinahanglanon niini naglakip sa uban pang mga file sa butang nga kinahanglan i-update sa dili pa maghimo katapusan. Ang matag usa niini nga mga kinahanglanon giproseso sumala sa ilang kaugalingon nga mga lagda.

Mahitabo ang pag-recompilation kung adunay mga pagbag-o nga gihimo sa gigikanan nga mga file o mga file sa header o kung wala gyud ang object file. Human ma-compile pag-usab ang gikinahanglan nga mga file sa butang, ang make mohukom kung i-link ba pag-usab ang final o dili. Kinahanglang buhaton kini kung wala ang file nga final, o kung adunay bisan unsang mga file nga butang nga mas bag-o kaysa niini.

Busa kon usbon nato ang payl inter.c, unya sa pagpadagan sa make kini mag-recompile sa source file aron ma-update ang object file inter.o ug dayon isumpay ang katapusan.

Sa among panig-ingnan, kinahanglan namon nga ilista ang tanan nga mga file sa butang kaduha sa lagda alang sa katapusan sama sa gipakita sa ubos.

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

Aron malikayan ang ingon nga mga pagdoble, mahimo namon nga ipaila ang mga variable aron itago ang lista sa mga file nga butang nga gigamit sa sulod sa makefile. Pinaagi sa paggamit sa variable OBJ mahimo natong isulat pag-usab ang sample nga makefile ngadto sa susama nga gipakita sa ubos.

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)

Sama sa among nakita sa pananglitan nga makefile, mahimo namon nga ipasabut ang mga lagda sa paglimpyo sa gigikanan nga direktoryo pinaagi sa pagtangtang sa dili gusto nga mga file sa butang pagkahuman sa pagtipon. Ibutang ta nga adunay usa ka target file nga gitawag og limpyo. Unsaon pagpaghimog kalainan ang duha ka sitwasyon sa ibabaw? Dinhi moabut ang konsepto sa mga phony nga target.

Ang usa ka phony nga target mao ang usa nga dili gyud ngalan sa usa ka file, hinoon kini usa lamang ka ngalan alang sa usa ka resipe nga ipatuman kung adunay usa ka klaro nga hangyo nga gihimo gikan sa makefile. Usa ka nag-unang rason sa paggamit sa phony target mao ang paglikay sa usa ka panagbangi sa usa ka file sa sama nga ngalan. Ang laing rason mao ang pagpalambo sa performance.

Aron ipasabut kini nga butang, akong ipadayag ang usa ka wala damha nga twist. Ang resipe alang sa limpyo dili ipatuman pinaagi sa default sa pagpadagan sa make. Hinoon gikinahanglan nga gamiton ang parehas pinaagi sa pag-isyu sa sugo nga make clean.

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

Karon sulayi paghimo og makefiles para sa imong kaugalingong code base. Mobati nga gawasnon sa pagkomento dinhi sa imong mga pagduhaduha.