|
|
Bu makalenin farkl� dillerde bulundu�u adresler: English Castellano Deutsch Francais Nederlands Portugues Russian Turkce |
taraf�ndan Wilbert Berendsen Yazar hakk�nda: Wilbert Berendsen is a profesyonel bir m�zisyen ve co�kulu bir Linux kullan�c�s�.�lk olarak Z80 'ler i�in assembly kodlar�n� k�rd�.Bu g�nlerde t�m �al��malar� i�in Linux kullan�yor. Yaln�zca e�lenmek amac�yla giri� niteli�inde yaz�lar� yaz�yor ve bunlar� k���k g�rsely�resinde anlat�yor: http://www.xs4all.nl/~wbsoft/. Kaynak kodlar� a��k olarak ! ��erik:
|
�zet:
Bu yaz� make'in nas�l �al��t��� ve yaz�l�m geli�tirme alan�nda pek �ok �eyde nas�l kullan�ld��� anlat�l�yor.
Ara s�ra hemen hemen her Linux kullan�c�s�,make'i kullanm��t�r.Bu,bir program veya �ekirdek kaynak kodundan olu�turuldugunda,bir paket kuruldu�unda ve benzeri durumlarda i�ini yapar.'Make' �nemli bir yaz�l�m gelistirme arac�d�r. Bununla beraber,make daha fazla olana�� sa�lar.
Bu yaz�da,g�rece�iz ki;makale veya kitap yazmak ya da g�zel bir g�rsely�re olu�turmak gibi g�nl�k i�lerde,make �ok �nemli bir ara�t�r. Bu sunum s�ras�nda,daha bir �ok 'unix bilgisi' ele al�nacakt�r. Bu hikayenin sonunda,make kullanmak konusunda bir ka� ipucu daha sunulacakt�r. L�tfen dikkat:Biz �u anda Linux hakk�nda konu�uyoruz,fakat make'in kullan�m� her i�letim sisteminde m�mk�nd�r.
D�zen ve i�eri�i birbirinden ay�ran basit bir sisteme gereksinim duyar�z. Etkin ��z�m;sayfa her istendi�inde,i�eri�in veritaban�ndan okunmas�d�r.�rne�in,PHP ve Microsoft Active Server Sayfalar� bu �ekilde �al���r.Bununla beraber,sadece basit HTML(HyperText Markup Language) saklama olana��na sahibiz. Ayr�ca,i�erik veritaban�'n� daha etkili yap�land�rmak i�in de�i�miyor.
Baz� basit komutlar kullan�larak bir g�rsely�re kurulabilir.
Mesela, P�nar sitenin ba�l���n�< i>ba�l�k.htmlye , sayfa altl���n� da altl�k.htmlye koyar. ba�l�k.html ��yle g�r�nebilir:
<html><!-- ba�l�k --> <head> <title>P�nar ve Can'�n yap�m�</title> </head> <body bgcolor="white"> <table border="0" width="100%"><tr> <td bgcolor="#c040ff" valign="top"> Bu bizim web sitemiz.<br> Burda bir tak�m �eyler yaz�yor.<br> Biz �ok sosyaliz.<br> i�te telefon numaram�z:<br> <b>0123-456789</b> </td><td valign="top"> <!-- ��erikleri buraya koy -->Bu da sayfa altl��� altl�k.html:
<!-- sayfa altl��� --> </td></tr></table> </body></html>Can'�n i�erik.html'ini son sayfa olarak,unix komutuyla,yerle�tirilmesinin bir �rne�i:
cat ba�l�k.html /home/can/Docs/g�rsely�re/i�erik.html echo -n '<hr>Son g�ncelleme: ' tarih '+%A %e %B' cat altl�k.htmlL�tfen bu komutlar�n manual sayfalar�na ba�vurun.Yukar�daki komutlar sonucunda;son dosya standard output'a iletilir ve bu bir dosyada tutulur.
{ cat ba�l�k.html /home/can/Docs/g�rsely�re/i�erik.html echo -n '<hr>Son g�ncelleme: ' tarih '+%A %e %B' cat altl�k.html } > /home/p�nar/public_html/i�erik.htmlBu i�lem �teki dosya �neri.html i�in de tekrarlan�r. Asl�nda,g�rsely�remizin i�leyi�ini sa�layacak k���k bir betik (script) yaratm�� olduk.
Bununla beraber,bu komutlar elle �al��t�r�lamaz.Can'�n yapt��� her i�erik de�i�ikli�inde �al��t�r�lan bir kabuk beti�i yaratabiliriz. Ayr�ca,e�er P�nar ba�l��� ve sayfa altl���n� de�i�tirmeye karar verirse de,bu betik �al��t�r�lmal�d�r!Di�er yandan,e�er Can her g�n bir de�i�iklik yapm�yorsa,betik �al��t�r�lmamal�d�r. Linux kullan�yoruz, bu y�zden ak�lc�l bir ��z�m ar�yoruz!
Bu noktada make kendini g�sterir.
Make,hedef dosya ile kaynak dosyan�n zaman-damgas�(time-stamp) �zerine kuruludur ve bir tak�m komutlar dizisinin �al��t�r�l�p �al��t�r�lmayaca��na karar verir.Ba�ka bir deyi�le; herbir kaynak dosyas�, bir hedef dosyaya ihtiya� duyar ve kaynak dosya ,hedef dosyadan daha yeniyse;bir tak�m komutlar dizisi �al��t�r�l�r.Bu komutlar hedef dosyan�n yenilenmesini sa�lar.
Hedef dosya 'hedef'tir , kaynak dosyalar� `�nceden gerekli olan'd�r. (ilk istek). Komutlar,e�er bir '�nceden gerekli olan(prerequisites)'kaynak dosyadan daha yeni ise (veya herhangi bir kaynak dosya yoksa),�al��t�r�l�r. E�er b�t�n bu '�nceden gerekli olan'lar kaynak dosyadan eski veya onunla e�it eskilikte ise ,komutlar �al��t�r�lmaz ve 'hedef' g�ncellenmi� kabul edilir.
�imdi bulunan dizinde,ad� Makefile olan bir dosya yarat�lmal�d�r.Bu dosya make'in i�ini gerekti�i gibi yapabilmesi i�in gerekli olan bilgiyi i�erir.Makefile'� edindikten sonra,yapmam�z gereken tek �ey: 'make' yazmam�z ve yeni bir hedef dosya yarat�lmas� i�in gerekli olan komutlar otomatik olarak �al��t�r�l�r.
Make komutla �a��r�l�r.
make hedef1 hedef2 ....
Hedef iste�e ba�l�d�r(e�er hedef silinirse,Makefiledaki ilk dosya kullan�l�r.). Make her zaman Makefile'� bulunulan dizinde arar.Birden fazla hedef sa�lamak m�mk�nd�r.
# Bu bir Makefile �rne�idir. # Yorumlar '#'i�aretinden sonra yaz�labilir. hedef: �nceden gerekli olan komut hedef: �nceden gerekli olan komut # vs...vs...vs...Hedef ile ba�lad�k,iki nokta �st �ste ile devam ettik (:) ve '�nceden gerekli olan(prerequisites)'a ihtiyac duyduk.Bir�ok '�nceden gerkli olan'�n varl���nda, sat�r� ters slash(\\) ile bitirmek ve di�er sat�rdan devam etmek m�mk�n.
Bir sonraki sat�r(lar)da,bir veya daha fazla komut bulunabilir.Her sat�r tek bir komut olarak d���n�l�r.E�er bir komut i�in birden fazla sat�r kullanmak istiyorsan�z,sat�rlan�r�n sonuna ters slash (\\) koymal�s�n�z.Make onlar� sanki tek bir sat�ra yaz�lm�� gibi ili�kilendirecektir.Bu durumda,�al��t�rma kabuklar�nda meydana gelebilir muhtemel hatalar� �nlemek i�in,komutlar� iki nokta �st �ste (;) ile ay�rmam�z gereklidir.
Not: Komutlar sat�r ba��ndan,8 bo�luk b�rakarak de�il,TAB tu�u ile ayr�lmal�d�r!
Make Makefile'� okuyarak, her bir hedef i�in (ilkinden ba�layarak)komutlar�n �al��t�r�l�p �al��t�r�lmayaca��na karar verir.Her hedef,'�nceden gerekli olan' ve komutlarla beraber 'kural' anlam�na gelir.
E�er Make sorunsuz �al���rsa,sadece ilk hedef �al��t�r�l�r.
# Bu Makefile patates canavar� P�nar ile Can'�n g�rsely�resini kurar. hepsi: /home/p�nar/public_html/i�erik.html /home/p�nar/public_html/�neri.html /home/p�nar/public_html/i�erik.html: ba�l�k.html altl�k.html \ /home/can/Docs/g�rsely�re/i�erik.html { \ cat ba�l�k.html /home/can/Docs/g�rsely�re/i�erik.html ;\ echo -n '<hr>Son g�ncelleme: ' ;\ tarih '+%A %e %B' ;\ cat altl�k.html ;\ } > /home/p�nar/public_html/i�erik.html /home/p�nar/public_html/�neri.html: ba�l�k.html altl�k.html \ /home/can/Docs/g�rsely�re/�neri.html { \ cat ba�l�k.html /home/can/Docs/g�rsely�re/i�erik.html ;\ echo -n '<hr>Son g�ncelleme: ' ;\ tarih '+%A %e %B' ;\ cat altl�k.html ;\ } > /home/p�nar/public_html/�neri.html # son
�imdi,�� hedefimiz var, 'hepsi' ve siteden dosyalar i�erik.html ve �neri.html .'hepsi' hedefinin tek fonksiyonu �teki iki dosyay� '�nceden gerekli olan'olarak alg�lamas�d�r.Bunlar test edilmi�tir.��nk� 'hepsi' tek ba��na bir dosya ismi de�ildir,hedef 'hepsi her zaman �al��t�r�l�r. (Daha sonra,dosya olmayan hedefleri tan�tmak i�in daha ��k bir yol sunaca��z.).
E�er ba�l�k ve sayfa altl��� de�i�tirilmi� ise b�t�n sayfalar g�ncellenecektir.E�er Can sadece bir tane dosyas�n� yenilemi� ise sadece yenilenmi� sayfa g�ncellenecektir.�al��t�r�lan 'make' komutu bu i�i yapar.!!
Tabiki,Makefile'�n bir dezavantaj� var : denetlemek kolay de�il! Neyseki,i�leri kolayla�t�rmak i�in pek �ok yol var!
de�i�ken = de�erDe�i�kene bir ifade at�yoruz.$(variabele).Bunu Makefile i�ine katarsak,daha iyi �u �ekilde g�r�n�r:
# Bu Makefile patates canavar� P�nar ile Can'�n g�rsely�resini kurar. # g�rsely�renin bulundu�u dizin: HEDEFDIR = /home/p�nar/public_html # Can'�n dizini : CANDIR = /home/can/Docs/g�rsely�re # D�zen i�in gerekli dosyalar: D�ZEN = ba�l�k.html altl�k.html hepsi: $(HEDEFDIR)/i�erik.html $(HEDEFDIR)/�neri.html $(HEDEFDIR)/i�erik.html: $(D�ZEN) $(CANDIR)/i�erik.html { \ cat ba�l�k.html $(CANDIR)/i�erik.html ;\ echo -n '<hr>Son g�ncelleme: ' ;\ tarih '+%A %e %B' ;\ cat altl�k.html ;\ } > $(HEDEFDIR)/i�erik.html $(HEDEFDIR)/�neri.html: $(D�ZEN) $(CANDIR)/�neri.html { \ cat ba�l�k.html $(CANDIR)/�neri.html ;\ echo -n '<hr>Son g�ncelleme: ' ;\ tarih '+%A %e %B' ;\ cat altl�k.html ;\ } > $(HEDEFDIR)/�neri.html # sonDe�i�kenler i�in b�y�k harf kullanmak iyi bir al��anl�kt�r.�imdi,de�i�iklik daha kolay.
E�er isterseniz,do�ru d�zen elde etmek i�in tan�mlanm�� ba�ka bir method daha var.E�er b�t�n dokumanlar ayn� ��kt�ya konmas� gerekiyorsa ne yapmal�y�z?�ok fazla tekrar, Makefile'�n boyutunu �okca b�y�tebilir. Bu da basitle�tirilebilir.
E�er model kuralar kullan�l�yorsa,sat�rlar�n yap�s� bir tane daha model eleman� eklenerek de�i�ecektir:
�oklu hedef: model : �nceden gerekli olan �nceden gerekli olan... komutModel,b�t�n hedefler uygulanabilecek bir ifade olmal�d�r.y�zde i�areti(%)de�i�ken b�l�mleriyle hedef isimleri birbirinden ay�rmak i�in kullan�l�r.
Bir �rnek:
/home/bla/hedef1.html /home/bla/hedef2.html: /home/bla/% : % komutlarMake bunu okurken ikisat�ra geni�letir ve iki sat�rm�� gibi alg�lar.Burda model hedef ismin hangi y�zde i�areti ile ili�kili oldu�una karar verir.
�nceden gerekli olanlar k�sm�ndaki y�zde i�aretleri ise y�zde i�aretleri ile kopyalanan b�l�mleri yerine kullan�l�r.
Make yukar�dakini �u �ekilde geni�letir:
/home/bla/hedef1.html: hedef1.html komutlar /home/bla/hedef2.html: hedef2.html komutlar`/home/bla/%' modelindeki y�zde i�areti, `/home/bla/hedef1.html' hedefiyle `hedef1.html'de�erini al�r,b�ylelikle �nceden gerekli olan `%' `hedef1.html'e geni�letilmi� olur.
Bizim �rnek g�rsely�remiz i�in,a�a��daki komutlar kullan�lmal�d�r:
$(HEDEFDIR)/i�erik.html $(HEDEFDIR)/�neri.html: $(HEDEFDIR)/% : $(CANDIR)/% \ $(D�ZEN)Geriye bir tek bu de�i�kenleri komutlar�m�zda nas�l kullanabiliriz sorusu kald�. Hedefler komutlardan biraz daha farkl�.
�zel de�i�ken $\ , ilk gerekli olan� i�aret etmekte kullan�l�r ve $@ de�i�keni o anki dizine geni�letir.
Bu de�i�kenleri kullanarak,a�a��daki tamamlanm�� kurallara ula�mak m�mk�n:
$(HEDEFDIR)/i�erik.html $(HEDEFDIR)/�neri.html: $(HEDEFDIR)/% : $(CANDIR)/% \ $(D�ZEN) { \ cat ba�l�k.html $< ;\ echo -n '<hr>Son g�ncelleme: ' ;\ tarih '+%A %e %B' ;\ cat altl�k.html ;\ } > $@��te,bu tek sat�rl�k fonksiyonlar her bir dosya i�in ge�erli!
Daha fazla tutarl�l�k i�in Makefile ,daha �ok olumlu y�n sunmaktad�r:
# Bu Makefile'� patates canavar� P�nar ile Can'�n g�rsely�resini kurar. # g�rsely�renin bulundu�u dizin: HEDEFDIR = /home/p�nar/public_html # Can'�n dizini: CANDIR = /home/can/Docs/g�rsely�re # D�zen i�in gerekli dosyalar: D�ZEN = ba�l�k.html altl�k.html # Web sayfas�: DOCS = $(HEDEFDIR)/i�erik.html $(HEDEFDIR)/�neri.html # L�tfen a�a��daki sat�rdan sonras�n� de�i�tirmeyin:-) ) # ------------------------------------------------------------- hepsi: $(DOCS) $(DOCS): $(HEDEFDIR)/% : $(CANDIR)/% $(D�ZEN) { \ cat ba�l�k.html $< ;\ echo -n '<hr>Son g�ncelleme: ' ;\ tarih '+%A %e %B' ;\ cat altl�k.html ;\ } > $@ # sonG�r�nmesi gerekti�i gibi olmaya ba�l�yor.E�ger daha fazla dok�man eklenirse,daha fazla yazmaya gerek kalmadan, DOCS de�i�keniyle Makefile'da bunlar� ili�kilendirmek m�mk�n.
Sonunda,nas�l �al��t��� hakk�nda hi� bir sorusu kalmadan Makefile'�n nas�l kolayl�kla �al��t���n� g�rebiliriz!
TEXTS = i�erik.html �neri.html veba�kabirdosya.html # L�tfen a�a��daki sat�rdan sonras�n� de�i�tirmeyiniz;-) # ------------------------------------------------------------- DOCS = $(addprefix $(HEDEFDIR)/,$(TEXTS)) hepsi: $(DOCS) # vs..vs..Burda g�rd���m�z de�i�kenler yerine kullanabilece�imiz bir make fonksiyonudur,parantezler aras�na tamamlanm�� ifadeler koymak m�mk�n.Bu �ekilde texts'i birden fazla yolla ifade etmek de m�mk�n.
$(addprefix prefix,list) �zel komutu sat�rdaki t�m elemanlar� birbirine bir �nekmi� gibi ekler.Bu �rnekte,HEDEFDIR de�i�keninin i�eri�i art� slashdir.
Listelenmi� ara�lar bo�luk(space)larla birbirinden ayr�l�r.Bu sebepten dolay�,make komutlar�yla ,dosya ad�nda bo�luk olan dosyalar� i�leme sokmak iyi bir fikir de�ildir.
Eklemek gerekirse:ba�ta da belirtti�imiz gibi 'hepsi' hedefi 'hepsi' ad�nda bir dosya yaratmaz ve sonu� olarak da,bu hedef her zaman �al��t�r�l�r.<Tesad�fen> ayn� ad� ta��yana ve di�erlerinden yeni olan bir dosyan�n varl��� s�z konusu oldu�unda ne olur..?
Bunu make'e anlatman�n ve hedefin hard diskte belli bir dosya belirtmemesini, belli bir hedefin s�rekli �al��t�r�lmas�n� sa�layan kolay bir yolu var.Bunu sa�lamak i�in;hedef 'phony' (ger�ek de�il) olarak tan�mlan�r.Ve ��yle yap�l�r:
.PHONY: hepsi�imdi t�m Makefile ��yle g�z�k�r:
# Bu Makefil'� patates canavar� P�nar ve Can'�n g�rsely�resini kurar. # g�rsely�renin bulundu�u dizin: HEDEFDIR = /home/p�nar/public_html # Can'�n dizini: CANDIR = /home/can/Docs/g�rsely�re # D�zen i�in gerekli dosyalar: D�ZEN = ba�l�k.html altl�k.html # Websayfas�n� isimleri: TEXTS = i�erik.html �neri.html veba�kabirdosya.html # L�tfen a�a��daki sat�rdan sonras�n� de�i�tirmeyiniz;-) # ------------------------------------------------------ DOCS = $(addprefix $(HEDEFDIR)/,$(TEXTS)) .PHONY: hepsi hepsi: $(DOCS) $(DOCS): $(HEDEFDIR)/% : $(CANDIR)/% $(D�ZEN) { \ cat ba�l�k.html $< ;\ echo -n '<hr>Son g�ncelleme: ' ;\ tarih '+%A %e %B' ;\ cat altl�k.html ;\ } > $@ # sonBu dosyay� saklay�n ve unutun!Bu andan itibaren,websayfan�z� olu�turmak ve d�zeni i�erikten tamamen ay�rmak m�mk�n!
�rne�in,yarat�lm�� bir dok�man�n bir hataya sebep olmas� o kadar da kolay de�il:E�er Can yanl��l�kla makalesin </body></html> �eklinde isimlendirirse bu P�nar'�n yapt��� altl���n pek �ok browser taraf�ndan g�sterilememesine neden olur. Bununla beraber, Can textlerini LyXda veya lyx2html gibi bir program kullanarak yazm�� da olabilir.�e�itli olanaklar vard�r!
Resimlerin web dizinine ta��nma m�mk�nl���n� hen�z konu�mad�k.Bu i�lemi otomatikle�tirmekte m�mk�n!
Bu �rnekte, P�nar Can'�n g�rsely�re dizini okuma hakk�na sahip olmal�d�r.Bu i�in ilgin� yan� �ok b�y�k d�zenlemelere uygulanabilir olmas�d�r.P�nar'�n d�nyan�n bir ucundan login olmas� veya NFS arac�l��� ile kendi dizinini kurmas� bile m�mk�n.Tek ki�i taraf�ndan y�r�t�len �al��malar� da bu �ekilde olu�turmmak m�mk�n.
Sonunda,Makefile prensibini a��kl��a kavu�turmu� ve iyi bir Makefile yaz�ld���nda g�nl�k i�lerimizi ne kadar kolayl��t�rd���n� g�rm�� olduk!
'Phony' hedefler kullanmak(.PHONY: hedef),basit fonksiyonlar� paketlemekte kolayl�k sa�lar.�rnek olarak,Linux �ekirdek konfig�rasyonu verilebilir.
Make menuconfig yaz�lmas� interaktif bir men� ile konfig�rasyonunu ba�lat�r.Make xconfig yaz�lmas� X alt�nda Tcl/Tk aray�z� olu�turarak konfig�rasyonu ba�lat�r.
Yukar�da bahsettiklerimizin ger�ek bir �ekirdek olu�turulmas� ile hi�bir ilgisi yoktur.Bunlar ,�ekirdek konfig�rasyonu gibi gerekli fonkrsiyona basit bir aray�z olu�turur.
A�a��daki PHONY hedeflerle bir Makefile yaratmal�s�n�z.
Bu yolla,yeni elde edilmi� HTML dosyas�n�n d�zenini iyile�tirmek i�in bir text dosyas�ndan HTML �retmek m�mk�n.Bir �rnek:
TEMPLATE = layout1/Template1.txt /home/httpd/sales/sales.html: sales.html $(TEMPLATE) perl Scripts/BuildPage.pl -template $(TEMPLATE) $< > $@-new mv -f $@-new $@ sales.html: sales.txt aptconvert -toc $@ $<Template1.txt dosyas� de�i�ti�inde yeni dosyan�n nas�l g�ncellenece�ine dikkat ediniz.
E�er bir komut '@' i�aretinden sonra geliyorsa make taraf�ndan sergilenmez:
hedef: �nceden gerekli olan @cc -o hedef �nceden gerekli olanE�er bir komut '-' ile ba�larsa,make i�lemi bu komut bir sorun ��kar�rsa sona ermeyecektir.(mesela olmayan bir dosyan�n silinmesi.):
.PHONY: clean clean: -rm -r $(tempdir)Make install gibi belli make komutlar�n�n ne yapt���n� g�rmek fakat �al��t�r�lmas�n� �nlemek istiyorsan�z; -n opsiyonunu kullan�n:
wilbert@nutnix:~ > make -n install install -m 755 program /usr/local/bin install -m 644 program.1 /usr/local/man/man1 wilbert@nutnix:~ >
E�er herhangi bir kabuk veya dosya ad� olarak dolar i�areti kullanman�z gerekiyorsa ($$) �ift dolar i�areti kullan�n:
# Bir Makefile # Bunu evde denemeyin!:-) source = menu.txt help.txt target: $(source) for i in $(source) ;\ do \ if [ "$$i" = "menu.txt" ] ;\ then \ doThis $$i ;\ else \ doThat $$i ;\ fi ;\ done > targetMake bu komutlar� �al��t�rmak i�in kabu�a g�ndermeden �nce,kendi de�i�kenlerini ve �ift dolar i�aretlerini tek dolara �evirir.
info makeTabiki,GNU Make Manual'�na GNOME ve KDE yard�mc� browserlar�n�n yan� s�ra elle tkinfo program�yla ula�abilirsiniz.
Make hakk�nda daha fazla bilgi bulabilece�iniz linkler:
|
G�rsely�re sayfalar�n�n bak�m�, LinuxFocus Edit�rleri taraf�ndan yap�lmaktad�r
© Wilbert Berendsen, FDL LinuxFocus.org Buray� klikleyerek hatalar� rapor edebilir ya da yorumlar�n�z� LinuxFocus'a g�nderebilirsiniz |
�eviri bilgisi:
|
2001-08-03, generated by lfparser version 2.17